Ich weiß xgboost erste Gradienten und zweite Gradienten benötigen, aber jeder hat sonst „mae“ als OBJ-Funktion verwendet?Xgboost-How "mae" als Zielfunktion zu benutzen?
Antwort
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.
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:
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.
- 1. XGboost - Erhöhung der Trainingsfehler "mae"
- 2. Was sagt mir der MAE?
- 3. Ändern Zielfunktion auf Entscheidungsbaum
- 4. Tflearn Benutzerdefinierte Zielfunktion
- 5. , wie zu benutzen glCopyImage2D
- 6. scipy.optimize.leastsq ruft Zielfunktion mit NaN
- 7. Matlab-Optimierung: Zielfunktion mit abhängiger Entscheidungsvariable
- 8. Topologische Sortierung mit einer Zielfunktion
- 9. Multivariate Kartierungs-/Regression mit Zielfunktion
- 10. Warum benutzen Leute _? als Bezeichner Suffix?
- 11. MATLAB - Schreiben Zielfunktion für fmincon()
- 12. Benutzerdefinierte Zielfunktion zur Optimierung von Fscore - XGBOOST
- 13. Die Optimierung einer Zielfunktion mit Step-Funktionen
- 14. Sollten wir aufhören, Zend WinEnabler zu benutzen?
- 15. ist es möglich, den Radknopf zu benutzen, ohne Freeglut zu benutzen?
- 16. lpSolve - Zielfunktion auf einen bestimmten Wert optimieren
- 17. Gut/Schlecht zu benutzen -moz-border-radius
- 18. Wie man distuts erklärt, gcc zu benutzen?
- 19. Prism - Schlechte Idee, es zu benutzen?
- 20. , wie zu benutzen Sitzung in AngularJS
- 21. Monolog einrichten rollbar mit symfony3 zu benutzen?
- 22. Python MultiProcessing.Pool: Wie ohne iterable zu benutzen?
- 23. Ist es sicher, Capistrano zu benutzen?
- 24. Einfacher Versuch, die Exception nicht zu benutzen
- 25. Ist der Firefox-Hack O.K zu benutzen?
- 26. Objekte verspotten - alle Methoden als virtuell deklarieren oder Schnittstelle benutzen?
- 27. TYPO3: Imageorient richtig benutzen
- 28. lineare Zielfunktion mit nichtlinearen Randbedingungen und binären Variablen
- 29. Wie man die Anfangsbreite einstellt, kann QListWidget benutzen und Splitter benutzen, um die Größe zu justieren?
- 30. Schwierigkeit, Fahnen zu benutzen, um Knopfwidget in wxPython zu bewegen