XGBoost 特征子采样

机器算法验证 分类 过拟合 超参数 装袋 助推
2022-04-09 05:17:11

我有一个包含约 30k 个样本和 35 个特征的数据集(在特征选择之后;这些似乎是该数据集最重要的特征,并且它们之间的相关性很低)。

在对超参数使用 10 倍 CV 进行网格搜索后,令我惊讶的是,当 colsample_bytree 为每棵树仅采样 1 个特征时,我得到了最低的验证错误!(编辑:实际上,每棵树采样 2 个特征,它的效果会稍微好一些 - 但如果我增加每棵树采样的特征数量,性能会越来越差)。每棵树的深度为 3,我正在建造 2000 棵树。也就是说,对于每棵树,随机选择一个特征,然后 xgboost 尝试仅使用该特征来拟合残差。

这似乎很不寻常。我该如何解释这个?如果我的树中有特征交互,我会开始过度拟合吗?但是我希望深度为 1 的树的性能和没有特征子采样的性能一样好,但他们没有。事实上,在网格搜索中,几乎所有具有这种极端特征子采样的模型都比没有特征子采样的模型做得更好。

编辑:是否有可能我有一些非常适合训练集但泛化能力很差的特征,并且这种单独的特征采样有助于避免这些特征主导模型?我正在努力看看这可能意味着什么。

Edit2:尝试删除单个特征,性能没有提高,这表明我之前编辑的假设不太可能。另一方面,我发现最佳性能实际上是当我对每棵树采样 2 个特征时。至少现在我的功能正在交互,但我仍然不确定如何解释这种性能提升。

Edit3:这篇论文有点相关,但不是真的。在随机森林中,特征子采样的最佳设置通常是特征数量的平方根:S. Bernard 等人的“超参数对随机森林准确性的影响”。al., 2009。更容易理解为什么它在随机森林中更有用,然而,随机森林依赖于树的可变性,不适合 XGBoost 等残差。

1个回答

你似乎微调了错误的东西。

关于您的功能选择:我认为这样做不正确:

  • 您删除了好的特征和所有线性相关的特征。这很好,但高阶相关特征仍然存在。另一方面,强相关性并不总是意味着该特征是无用的。
  • 所以你应该将好的特征保留在集合中,并删除所有无用的特征。目标是最终仍然保持高分。通过这种方式,您可以确保不会像您注意到的那样删除好的特征,因为分数会降低。
  • 你应该训练一个好的模型(至少偶尔一次),以便知道哪些特征是有用的。

对于超参数优化:

  • 您应该在开始时修复一些变量(除 n_estimators 之外的所有变量),使用更细粒度的网格(例如,从 10 到 500,以 20 为步长)优化(粗略)该参数。
  • 我的一般怀疑:对于许多估计器来说,学习率低(在这个阶段)和浅(将深度设置为 6)。尝试以下方法:

    • η = 0.2
    • n_estimators = [50...400]
    • 子样本 = [0.8]
    • 深度 = 6

    其余的保持原样。当然,这些在很大程度上取决于数据。

可以在这里找到 XGBoost 超参数优化的一个很好的指南。

所以我建议你重做特征选择,保留集合中的好的特征,有时通过优化它来使用好的 XGBoost 配置。不要忘记创建一个小的保留集,您不会在特征选择中使用它。这可以用于到底知道真正的表现。