关于xgboost中的过拟合问题的讨论


20

我的设置如下:

我正在遵循“应用的预测建模”中的指导原则。因此,我过滤了相关功能并得出以下结果:

  • 训练集中的4900个数据点和测试集中的1600个数据点。
  • 我有26个功能,目标是一个连续变量。

我使用5倍交叉验证来训练使用该caret软件包的模型。当我应用MARS模型时,在训练集和测试集上我得到的平均绝对误差(MAE)约为4。

但是,使用xgboost(树算法或线性算法),在训练集上得到的像是0.32(!),在测试集上得到的像是2.4。

因此,如果测试误差是训练误差的8倍,那么我会说:我已经过度拟合了训练数据。无论如何,我仍然在测试中遇到了一个较小的错误。

我在xgboost上使用以下参数:

  • nrounds = 1000eta = 0.01(增加nrounds和减少eta可能有所帮助,但我的内存不足并且运行时间太长)
  • max_depth = 16:如果我比较其他帖子和默认帖子6,则看起来很大,但问题非常复杂-在这种情况下,也许16不太大。
  • colsample_bytree = 0.7subsample = 0.8并且min_child_weight = 5:这样做,我尝试减少过拟合。

如果我减小max_depth,则训练和测试误差会更接近,但仍然存在较大的差距,并且测试误差会更大(略高于3)。

使用线性助推器,我得到最佳参数的大致相同的训练和测试误差:

  • lambda = 90 和`alpha = 0:通过交叉验证发现,lambda应该防止过拟合。
  • colsample_bytree = 0.8subsample = 0.8并且min_child_weight = 5:这样做,我尝试减少过拟合。

我的感觉是xgboost仍然过拟合-但训练错误以及据我在实时测试中看到的(我已经使用过xgboost模型,并且实际上已经将它们集成了4天了)看起来还不错(错误是大于测试误差,但现实生活中有关特征和其他变量的预测存在更多不确定性。

您如何看待:如果(如果可能的话)现实生活中的表现优越,我可以接受过拟合吗?我的设置中的xgboost是否趋于过度拟合?

Answers:


34

过度拟合是否如此糟糕,以至于即使测试误差较小,您也不应选择过度拟合的模型?不。但是您应该有选择它的理由。

此行为不仅限于XGBoost。它是所有机器学习技术中的共同点。在欠拟合和过拟合之间找到正确的权衡。正式定义是偏差方差折衷(Wikipedia)

偏差方差权衡

以下是偏置方差折衷的简化,以帮助证明选择模型的合理性。

  • 我们说,如果模型无法充分利用数据中的信息,则存在较高的偏见。它过于依赖一般信息,例如最常见的情况,响应的平均值或很少的强大功能。偏差可能来自错误的假设,例如假设变量为正态分布或模型为线性。

  • 我们说,如果模型使用了来自数据的过多信息,则该模型具有较高的方差。它依赖于仅在已经提供给它的训练集中才有意义的信息,而这种信息不能一概而论。通常,如果更改训练集,则模型将发生很大变化,因此称为“高方差”。

这些定义与欠拟合和过拟合的定义非常相似。但是,这些定义通常过于简化而不能相反,例如

  • 如果训练和测试误差都很高,则该模型不合适。这意味着该模型过于简单。
  • 如果测试误差高于训练误差,则模型过拟合。这意味着该模型过于复杂。

这些简化当然会有所帮助,因为它们有助于选择合适的模型复杂性。但是他们忽略了一个重要的观点,即几乎每个模型都具有偏差和方差成分这一事实。欠拟合/过拟合的描述告诉您,您的偏见过多/差异太大,但您(几乎)总是同时拥有两者

如果您想了解有关偏差方差折衷的更多信息,它们是很多有用的可视化工具,可以通过Google获得很好的资源。每台机器学习教科书都会有一个关于偏差方差折衷的部分,这里有一些

  • 统计学习简介和统计学习要素(在此处可用)
  • 模式识别和机器学习,克里斯托弗·毕晓普(Christopher Bishop)。
  • 机器学习:概率视角,作者:Kevin Murphy。

另外,斯科特·福特曼·罗Scott Fortmann-Roe)的《了解偏差-方差权衡》也是一篇不错的博客文章,对我有帮助。

适用于您的问题

所以你有两个模型

火车MAE测试MAE火星4.04.0低方差,较高偏见XGBoost0.32.4方差更高,偏见更低

你需要选一个 为此,您需要定义什么是更好的模型。决策中应包括的参数是模型的复杂性和性能。

  • 您愿意将多少个“单位”的复杂性换成一个“单位”的性能?
    • 复杂度越高,方差越大。如果您希望模型在与您所训练的数据集略有不同的数据集上很好地概括,则应该降低复杂性。
    • 如果您想要一个易于理解的模型,则可以通过降低模型的复杂性而以牺牲性能为代价。
    • 如果你是在一个数据集,你瞄准了最佳的性能认识来自于比你的训练集相同生成过程中,可以以优化您的测试误差,并以此作为度量操作的复杂性。当您从较大的集合中随机采样训练集,并且您的模型将应用于该集合时,就会发生这种情况。例如,在大多数Kaggle比赛中就是这种情况。

这里的目标不是找到“不会过度拟合”的模型。就是要找到具有最佳偏差方差权衡的模型。在这种情况下,我认为XGBoost模型实现的偏差减少足以证明方差增加。

你能做什么

但是,您可能可以通过调整超参数来做得更好。

  • 有可能增加回合次数并降低学习率。关于梯度增强的“怪异”之处在于,将其很好地运行到训练误差已经达到零的点似乎仍然可以改善测试误差(如此处所讨论:仅当浅浅时好时才更深吗?)。设置其他参数后,您可以尝试在数据集上对模型进行更长的训练,

  • 您所种树木的深度是一个很好的起点。您必须注意,对于每个深度单位,将要构造的叶子数量加倍。如果要种植2号而不是16号的树,则需要1个/214的时间!您应该尝试种植更多的小树。原因是树的深度应表示要素交互的程度。这可能是行话,但是如果您的要素具有3的交互度(大致:4个要素的组合比这些要素3的组合+第四个要素的强大程度更强),则生长大于3的树木是有害。深度为三的两棵树比深度为四的一棵树具有更大的泛化能力。这是一个相当复杂的概念,我现在不再赘述,但是您可以从本文收集中开始。另外,请注意,深树会导致高方差!

  • 使用二次采样(称为装袋)可以极大地减少方差。如果您的单个树具有较高的方差,则套袋将对这些树进行平均,并且该平均值的方差小于单个树。如果在调整树的深度之后仍然遇到高方差,请尝试增加子采样(即减少使用的数据的比例)。特征空间的二次采样也可以达到这个目的。


1
一个人不应该说“谢谢”,而对于这个漫长而有趣的回答,我想说“谢谢”。我领导对您编写的某些东西有一些了解,但这确实很好地结合在一起。我将介绍您的一些参考资料并种下新树,也许还会再发表评论。现在:谢谢!大!
Ric)2016年

互动页面的链接 stat.columbia.edu/~jakulin/Int非常棒!
Ric 2016年

我听取了您的建议,将树木的深度限制为3,但使用了1200左右,因此结果感觉很棒:计算速度非常快,训练和测试之间的差异减少了,但仍处于良好水平。故事的其余部分在这里:stats.stackexchange.com/questions/205858/…–
Ric
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.