如何提高Scikit-learn回归和Pandas的速度/性能?

1 投票
1 回答
2451 浏览
提问于 2025-04-18 13:18

今天我在玩一个很棒的工具叫做Scikit-learn。我正在从一些面板中提取x的数据,这些面板是沿着次轴切割的,而y的数据则是从DataFrame的列中切割出来的。目前我在进行无休止的循环,有没有懂得.apply()的高手能告诉我怎么加快这个过程吗?

from pandas import *
import numpy as np
from sklearn import linear_model
np.random.seed(247)
x = Panel(np.random.rand(3,25,10))
y = y = DataFrame(np.random.rand(25,5))
r2 = Series(index=y.columns)
for i in y.columns:
    X = x.ix[:,:,i]
    Y = y.ix[:,i]
    r2.ix[i] = linear_model.LinearRegression().fit(X,Y).score(X,Y)

In [325]: r2
Out[325]: 
0    0.061945
1    0.091734
2    0.004635
3    0.015835
4    0.027906
dtype: float64

我的想法是想把这个函数(或者类似的函数)按列应用。我尝试过用.apply(),但是因为这是一个双重(或者三重)函数调用,比如说f1.().f2(x,y)或者f1.().f2(x,y).f3(x,y),所以出现了错误。任何建议都会非常感激,我觉得这段代码如果能解决问题会非常有用!

1 个回答

1

你可以尝试并行计算。这并不是说你的代码变得“更好”了,但肯定会让事情变得更快。就像下面这样……

代码:

#!/usr/bin/env python

import pandas as pd
import numpy as np
from sklearn import linear_model
from multiprocessing import Pool
import time

np.random.seed(247)
x = pd.Panel(np.random.rand(3, 25, 2000000))
y = pd.DataFrame(np.random.rand(25, 1000000))

def main(i):
    X = x.ix[:,:,i]
    Y = y.ix[:,i]
    r2 = linear_model.LinearRegression().fit(X, Y).score(X, Y)
    return r2

if __name__ = '__main__':
    start_time = time.time()

    p = Pool()
    result = p.map(main, range(1000000))
    print result[:2]  # print first 2 r2's

    end_time = time.time()
    print 'Iterations took %f seconds.' % (end_time - start_time)

输出:

[0.07197, 0.24436]
"Iterations took 159.226 seconds."

我运行了一百万次回归分析,正如你所看到的,这大约花了2.5分钟。这个时间会根据你电脑的核心数量而有所不同。result会是你得分的列表,这样你就可以轻松地在你的例子中重现r2 Series。祝你好运!

撰写回答