我有一个包含约 30k 个样本和 35 个特征的数据集(在特征选择之后;这些似乎是该数据集最重要的特征,并且它们之间的相关性很低)。
在对超参数使用 10 倍 CV 进行网格搜索后,令我惊讶的是,当 colsample_bytree 为每棵树仅采样 1 个特征时,我得到了最低的验证错误!(编辑:实际上,每棵树采样 2 个特征,它的效果会稍微好一些 - 但如果我增加每棵树采样的特征数量,性能会越来越差)。每棵树的深度为 3,我正在建造 2000 棵树。也就是说,对于每棵树,随机选择一个特征,然后 xgboost 尝试仅使用该特征来拟合残差。
这似乎很不寻常。我该如何解释这个?如果我的树中有特征交互,我会开始过度拟合吗?但是我希望深度为 1 的树的性能和没有特征子采样的性能一样好,但他们没有。事实上,在网格搜索中,几乎所有具有这种极端特征子采样的模型都比没有特征子采样的模型做得更好。
编辑:是否有可能我有一些非常适合训练集但泛化能力很差的特征,并且这种单独的特征采样有助于避免这些特征主导模型?我正在努力看看这可能意味着什么。
Edit2:尝试删除单个特征,性能没有提高,这表明我之前编辑的假设不太可能。另一方面,我发现最佳性能实际上是当我对每棵树采样 2 个特征时。至少现在我的功能正在交互,但我仍然不确定如何解释这种性能提升。
Edit3:这篇论文有点相关,但不是真的。在随机森林中,特征子采样的最佳设置通常是特征数量的平方根:S. Bernard 等人的“超参数对随机森林准确性的影响”。al., 2009。更容易理解为什么它在随机森林中更有用,然而,随机森林依赖于树的可变性,不适合 XGBoost 等残差。