1 mae/mad和mse介绍
Mse:mean-square error。
可导,常常作为loss function。
Mae:mean absolute error
不可导。
2 如何在XGBoost中近似mae
我们都知道XGBoost支持我们自定义目标函数,但是其在实现中对目标函数做了二阶泰勒展开,所以我们需要提供目标函数的一阶和二阶导数。但是MAE并不是连续可导的(在0处不可导),无法直接作为XGBoost的目标函数。所以目前比较好的方法是找到一个函数来近似它。
2.1 Huber loss
在统计学当中,huber loss是鲁棒回归(robust regression)的损失函数,相比于平方损失更不容易受异常点的影响。有一些分类任务有时也会使用。 —Wikipedia
这个函数对
a
比较小的值是二次的,对比较大的值是线型的。
在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
在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
在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,log−coshloss 在图像上的差异。可以看到 mse 图像与 mae 在x值较大时差别较大, log−cosh 在一部分区域内与 mse 类似,但是在之后会出现断崖式地改变,只有 fairloss 一直与 mae 图像吻合, huberloss 因为分段函数的问题暂时没有体现在图像上。
3 理论分析
@ To do