我正在使用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_split
、min_samples_leaf
、min_weight_fraction_leaf
、max_features
、max_leaf_nodes
。
随机森林的记忆当然可以通过集合中的树木数量来控制。