当数据偶尔有非常大的值要预测时,提升树回归损失函数?

数据挖掘 回归 xgboost 损失函数 离群值
2022-03-03 15:06:24

我有一个回归问题,我的大多数目标变量都在 5-30 范围内,但偶尔目标变量会飙升至 100、500 甚至 5000。这些值不是应该删除的虚假异常值,而是我希望预测算法尝试捕获的值。但是,我不希望这些变量上的错误支配树的训练。从概念上讲,百分比误差更类似于我感兴趣的内容(尽管不必完全如此)。具体来说,当目标为 30 而我预测为 15 时,我认为这与目标为 5000 但我的预测为 2500 时相似。我不希望 2500**2 平方误差压倒 15*** 2 平方误差。

对于此类问题,我解决此问题的最佳方法是什么?数据转换?自定义损失函数?ETC?

2个回答

这些天我几乎都在解决同样的问题:

我尝试了两种使用 XGB 回归的选项,它们具有不同的目标函数,包括:

  1. 使用线性回归目标函数(“reg:linear”或“reg:squarederror”)并将目标转换为对数空间

  2. 使用 gamma 目标函数("reg:gamma"),这对于具有 gamma 分布的倾斜目标很有用,例如保险索赔严重性。在这种情况下,我没有将目标转换为日志空间。

你可以试试这两种情况,看看哪一种表现更好。但是,就我而言,选项 1 的性能优于选项 2(大约 15-20%)。

此外,您可以尝试“reg:squaredlogerror”

飞行器值/偏斜预测变量将对回归模型产生很大影响。如果你想抵消它,你有几个选择。

1) 如果您的目标始终非零,并且您希望回归接近线性,您可以尝试对目标变量使用 log()、sqrt() 甚至 boxcox() 转换变换。这将有助于防止较大的值产生很大的影响。此外,如果要对数据进行规范化,则应先运行转换。请记住使用指数函数将预测转换回来。您可以使用 skew() 函数检查偏斜是否减少(越低越好)

2)您可以添加权重值或损失/成本函数。以下是这些选项的一个很好的参考:

https://ml-cheatsheet.readthedocs.io/en/latest/linear_regression.html#initialize-weights