使用 XGBoost 时特征工程仍然有用吗?

数据挖掘 xgboost 特征工程
2021-09-21 02:00:42

我正在阅读与 XGBoost 相关的材料。似乎这种方法不需要任何变量缩放,因为它是基于树的,而且这种方法可以捕获复杂的非线性模式、交互。它可以处理数值变量和分类变量,而且冗余变量似乎对这种方法影响不大。

通常,在预测建模中,您可能会在您拥有的所有特征中进行一些选择,也可以从您拥有的特征集中创建一些新特征。所以选择一个特征子集意味着你认为你的特征集有一些冗余;从当前功能集中创建一些新功能意味着您对当前功能进行一些功能转换。那么,这两点都应该包含在 XGBoost 中。那么,是不是说要使用 XGBoost,只需要明智地选择那些调优参数呢?使用 XGBoost 进行特征工程有什么价值?

4个回答

让我们定义第一个特征工程:

  1. 特征选择
  2. 特征提取
  3. 通过领域专业知识添加功能

XGBoost 为您执行 (1)。XGBoost 不会为您执行 (2)/(3)。

所以你仍然需要自己做特征工程。只有深度学习模型才能代替您的特征提取。

  1. 特征选择:XGBoost 将特征选择提升到一个级别。根据我的经验,我总是通过一轮 xgboost 进行特征选择,其参数与我用于最终模型的参数不同。我通常使用较低的数字进行行和特征采样,树不深,只保留进入模型的特征。然后用另一个模型微调。当特征数量非常多时,这可以防止我过度拟合。
  2. 特征生成:XGBoost(分类,booster=gbtree)使用基于树的方法。这意味着模型很难为特征ab挑选诸如aba/ba+b的关系。我通常手动添加特征之间的交互,或者通过一些启发式方法选择正确的交互。根据应用程序,这可以真正提高性能。

使用 XGBoost 进行特征工程有什么价值?

性能可能吗?

(请注意,我们不使用 XGBoost,而是使用另一个梯度提升库 - 尽管 XGBoost 的性能可能还以某种方式取决于数据的维度。)

我们有一个数据集,其中每个项目由 3 个信号组成,每个信号长 6000 个样本——即 18k 个特征。直接使用这些特征需要很长时间(几天),因此我们进行了一些手动特征工程,将特征数量减少到 200 个左右。现在训练(包括参数调整)只需几个小时。

为了比较:不久前,我们还开始使用相同的数据和整个 18k 特征(无特征工程)训练 ConvNet。仅经过大约 2 小时的训练,它们就达到了与梯度提升模型相同的准确度。

该问题的经验答案是查看公开的 kaggle 竞赛/笔记本(请参阅此处),其中 xgboost 被大量用作表格数据问题的最新技术

毫无疑问,答案是肯定的。值得注意的是,在比赛中,特征工程是与其他人产生差异的主要方式(其次可能是参数调整)。如果每个人都在同一个 xgboost 模型中转储相同的数据集,他们将得到相同的结果。

我认为这可以重述为数据科学“没有免费的午餐定理”使用相关的 XGBoost 库安装 R / Python 相当容易。但是,如果处理数据科学问题这么容易,那么任何人都可以做到,并且不会有那么多人在数据科学领域进行培训或工作。一般来说,这意味着数据科学有你需要处理的困难部分。特征工程是数据科学中没有通用解决方案的难点之一。