2017-07-10 5 views

Antwort

3

Ein wenig Theorie zuerst, sorry! Sie fragte nach dem grad und hessischen für MAE, jedoch ist die MAE nicht continuously differentiable so zu versuchen, die ersten und zweiten Ableitungen zu berechnen, ist nicht wirklich möglich. Im Folgenden können wir den „Knick“ bei x=0 sehen, die vom Sein stetig differenzierbar die MAE verhindert. Unsere beste Wette ist, zu versuchen, es irgendwie wie zu nähern.

Some different loss functions

Wir können oben sehen, dass es mehrere Funktionen, die den Absolutwert annähern. Für sehr kleine Werte ist der Squared Error (MSE) eindeutig eine ziemlich gute Näherung des MAE. Ich gehe jedoch davon aus, dass dies für Ihren Anwendungsfall nicht ausreicht.

Huber Verlust ist eine gut dokumentierte Verlustfunktion. Es kann in Python XGBoost wie folgt implementiert werden,

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) 

Andere Funktion kann durch Ersetzen des obj=huber_obj verwendet werden.

Fair Verlust ist nicht gut dokumentiert, aber es scheint ziemlich gut zu funktionieren. Die Kenntnis der grade wie im Code unten definierten wir das Integral erhalten nehmen, dass die Fair Verlustfunktion ist:

Fair Loss Function.

Es kann als solches implementiert sein,

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 

Dieser Code wird entnommen und von der zweiten Stelle in der solution Kaggle Allstate Herausforderung angepasst.

Log-Cosh Verlustfunktion.

def log_cosh_obj(preds, dtrain): 
    x = dtrain.get_labels() - preds 
    grad = np.tanh(x) 
    hess = 1/np.cosh(x)**2 
    return grad, hess 

Schließlich können Sie Ihre eigenen Verlustfunktionen unter Verwendung der oben genannten Funktionen als Vorlagen erstellen.

Verwandte Themen