我使用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'))
答案 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_split
,min_samples_leaf
,min_weight_fraction_leaf
,max_features
,max_leaf_nodes
来控制树的深度。
随机森林的记忆当然可以由整体中的树木数量控制。