【问题标题】:Random Forest: Running out of memory随机森林:内存不足
【发布时间】:2015-03-02 21:35:21
【问题描述】:

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

【问题讨论】:

  • 您使用的是哪个版本的 scikit-learn? 0.15 版在森林中的内存消耗方面有一些重大改进。
  • '0.15.2'。我尝试切换到按顺序构建的 GBRT,但不知何故它也耗尽了内存。这是否意味着我真的需要尝试在 EC2 集群上运行或进行随机抽样?
  • @AndreasMueller:感谢关于 Advanced Sklearn 的有用演讲。也许我可以从那里尝试一些想法。我没有机会阅读 ogrisel 的 EC2 并行 ML 教程。我想知道我们还需要考虑旋转 EC2 集群吗?
  • 很高兴你喜欢它。正如@Timo 建议的那样,您需要调整参数才能在此框上工作。我会推荐一些正则化,例如“max_depth”或“max_leaf_nodes”。这应该会大大减少内存消耗,或者减少 n_estimators。另一种选择是切换到 GradientBoostingClassifier,您可能需要更少或更少的深度估计器,但它在训练中是连续的。
  • 什么时候去ec2?如果您从较低的“max_depth”和“n_estimators”开始,它将在您的笔记本电脑上运行。绘制更多估计器或更深的树如何提高准确性。如果看起来它会随着内存的增加而改善更多,或者如果需要很长时间,请考虑 ec2。顺便说一句,尝试 ec2 既便宜又容易。

标签: scikit-learn random-forest


【解决方案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(处理速度提高两倍)。

【讨论】:

【解决方案2】:

我正在处理〜4MB数据集和随机森林,从Scikit-Seather,默认的超参数是〜50MB(所以超过10次)。通过设置max_depth = 6内存消耗减少66次。浅随机林对我数据集的性能改进! 我在博客post中写下了这个实验。

从我的经验中,在回归任务的情况下,内存使用量可以增长得多,因此控制树深是重要的。树深可以直接用@ 987654323或调整控制:min_samples_splitmin_weight_fraction_leafmax_featuresmax_leaf_nodes

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

【讨论】:

    猜你喜欢
    • 2015-12-13
    • 2017-05-14
    • 2019-09-05
    • 2015-08-26
    • 2017-03-15
    • 2019-02-19
    • 1970-01-01
    • 2014-08-07
    • 2015-10-15
    相关资源
    最近更新 更多