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

时间:2013-12-09 04:40:18

标签: python machine-learning scikit-learn decision-tree random-forest

我使用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

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

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

提前致谢!

1 个答案:

答案 0 :(得分:49)

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

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

  1. n_estimators:@Falcon是错误的,一般来说算法过多的不太可能的树越多。所以尝试增加。该数字越小,模型越接近决策树,具有受限制的特征集。
  2. max_features:尝试减少此数字(尝试30-50%的功能)。这决定了每棵树随机分配的特征数。越小,越不可能过度拟合,但太小将开始在拟合下引入。
  3. max_depth:试验一下。这将降低学习模型的复杂性,降低拟合风险。尝试小一点,比如5-10,然后增加你得到最好的结果。
  4. min_samples_leaf:尝试将此值设置为大于1的值。这与max_depth参数具有类似的效果,这意味着一旦叶子具有该样本数量,分支将停止分裂。
  5. 注意做这项工作时要科学。使用3个数据集,一个训练集,一个单独的“开发”数据集来调整您的参数,以及一个使用最佳参数测试最终模型的测试集。仅一次更改一个参数并评估结果。或者尝试使用sklearn gridsearch算法一次性搜索这些参数。