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

54

我正在使用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提供来克服这个问题呢?我在这里找到了一些参数(链接),例如最小样本分割和最小样本叶片,但我不太明白如何调整它们。

先行致谢!


你试过使用ExtraTreesClassifier吗?如果你有多个预测器,那会很有帮助。如果你只训练一个预测器并且只有200个样本,我认为你总是会有一定程度的过拟合。 - BrenBarn
2
你的测试准确率方差很大,但样本集非常小。如果你想表达过拟合是训练/测试准确率之间的巨大差异,那么这不是过拟合:考虑使用最近邻算法,你将始终得到0的训练误差。(因此,在这里训练准确性没有意义。) - Falcon
你是说你正在尝试仅使用“价格”来预测“质量”吗?如果是这样,那么随机森林并不是最好的选择。建议尝试逻辑回归分类器。 - denson
如果您实际上有多个X变量用于预测“质量”,并且您的类别不平衡(类别0比类别1多或反之),那么尝试在交叉验证期间使用StratifiedShuffleSplit。 - denson
2个回答

130

对于数据集的大小,我同意@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算法一次性搜索这些参数。


9
一份绝妙的答案。我的唯一补充是,现代超参数调整引入了更好的方法,超越了网格搜索和随机搜索。贝叶斯优化和Hyperband是其中的两种技术。一般来说,连续减半技术已被证明表现良好。 - Dave Liu

1

如果有帮助到其他人,我想在最后补充一下这个评论。

除了上面提到的参数(n_estimatorsmax_featuresmax_depthmin_samples_leaf),还要考虑设置“min_impurity_decrease”。

手动完成这项任务很繁琐。所以使用sklearn.model_selection.GridSearchCV来测试一系列参数(参数网格)并找到最佳参数。

您可以使用'gini'或'entropy'作为标准,但我建议使用默认值'gini'。在大多数情况下,它们产生相同的结果,但计算'entropy'的成本更高。

Max depth是一种有效的停止树生长的直观方法,但仅因为一个节点小于最大深度并不总是意味着它应该分裂。如果从分裂中获得的信息只解决了单个/少量错误分类,则分裂该节点可能会支持过度拟合。您可能会发现此参数对您的数据集大小和/或特征空间大小和复杂性是否有用而有所不同,但在调整参数时考虑它是值得的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接