Python Scikit学习随机森林内存错误

Python Scikit学习随机森林内存错误,python,python-2.7,scikit-learn,Python,Python 2.7,Scikit Learn,我正在尝试在mnist手写数字数据集上运行scikit learn random forest算法。在算法训练过程中,系统会出现内存错误。请告诉我如何解决此问题 CPU统计信息:配备4GB RAM的英特尔酷睿2双核处理器 数据集的形状是60000784。linux终端上的完整错误如下所示: > File "./reducer.py", line 53, in <module> > main() File "./reducer.py", line 38, in

我正在尝试在mnist手写数字数据集上运行scikit learn random forest算法。在算法训练过程中,系统会出现内存错误。请告诉我如何解决此问题

CPU统计信息:配备4GB RAM的英特尔酷睿2双核处理器

数据集的形状是60000784。linux终端上的完整错误如下所示:

> File "./reducer.py", line 53, in <module>
>     main()   File "./reducer.py", line 38, in main
>     clf = clf.fit(data,labels) #training the algorithm   File "/usr/lib/pymodules/python2.7/sklearn/ensemble/forest.py", line 202,
> in fit
>     for i in xrange(n_jobs))   File "/usr/lib/pymodules/python2.7/joblib/parallel.py", line 409, in
> __call__
>     self.dispatch(function, args, kwargs)   File "/usr/lib/pymodules/python2.7/joblib/parallel.py", line 295, in
> dispatch
>     job = ImmediateApply(func, args, kwargs)   File "/usr/lib/pymodules/python2.7/joblib/parallel.py", line 101, in
> __init__
>     self.results = func(*args, **kwargs)   File "/usr/lib/pymodules/python2.7/sklearn/ensemble/forest.py", line 73, in
> _parallel_build_trees
>     sample_mask=sample_mask, X_argsorted=X_argsorted)   File "/usr/lib/pymodules/python2.7/sklearn/tree/tree.py", line 476, in fit
>     X_argsorted=X_argsorted)   File "/usr/lib/pymodules/python2.7/sklearn/tree/tree.py", line 357, in
> _build_tree
>     np.argsort(X.T, axis=1).astype(np.int32).T)   File "/usr/lib/python2.7/dist-packages/numpy/core/fromnumeric.py", line
> 680, in argsort
>     return argsort(axis, kind, order) MemoryError
>文件“/reducer.py”,第53行,在
>main()文件“/reducer.py”,第38行,在main中
>clf=clf.fit(数据、标签)#训练算法文件“/usr/lib/pymodules/python2.7/sklearn/employ/forest.py”,第202行,
>合拍
>对于xrange(n_jobs))文件“/usr/lib/pymodules/python2.7/joblib/parallel.py”中的i,第409行,在
>打电话__
>self.dispatch(function、args、kwargs)文件“/usr/lib/pymodules/python2.7/joblib/parallel.py”,第295行,在
>派遣
>job=ImmediateApply(func、args、kwargs)文件“/usr/lib/pymodules/python2.7/joblib/parallel.py”,第101行,在
>_uuuinit__
>self.results=func(*args,**kwargs)文件“/usr/lib/pymodules/python2.7/sklearn/employ/forest.py”,第73行,在
>并行树
>sample_mask=sample_mask,X_argsorted=X_argsorted)文件“/usr/lib/pymodules/python2.7/sklearn/tree/tree.py”,第476行,适合
>X_argsorted=X_argsorted)文件“/usr/lib/pymodules/python2.7/sklearn/tree/tree.py”,第357行,在
>_构建_树
>np.argsort(X.T,axis=1).astype(np.int32.T)文件“/usr/lib/python2.7/dist-packages/numpy/core/fromnumeric.py”,第行
>680,在argsort
>返回argsort(轴、种类、顺序)内存错误

设置
n_jobs=1
或升级到最新版本的scikit learn。问题是当前发布的版本使用多个进程并行拟合树,这意味着数据(
X
y
)需要复制到这些进程中。下一个版本将使用线程而不是进程,因此树学习者共享内存。

Scikit learn-Dev团队在
.ensemble
方法上大大改进了内存管理和性能 在充分尊重其他观点的情况下,
scikit learn 0.16.1
并没有证明自己拥有一些早期版本引用的“讨厌的”
y
副本

由于其他一些原因,我花了相当长的时间研究了
RandomForestRegregator()
超参数的环境,包括它们的内存占用问题

截至
0.16.1
,在默认的
n_jobs=1
{2,3,…}
的基础上,并行joblib内存需求的增加不到2%

最近发布的
scikit-learn
版本@glouppe的共同创始人,包括与基于R的和其他已知的随机森林框架的比较

IMHO,第25+页谈到了提高速度的技术,包括
np.asfortranarray(…)
,但在我看来(没有任何实验证据)这些技术只是Scikit学习开发团队内部共享的内部方向,而不是对我们这些生活在“外部世界”的凡人的推荐

回归还是分类? 是的,这很重要。如果不进行全面的功能集向量打包,可能需要进行一些额外的功能工程工作和测试。您的学员似乎是分类器案例,因此请深入了解:

  • 试验
    max_功能的非默认设置
  • 使用O/S服务处理较大的虚拟内存
    mkswap
    +
    swapon
    ,如果在1中调整学习者后需要的话
  • 补遗 在另一轮测试之后,出现了一个有趣的观察结果

    .set_参数(n_jobs=-1).fit(X,y)
    配置成功地用于训练
    随机森林回归器()
    时,丑陋的惊喜随后出现,有一次尝试在这种预先训练过的对象上使用
    .predict(X_-observed)

    报告了类似的map/reduce绑定内存问题(现在为0.17.0)


    尽管如此,同样的
    .set_参数(n_jobs=1)。predict(X_observed)
    单独的作业在
    .predict()
    上得到了很好的应用。一个解决方案是使用最新版本(0.19)的scikit learn。在变更日志中,他们在中提到(事实上,有一个重大改进):

    您可以使用以下方法安装此版本:

    pip3 install scikit-learn==0.19.0
    

    请用一棵树训练随机森林,并检查树的深度。默认情况下,完整的树在scikit learn中生长。深度可能非常大,因此即使森林中的几棵树也可以使用大量内存。您可以尝试使用
    max\u depth
    hyper参数限制树的深度


    当我将树的深度从42(森林中树的平均深度)减少到6时,我运行。内存减少了66倍,而性能稍好(约4%)。

    创建RandomForest时使用的参数是什么?我只是使用n_估计器=10尝试设置
    n_作业=1
    我尝试添加n_作业=1,但仍然得到相同的错误。您能提供一些方法让我可以使用新版本的scikit learn吗?@Piyush如果您在
    n_jobs=1
    中出现此错误,那么升级将无济于事。
    X
    最初是否为
    np.float32
    格式?它是Fortran命令的(主要列)?
    pip3 install scikit-learn==0.19.0