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

来源:互联网 发布:手机区域截图软件 编辑:程序博客网 时间:2024/05/21 08:58

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?