python scale()函数_xgboost如何使用MAE或MAPE作为目标函数?

v2-fc4a7ea98d4705cbbbc4d24af6daad56_1440w.jpg?source=172ae18b

xgboost被誉为各大数据竞赛中的“重型武器”,好的效果,并行计算的速度都是其显著的优势。xgboost参数中默认的目标函数有限,很多情况下,需要根据任务自定义目标函数。关于如何在代码中定义目标函数,可以参考:https://github.com/dmlc/xgboost/blob/master/demo/guide-python/custom_objective.py

xgboost需要目标函数的二阶导数信息(或者hess矩阵),在回归问题中经常将MAE或MAPE作为目标函数,然而看两者的计算公式就可以知道:这两个目标函数二阶导数不存在

式中,

是真实值,
是算法的预测值

解决这个问题的高质量解答很少,xgboost 使用 MAE或MAPE 作为目标函数这个博客以及里面给出的链接回答都比较模糊,下面是我对于这个问题的解决方法。

解决这个问题的两个主流方法:

1.利用可导的函数逼近MAE或者MAPE,这种方法更符合严谨的逻辑,所以后面重点阐述

2.直接自己定义一个二阶导数的值,比如直接将

定义为二阶导数,这中方法没有严谨的数学推理,但在很多应用中可以work。

利用MSE进行逼近是最简单的一种方法,但是MSE在训练初始误差较大的时候,loss是其平方,会使得训练偏离MAE的目标函数,一般难以达到高精度的要求。

利用Huber loss(Huber loss - Wikipedia)进行逼近,是更好的办法。其定义如下所示:

v2-e028287f42045b06306c847e7df88d7a_b.jpg

图1 是利用Hber loss逼近MAE的示意图,

是可调的参数(来源:Xgboost-How to use "mae" as objective function?)

v2-d957c115b6b67506946e5214016a2caa_b.jpg
图1 Hber loss逼近MAE

但是值得注意的是Huber loss仍然不可导,实际又利用了Huber loss的可导逼近形式:Pseudo-Huber loss function作为目标函数(很多文章中没有讲清这一点)其定义为:

一阶导数为:

v2-ad05def0014e7399e71dd68135792b52_b.jpg

二阶导数为:

v2-295a0942d5fc9b4649f264ad8128f86f_b.jpg

的情况下,对应的目标函数定义为(这个实验Python代码):
def 

代码中的h就是公式中的

,实际应用中调节
来调整逼近效果。

图2及图3分别是以Pseudo-Huber loss function和MAE loss作为逼近函数在同一个任务上,validation集上的实验结果(实验中

)。

v2-313d0a207dae4529605c21f559d5ef4f_b.jpg
图2 Pseudo-Huber loss function逼近下的validation error

v2-4b325f9da734432685484405b4e5c885_b.jpg
图3 MSE loss逼近下的validation error

由上两图可以看出:Pseudo-Huber loss function逼近下的误差更小,收敛速度更快!

还可以用ln(cosh(x))以及 log(exp(-x) + exp(x))进行逼近,可以看一下几者的函数曲线

v2-be1de3577a235a98cdf643c69da603c6_b.jpg
图4 小范围函数曲线对比

v2-1459b984922ed7f3ee07835bf57d9041_b.jpg
图5 大范围函数曲线对比

ln(cosh(x))的一阶导数:

tanh(x)

ln(cosh(x))的二阶导数:

1-tanh(x)*tanh(x)

ln(cosh(x))的代码:

def 

可以对比一下ln(cosh(x))的Pseudo-Huber loss function的一阶,二阶导数图像:

v2-24b9330115dde6932aeae55771f30b9d_b.jpg
图6 一阶导数图像对比

v2-083be7157c9f0924b226100f1cc063de_b.jpg
图7 二阶导数对比

可以看出,两者的一阶、二阶导数非常像!

在实践中选择适合自己问题的逼近函数形式吧!

对于MAPE的处理情况,就很简单了,将逼近函数的一阶和二阶导数除以

(不明白的话,看MAPE的定义式)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值