添加功能会导致更糟糕的结果

数据挖掘 xgboost 特征工程 模型选择 gbm
2021-09-30 08:46:07

我有一个包含 20 个变量和约 50K 观察值的数据集,我使用这 20 个变量创建了几个新功能。

我比较了 GBM 模型的结果(使用 python xgboost 和 light GBM),我发现模型的超参数是什么并不重要,“更薄”的版本会导致更好的结果(AUC),即使所有 20原始变量包含在更广泛的版本中。

当我使用套索模型进行比较时 - 更广泛的版本更好(约高 1%),正如预期的那样。

我想这可能与 GBM 中的随机性有关,但我很惊讶地看到 GBM 并没有一路修复它。

对现象的任何解释将不胜感激。

2个回答

简而言之,xgboost 试图修复它,虽然它在摆脱过度拟合方面非常好,但它并不完美。

添加新功能并不总是有益的,因为您增加了搜索空间的维度,从而使问题变得更加困难。在您的特定情况下,增加的复杂性超过了额外功能的附加值。

我知道您已经测试了相当广泛的超参数和足够的组合。如果您通过colsample_bytree和/或colsample_bylevel应用正则化,则可能在某个阶段随机选择的列(特征)的信息量低于原始特征,并且算法被迫使用这些特征进行进一步的拆分。这对你有意义吗?

添加功能的数量可能至关重要,如果相对于原来的 20 个功能太高,新功能就会变得太占优势。例如,如果添加一些具有高基数的名义特征,然后对这些特征进行虚拟编码,则可能会发生这种情况。

为了使用更广泛的数据改进结果,您可能希望使用控制早期停止的参数并更早地停止拟合。

编辑

我最后一个建议的基本原理是:我认为在更广泛的数据集上性能下降是由于过度拟合,即测试数据集上的性能明显低于训练数据上的性能。提前停止应该防止/控制过度拟合,但在你的情况下它似乎没有那么好,因此应该改进。

您可以而且应该测试新功能的不同组合,但值得信赖的质量指标对于模型选择至关重要。如果你显着过拟合,训练数据(甚至交叉验证)的性能将无法帮助你选择在测试数据集上性能良好的模型(或特征组合)。

欢迎来到本站!

如果我正确理解了您的问题,您想知道为什么添加新功能时模型的性能会更差?

因此,每次进行特征工程(添加新列、派生列、标准化数据、规范化数据等)时,总会有硬币的另一面。如果您添加一些特征,并且如果这些特征解释了目标变量的某些内容,那么它将有助于提高准确性;另一方面,如果特征与目标变量没有太大关系,那么它无助于提高准确性。

现在,在进行建模之前,您可以完成一些事情,例如(假设您已经完成了所有这些事情):

  1. 使用业务理解消除不必要的功能
  2. 去除异常值
  3. 估算缺失数据(XGBoost 不容易出现缺失值)
  4. 标准化数据
  5. 与目标变量以及变量内部的相关性分析,如果变量之间存在高度相关性(因为您需要自变量),则排除与目标变量关系不大的变量。

完成上述步骤后,您可以获得一个可以很好地解释数据的模型。为了提高准确性,您需要做更多的特征工程,并尝试找出是否有一些外部因素可能会影响您的模型。

模型不能正常工作的原因有很多。上述某些内容可能是您的模型在您的场景中表现不佳的原因。仔细看看数据——这可能会给你一个更好的主意。这是顶级视图。