在进行随机森林或梯度提升时,特征工程重要吗?

机器算法验证 机器学习 随机森林 特征工程 助推
2022-03-26 13:40:07

对于线性模型(如线性回归、逻辑回归等),特征工程是提高模型性能的重要步骤。我的问题是,如果我们在使用随机森林或梯度提升的同时进行任何特征工程,这有关系吗?

当然,这些模型不是深度学习模型。但是,似乎某些特征工程方法并没有真正改善模型。例如:我在做一个二分类问题,它包含大约200个特征,其中20个是分类特征。我做了以下事情:

  1. 基准测试:直接在原始数据上运行随机森林分类器。我得到的AUC在0.93左右,precision,recall & F-score在0.95左右(我说的是左右,因为应用了statifiedKfold验证,结果变化很小)

  2. 我通过卡方检验和 ANOVA f1 检验降低了特征维度,运行模型。结果几乎相同:AUC 约为 0.93,准确率、召回率和 F 分数约为 0.95

  3. 然后我对所有分类特征进行热键,然后重新运行模型,结果仍然几乎相同:AUC 约为 0.93,精度、召回率和 F-score 约为 0.95

  4. 然后应用截断的 SVD 进一步减少特征,并重新训练模型,结果仍然没有变化......

  5. 最后我添加了多项式项,剩余特征的交叉项。结果还是没变……

请问有什么建议吗?谢谢你。

4个回答

人们普遍认为,特征工程在使用相对先进的算法(如 GBM 或随机森林)时可以改善结果。有几个原因,与整体准确性和可用性有关。首先,如果您真的想使用该模型,功能将需要维护和实施,并且通常需要向用户解释。也就是说,每个额外的功能都会产生额外的工作。因此,出于实际目的,消除对提高准确性没有实质性贡献的特征很有用。

就整体准确性而言,附加特征和/或设计不佳的特征会增加您在噪声而非信号上训练模型的可能性。因此,使用领域知识或数据检查来建议设计特征的替代方法通常会改善结果。kaggle 博客 - blog.kaggle.com - 包括每场比赛中登上领奖台的人写的“他们是如何做到的”。这些通常包括对特征工程的描述——可以说比模型调整的描述更频繁,强调特征工程的重要性——其中一些非常有创意,包括利用竞赛组织者提供的或在竞赛中发现的领域知识。

最近的这篇文章是一个很好的例子,说明在比赛中获得的领域知识被用来选择/设计特征https://medium.com/kaggle-blog/2017-data-science-bowl-predicting-lung-cancer-2nd- place-solution-write-up-daniel-hammack-and-79dc345d4541(标题为“预处理”和“外部数据”的部分提供了很好的示例)。

是的,很多,注意到这一点的最好方法是参加 kaggle 比赛。您会看到很多用户使用相同的模型(主要是梯度提升和堆叠),但特征工程和选择确实可以在排行榜得分前 5% 和前 20% 之间产生差异。

但是您还必须检查特征的共线性,有时添加太多相关的特征会降低模型的准确性。

您还需要微调您的超参数,这可以显着提高您的模型分数。

毕竟,如果您的模型没有改进,那么您使用的算法很可能不适合您的问题。如果一种算法很流行,并不意味着它适用于所有类型的问题。

假设您使用树作为助推器单元(每次迭代时拟合的模型),确实一些相对简单的变换,如严格单调的变换(例如平方、缩放、ln 等)对结果没有影响,因为树对这种变换是不变的。此外,创建变量之间的交互并没有太大帮助,因为树可以固有地对交互进行建模(前提是您允许树足够深)。查看Elements of Statistical Learning的第 352 页(第 10.7 节)了解更多详细信息。

但是,我希望您描述的相当复杂的转换会对结果产生总体影响。

特征选择会对您的测试错误产生巨大影响——某些特征不能泛化——它们会改善训练错误,但将它们包含在模型中会对测试错误产生不利影响。我发现您有时可以通过使用递归过程来显着减少测试损失,该过程选择与当前最佳模型的残差具有最高等级相关性的特征(从从目标中减去平均值后的残差开始为初始模型),将其添加到模型中,拟合然后计算测试集的损失。如果损失增加,我会放弃该功能,否则将其添加到功能集中。重复这个过程通常会得到一个比让 GBRT 使用所有可用功能更好的模型(虽然这很耗时)