如何提高Scikit-learn回归和Pandas的速度/性能?
今天我在玩一个很棒的工具叫做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
。祝你好运!