XGBoost的以mae作为优化目标探究

1 mae/mad和mse介绍

Mse:mean-square error。

可导,常常作为loss function。

MSE(y,yˆ)=1nsamplesi=0nsamples1(yyˆ)2

Mae:mean absolute error

不可导。

MAE(y,yˆ)=1nsamplesi=0nsamples1(yyˆ)

2 如何在XGBoost中近似mae

我们都知道XGBoost支持我们自定义目标函数,但是其在实现中对目标函数做了二阶泰勒展开,所以我们需要提供目标函数的一阶二阶导数。但是MAE并不是连续可导的(在0处不可导),无法直接作为XGBoost的目标函数。所以目前比较好的方法是找到一个函数来近似它

2.1 Huber loss

在统计学当中,huber loss是鲁棒回归(robust regression)的损失函数,相比于平方损失更不容易受异常点的影响。有一些分类任务有时也会使用。 —Wikipedia

Lδ={12a2δ(|a|12δ)for|a|δotherwise

这个函数对 a 比较小的值是二次的,对比较大的值是线型的。a常常代表残差, a=yf(x)

Lδ={12(yf(x))2δ(yf(x))12δ)foryf(x)δotherwise

在XGBoost的python可以如下实现:

def huber_approx_obj(preds, dtrain):
    d = dtrain.get_labels() - preds #remove .get_labels() for sklearn
    h = 1  #h is delta
    scale = 1 + (d / h) ** 2
    scale_sqrt = np.sqrt(scale)
    grad = d / scale_sqrt
    hess = 1 / scale / scale_sqrt
    return grad, hess
2.2 Fair loss

Lc=c|x|cln(|x|+c)

在XGBoost的python实现如下:

def fair_obj(preds, dtrain):
    """y = c * abs(x) - c * np.log(abs(abs(x) + c))"""
    x = dtrain.get_labels() - preds
    c = 1
    den = abs(x) + c
    grad = c*x / den
    hess = c*c / den ** 2
    return grad, hess
2.3 Log-Cosh loss

L=ln(cosh(x))

在XGBoost中的python实现如下:

def log_cosh_obj(preds, dtrain):
    x = dtrain.get_labels() - preds
    grad = np.tanh(x)
    hess = 1 / np.cosh(x)**2
    return grad, hess
2.4 对比

动态图对比了 mae,mse,fairloss,logcoshloss 在图像上的差异。可以看到 mse 图像与 mae 在x值较大时差别较大, logcosh 在一部分区域内与 mse 类似,但是在之后会出现断崖式地改变,只有 fairloss 一直与 mae 图像吻合, huberloss 因为分段函数的问题暂时没有体现在图像上。

3 理论分析

@ To do

4 References

1.Xgboost-How to use “mae” as objective function?

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值