关于 xgboost 中过拟合的讨论

机器算法验证 机器学习 助推 过拟合
2022-01-30 06:52:10

我的设置如下:

我遵循“应用预测建模”中的指导方针。因此,我过滤了相关特征并最终得到以下结果:

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

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

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

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

我在 xgboost 上使用以下参数:

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

如果我减少 max_depth ,那么训练和测试错误会更接近,但仍然存在很大差距并且测试错误更大(略高于 3)。

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

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

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

你怎么看:如果(如果可能的话)现实生活中的表现更好,我能接受过拟合吗?我的设置中的 xgboost 是否倾向于过度拟合?

1个回答

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

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

偏差-方差权衡

以下是偏差方差权衡的简化,以帮助证明您的模型选择的合理性。

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

  • 我们说,如果模型使用来自数据的过多信息,则模型具有高方差。它依赖于仅与提供给它的训练集中相关的信息,这不能很好地概括。通常,如果您更改训练集,模型会发生很大变化,因此称为“高方差”。

这些定义与欠拟合和过拟合的定义非常相似。但是,这些定义通常过于简化而无法对立,例如

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

这些简化当然是有帮助的,因为它们有助于选择模型的正确复杂性。但是他们忽略了一个重要的点,即(几乎)每个模型都有偏差和方差分量。欠拟合/过拟合的描述告诉你,你有太多的偏差/太多的方差,但你(几乎)总是两者都有

如果您想了解有关偏差-方差权衡的更多信息,它们是很多有用的可视化和可通过 google 获得的良好资源。每本机器学习教科书都会有一个关于偏差-方差权衡的部分,这里有一些

  • 统计学习简介和统计学习要素(可在此处获得)
  • 模式识别和机器学习,克里斯托弗·毕晓普。
  • 机器学习:概率视角,凯文·墨菲(Kevin Murphy)。

此外,帮助我掌握的一篇不错的博文是Scott Fortmann-Roe 的理解偏差方差权衡

适用于您的问题

所以你有两个模型,

Train MAETest MAEMARS4.04.0Low variance, higher bias,XGBoost0.32.4Higher variance, lower bias,

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

  • 你愿意用多少“单位”的复杂性来换取一个“单位”的性能?
    • 更高的复杂性与更高的方差相关联。如果您希望您的模型在与您训练过的数据集略有不同的数据集上很好地泛化,您应该以降低复杂性为目标。
    • 如果您想要一个易于理解的模型,则可以通过降低模型的复杂性以牺牲性能为代价。
    • 如果您的目标是在您知道来自与训练集相同的生成过程的数据集上获得最佳性能,您可以操纵复杂性以优化您的测试错误并将其用作指标。当您的训练集是从一个较大的集合中随机抽取的,并且您的模型将应用于该集合时,就会发生这种情况。例如,大多数 Kaggle 比赛就是这种情况。

这里的目标不是找到一个“不会过拟合”的模型。它是找到具有最佳偏差-方差折衷的模型。在这种情况下,我认为 XGBoost 模型实现的偏差减少足以证明方差增加是合理的。

你能做什么

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

  • 增加轮数和降低学习率是可能的。关于梯度提升的“奇怪”之处在于,在训练误差达到零的点之后运行它似乎仍然可以改善测试误差(如这里所讨论的:只有当浅层好时才更好?)。一旦你设置了其他参数,你可以尝试在你的数据集上训练你的模型多一点时间,

  • 你种植的树木的深度是一个很好的起点。您必须注意,对于每一个深度单位,要构建的叶子数量增加一倍。如果你要种植 2 号而不是 16 号的树,则需要1/214的时间!你应该尝试种植更多的小树。原因是树的深度应该代表特征交互的程度这可能是行话,但是如果您的特征的交互程度为 3(粗略地说:4 个特征的组合并不比这些特征中的 3 个 + 第 4 个特征的组合更强大),那么生长大于 3 的树是有害的。两棵深度为 3 的树比一棵深度为 4 的树具有更强的泛化能力。这是一个相当复杂的概念,我现在不会深入探讨,但您可以先查看这个论文集另外,请注意,深度树会导致高方差!

  • 使用称为bagging的二次抽样非常有助于减少方差。如果您的单个树的方差很大,则 bagging 将对树进行平均,并且平均值的方差小于单个树。如果在调整树的深度后仍然遇到高方差,请尝试增加子采样(即减少使用的数据比例)。特征空间的二次采样也实现了这个目标。