2017-07-10 55 views

答えて

3

まず少し理論がありますが、申し訳ありません。あなたはMAEのgradとhessianを求めましたが、MAEはcontinuously differentiableではありませんので、第一次と第二次の導関数を計算しようとするのは本当に不可能です。以下では、MAEが連続的に分化できないようにする「キンク」をx=0に見ることができます。私たちの最善の策は、それに近似しようとすることです。

Some different loss functions

私たちは、絶対値を近似するいくつかの機能があること上記を参照することができます。明らかに、非常に小さな値の場合、Squared Error(MSE)はMAEのかなり良い近似値です。しかし、これはあなたのユースケースでは十分ではないと思います。

Huber損失は十分に文書化された損失関数である。以下のように

import xgboost as xgb 

dtrain = xgb.DMatrix(x_train, label=y_train) 
dtest = xgb.DMatrix(x_test, label=y_test) 

param = {'max_depth': 5} 
num_round = 10 

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

bst = xgb.train(param, dtrain, num_round, obj=huber_obj) 

その他の機能はobj=huber_objを置換することによって使用することができ、PythonのXGBoostで実施することができます。

公正損失は完全に文書化されていませんが、かなりうまくいくようです。以下のコードで定義されているようにgradを知ると、公平な損失関数が得られるように積分を取る:

Fair Loss Functionです。

、このコードはKaggleオールステートチャレンジ第二場所solutionから取り出され、適合されているような、

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 

として実装することができます。

Log-Coshロス機能。

最後に、上記の関数をテンプレートとして使用して独自のカスタム損失関数を作成することができます。

関連する問題