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?

猜你喜欢

转载自blog.csdn.net/wj1066/article/details/78816177