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?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章