Verwendung von "Tree Boosting" mit einer datengesteuerten Verlustfunktion
Wir haben ein Problem mit einer datengesteuerten (nicht analytischen) Verlustfunktion. Unser Ziel enthält ganze Zahlen zwischen 0 und 20 (das Ziel ist von Natur aus diskret), obwohl größere Werte möglich sind, die in unserem Datensatz jedoch nicht vorhanden sind. Die Tatsache, dass wir eine sehr genaue Verlustfunktion haben, lässt uns bei der Verwendung von Algorithmen wie XGBoost einige schwerwiegende Probleme aufkommen:
Die Verlustfunktion ist im Allgemeinen nicht konvex. Es ist nicht einfach durch eine konvexe Funktion anzupassen, da seine Form datengesteuert ist und drastisch variieren kann. Dies bedeutet zum Beispiel, dass für Vorhersagen, die weiter von dem Teil der Funktion entfernt sind, der gut angepasst ist, wo keine große Bestrafung erforderlich ist, unweigerlich eine große Bestrafung gegeben wird. Wenn wir statt passen interpolieren, kann der Hessische negativ sein (siehe beigefügtes Bild), was ein Problem bei der Bestimmung der Blattgewichte darstellt (richtig?).
Wir glauben, wir können so etwas wie den XGBoost-Algorithmus anpassen (ich verwende diesen Algorithmus als Beispiel, weil ich sowohl mit dem Papier als auch mit der API vertraut bin), indem wir seine Abhängigkeit vom Gradienten en hessian durch eine Brute-Force-Methode zum Finden des ersetzen optimale Blattgewichte und beste Verstärkung. Dies wird den Algorithmus jedoch massiv verlangsamen, möglicherweise lähmend.
Meine Fragen sind: Ist die Standardmethode für den Umgang mit komplexen Verlustfunktionen in vorhandenen Algorithmen? Ist der Algorithmus für die Behandlung dieser Probleme geeignet? Gibt es noch etwas, das Sie vorschlagen könnten, um die oben genannten Probleme zu lösen?
Danke im Voraus.
Antworten
Zuerst einige frühere und bekannte Erklärungen (die Sie wahrscheinlich bereits kennen).
Metrik wollen wir optimieren.
Optimierungsverlust ist das, was das Modell optimiert.
Natürlich möchten wir, dass die Metrik und der Optimierungsverlust gleich sind, aber dies ist immer nicht möglich. Wie gehe ich damit um?
Führen Sie das richtige Modell aus. Einige Modelle können verschiedene Verlustfunktionen optimieren. Im Fall von XGBoost haben Sie zwei Verlustfunktionen, die des Entscheidungsbaums und die des Boostings.
Verarbeiten Sie das Ziel vor und optimieren Sie eine andere Metrik. Dies transformiert beispielsweise das Ziel in den Logarithmus des Ziels und wendet dann in diesem Bereich eine bekannte Verlustfunktion an
Optimieren Sie eine andere Verlustfunktion und Metrik und verarbeiten Sie die Vorhersagen nach.
Schreiben Sie Ihre eigenen Kostenfunktionen. Für xgboost implementieren wir eine einzelne Funktion, die Vorhersagen und Zielwerte verwendet und die Ableitungen erster und zweiter Ordnung berechnet.
Optimieren Sie eine andere Metrik und verwenden Sie das frühe Stoppen.
Der letzte funktioniert fast immer.
Im Allgemeinen funktionieren neuronale Netze bei komplexen Algorithmen aufgrund der Flexibilität der Verlustfunktionen (mehr als bei normaler ML) tendenziell besser.
Mit XGBoost können Sie Ihren eigenen Verlust und Ihre eigene Metrik ermitteln. Es ist relativ einfach, nur einen benutzerdefinierten Verlust hinzuzufügen. Ich habe jedoch keine Erfahrung mit den von Ihnen beschriebenen Problemen. Sie müssten also prüfen, ob Ihre Vorstellungen in das Standard-XGB passen.
Eine Implementierung von Custom Loss (R) finden Sie hier: https://github.com/Bixi81/R-ml/blob/master/xgboost_custom_objective_fair_loss.R