【问题标题】:How do I solve overfitting in random forest of Python sklearn?如何解决 Python sklearn 随机森林中的过拟合问题?
【发布时间】:2013-12-26 03:05:41
【问题描述】:

我正在使用 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,但我不太明白如何调整它们。

提前致谢!

【问题讨论】:

  • 您是否尝试过使用 ExtraTreesClassifier?如果您有多个预测变量,这将有所帮助。如果你只训练一个预测器并且你只有 200 个样本,我认为你总是会有某种程度的过拟合。
  • 您的测试准确度差异很大,但您的样本集非常小。如果您打算建议 overfitting 作为训练/测试准确性的最大差异,即 not 过拟合:考虑使用最近邻,训练错误总是会得到 0。 (所以训练精度在这里没有意义。)
  • 您是说您试图仅使用“价格”来预测“质量”吗?如果是这样,那么随机森林不是最好的方法。尝试逻辑回归分类器。
  • 如果您实际上有多个 X 变量用于预测“质量”并且您的类别不平衡(class= 0 多于 class= 1,反之亦然)然后尝试在交叉验证期间使用 StratifiedShuffleSplit .

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


【解决方案1】:

我同意@Falcon w.r.t.数据集大小。主要问题很可能是数据集的小规模。如果可能的话,您能做的最好的事情是获取更多数据,数据越多(通常)越不可能过度拟合,因为随着数据集大小的增加,看起来具有预测性的随机模式开始被淹没。

也就是说,我会查看以下参数:

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

在做这项工作时要注意科学。使用 3 个数据集、一个训练集、一个单独的“开发”数据集来调整您的参数,以及一个使用最佳参数测试最终模型的测试集。一次只更改一个参数并评估结果。或者尝试使用 sklearn 网格搜索算法一次搜索所有这些参数。

【讨论】:

  • 一个惊人的答案。我唯一的补充是,现代超参数调优引入了网格和随机搜索之外的更好方法。贝叶斯优化和超频带是两种这样的技术。通常,已发现连续减半技术表现良好。
【解决方案2】:

添加这个迟到的评论以防它帮助其他人。

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

手动执行此操作很麻烦。所以用sklearn.model_selection.GridSearchCV测试一系列参数(参数网格),找到最优参数。

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

最大深度效果很好,是一种阻止树生长的直观方法,但是,仅仅因为节点小于最大深度并不总是意味着它应该分裂。如果从拆分中获得的信息仅解决一个/几个错误分类,那么拆分该节点可能会支持过度拟合。根据数据集的大小和/或特征空间的大小和复杂性,您可能会也可能不会发现此参数有用,但在调整参数时值得考虑。

【讨论】:

    猜你喜欢
    • 2017-04-28
    • 2016-03-01
    • 2020-03-26
    • 2017-05-14
    • 2019-04-11
    • 2021-02-08
    • 2016-07-23
    • 2021-02-22
    • 2020-06-24
    相关资源
    最近更新 更多