随机森林:内存不足

时间:2015-01-05 10:50:42

标签: scikit-learn random-forest

我使用scikit-learn Random Forest来拟合训练数据(~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'))

2 个答案:

答案 0 :(得分:2)

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

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(处理速度提高两倍)。

答案 1 :(得分:0)

我正在处理大约4MB的数据集,而来自scikit-learn的具有默认超参数的Random Forest是大约50MB(因此是数据的10倍以上)。通过设置max_depth = 6,内存消耗减少了66倍。我的数据集上浅层随机森林的性能得到了改善! 我在博客post中写下了这个实验。

根据我的经验,在执行回归任务的情况下,内存使用量可能会更多,因此控制树的深度非常重要。可以直接通过max_depth或通过调整min_samples_splitmin_samples_leafmin_weight_fraction_leafmax_featuresmax_leaf_nodes来控制树的深度。

随机森林的记忆当然可以由整体中的树木数量控制。