随机森林:内存不足



我正在使用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'))

最好的选择是调整参数。

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

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

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

随机森林的记忆当然可以通过集合中的树木数量来控制。

相关内容

  • 没有找到相关文章

最新更新