如何在Python sklearn的随机森林中解决过度拟合问题?

Mun*_*ong 27 python machine-learning decision-tree random-forest scikit-learn

我正在使用python sklearn包中实现的RandomForestClassifier来构建二进制分类模型.以下是交叉验证的结果:

Fold 1 : Train: 164  Test: 40
Train Accuracy: 0.914634146341
Test Accuracy: 0.55

Fold 2 : Train: 163  Test: 41
Train Accuracy: 0.871165644172
Test Accuracy: 0.707317073171

Fold 3 : Train: 163  Test: 41
Train Accuracy: 0.889570552147
Test Accuracy: 0.585365853659

Fold 4 : Train: 163  Test: 41
Train Accuracy: 0.871165644172
Test Accuracy: 0.756097560976

Fold 5 : Train: 163  Test: 41
Train Accuracy: 0.883435582822
Test Accuracy: 0.512195121951
Run Code Online (Sandbox Code Playgroud)

我使用"价格"功能来预测"质量",这是一个序数值.在每个交叉验证中,有163个训练样例和41个测试示例.

显然,过度拟合发生在这里.那么sklearn提供的任何参数都可以用来克服这个问题吗?我在这里找到了一些参数,例如min_samples_split和min_sample_leaf,但我不太明白如何调整它们.

提前致谢!

Sim*_*mon 58

我同意@Falcon和数据集的大小.主要问题可能是数据集的小尺寸.如果可能的话,你可以做的最好的事情是获得更多的数据,越多的数据(通常)就越不可能过度拟合,因为随着数据集大小的增加,出现预测性的随机模式开始被淹没.

那就是说,我会看下面的参数:

  1. n_estimators:@Falcon错误,一般来说树越多,算法过度拟合的可能性就越小.所以试着增加这个.该数字越小,模型越接近决策树,具有受限制的特征集.
  2. max_features:尝试减少此数字(尝试30-50%的功能).这决定了每棵树随机分配的特征数.越小,越不可能过度拟合,但太小将开始在拟合下引入.
  3. max_depth:试验一下.这将降低学习模型的复杂性,降低拟合风险.尝试从5-10开始,然后增加你获得最好的结果.
  4. min_samples_leaf:尝试将此值设置为大于1的值.这与max_depth参数具有类似的效果,这意味着一旦叶子具有该数量的样本,分支将停止分裂.

注意做这项工作要科学.使用3个数据集,一个训练集,一个单独的"开发"数据集来调整您的参数,以及一个使用最佳参数测试最终模型的测试集.仅一次更改一个参数并评估结果.或者尝试使用sklearn gridsearch算法一次性搜索这些参数.

  • 一个惊人的答案。我唯一的补充是,现代超参数调整引入了超越网格和随机搜索的更好方法。贝叶斯优化和超频带就是两种这样的技术。一般来说,连续减半技术已被发现表现良好。 (4认同)