2015-01-05 349 views
1

我使用scikit-learn随机森林来适应训练数据(〜30mb),我的笔记本电脑不断崩溃运行出应用程序内存。测试数据比训练数据大几倍。使用Macbook Air 2GHz 8GB内存。随机森林:内存不足

有什么办法解决这个问题?

rf = RandomForestClassifier(n_estimators = 100, n_jobs=4) 
print "20 Fold CV Score: ", np.mean(cross_validation.cross_val_score(rf, X_train_a, y_train, cv=20, scoring='roc_auc')) 
+0

您正在使用哪个版本的scikit-learn?版本0.15在林中的内存消耗方面有一些重大改进。 –

+0

'0.15.2'。我尝试切换到按顺序构建的GBRT,不知何故,它也耗尽了内存。这是否意味着我真的需要尝试在EC2群集上运行或进行随机抽样? – ananuc

+0

@AndreasMueller:感谢您对Advanced Sklearn的有益探讨。也许我可以从那里尝试一些想法。我没有机会通过ogrisel的EC2平行ML教程。我想知道我们需要考虑旋转EC2集群的哪一点? – ananuc

回答

1

你最好的选择是调整参数。

n_jobs=4 

这使得计算机同时计算四个列车测试周期。不同的Python作业在不同的进程中运行,因此整个数据集也被复制。尝试减少n_jobs为2或1以节省内存。 n_jobs==4使用四次内存n_jobs==1使用。

cv=20 

这将数据分成20块,代码进行20次训练测试迭代。这意味着训练数据是19个原始数据的大小。您可以将其安全地降至10,但您的准确度估计可能会变得更糟。它不会节省太多内存,但会使运行时更快。

n_estimators = 100 

减少这将节省很少的内存,但它会使算法运行得更快,因为随机森林将包含更少的树。总结起来,我建议将n_jobs降低为2来节省内存(运行时增加2倍)。为了补偿运行时间,我建议将cv更改为10(运行时节省2倍)。如果这没有帮助,请将n_jobs更改为1,并将估算器的数量减少到50(处理速度提高两倍)。