如何在 xgboost 的每次增强迭代期间更改数据集特征?

How can I change data set features during each boosting iteration in xgboost?

我正在尝试复制本文中的算法 - https://www.ii.pwr.edu.pl/~tomczak/PDF/[MZSTJT].pdf

按照我的理解,我需要:

  1. 使用初始数据集训练基础学习器。
  2. 从经过训练的模型中获取特征的重要性并通过阈值去除不重要的特征(例如所有分割的至少 5%)。
  3. 根据其他人的 f 分数(拆分数)做出简单的概率分布。
  4. 使用此分布对两个特征进行替换采样,并在它们之间进行随机数学运算(+、-、*、/)(示例:f1*f2)。重复几次。
  5. 将生成的新特征添加到新数据集中。
  6. 使用新数据集训练下一个基础学习器,该数据集包含上次迭代中最重要的特征加上新生成的特征。

我正在使用 xgboost 的 Python API。有没有办法在迭代之间控制 Dmatrix,以便我可以添加新功能?


据我所知,这是不可能开箱即用的。问题是集成中的每棵树都有不同的特征,算法不是针对这些特征而设计的(据我所知)。

您可以改为使用 Dmatrix 训练模型,进行特征选择/生成并创建一个包含新特征的新 Dmatrix 并训练新的提升树模型。

只要浏览一下论文,我会说他们提出的主要是我上面的建议。它们不包括以前的基础学习器的新功能,基本上学习器可以是任何模型(这可能只是梯度提升树最近表现得非常好——除了 CNN)。他们算法的结果只是一组 "base" 个模型。他们称它为增强树的集合体(所以是集合体的集合体)。

他们的方法主要是普通特征选择程序的包装变体,特殊之处在于他们还创建了合成特征。

顺便说一句,他们的结果看起来并不那么好,当然它很重要,但没有提供足够的数据。您也可以使用原始的 XGBoost 算法,并且很可能不会在现实世界的性能方面变得更糟(只是我的两分钱)。