如何将“树增强”与数据驱动的损失函数一起使用

数据挖掘 机器学习 随机森林 决策树 xgboost 损失函数
2021-10-09 03:40:40

我们有一个具有数据驱动(非分析)损失函数的问题。我们的目标包含 0 到 20 之间的整数(目标本质上是离散的),尽管更大的值是可能的,只是在我们的数据集中不存在。在使用 XGBoost 等算法时,我们有一个非常精确的损失函数这一事实给我们留下了一些严重的问题:

损失函数通常是非凸的。它不容易用凸函数拟合,因为它的形状是数据驱动的,并且可以变化很大。例如,这意味着对于远离拟合良好的函数部分的预测,不可避免地会给予较大的惩罚,而无需较大的惩罚。如果我们用插值代替拟合,粗麻布可能是负数(见附图),这是确定叶子权重的问题(对吧?)。

从上到下:表现较好的损失函数之一的插值示例,具有梯度和粗麻布。

我们认为我们可以调整类似 XGBoost 算法(我使用这个算法作为例子,因为我对论文和 API 都很熟悉),通过用蛮力方法替换它对梯度 en hessian 的依赖来找到最佳叶重和最佳增益。然而,这将大大减慢算法的速度,也许是严重的。

我的问题是:在现有算法中处理复杂损失函数的默认方法是什么?是适合处理这些问题的算法吗?您还有什么可以解决上述问题的建议吗?

提前致谢。

2个回答

首先是一些先前和已知的声明(您可能已经知道)。

Metric是我们想要优化的。

优化损失是模型优化的。

显然,我们希望 Metric 和优化损失相同,但这总是不可能的。如何处理?

  • 运行正确的模型。一些模型可以优化不同的损失函数。在 XGBoost 的情况下,您有两个损失函数,一个是决策树,一个是提升函数。

  • 预处理目标并优化另一个指标,例如将目标转换为目标的对数,然后在该空间中应用已知的损失函数

  • 优化另一个损失函数和度量,然后对预测进行后处理。

  • 编写您自己的成本函数。对于 xgboost,我们实现了一个函数,它接受预测和目标值并计算一阶和二阶导数。

  • 优化另一个指标并使用提前停止。

最后一个几乎总是有效。

一般来说,对于复杂的算法,神经网络往往会因为损失函数的灵活性(比普通 ML 更好)而工作得更好。

使用 XGBoost,您可以提出自己的损失和指标。只需添加自定义损失相对简单。但是,我对您描述的问题没有经验,因此您需要看看您的想法是否适合标准 XGB。

在此处查找自定义损失 (R) 的实现:https ://github.com/Bixi81/R-ml/blob/master/xgboost_custom_objective_fair_loss.R