2015-10-05 1 views
12

Ich verwende xgboost für das Ranking mitWie kann auf die Gewichtung einzelner Entscheidungsbäume in xgboost zugegriffen werden?

param = {'objective':'rank:pairwise', 'booster':'gbtree'} 

Wie ich durch die Berechnung der gewichteten Summe der gelernten Entscheidungsbäume Werke Gradienten steigern verstehen. Wie kann ich auf die Gewichte zugreifen, die jedem erlernten Booster zugewiesen sind? Ich wollte versuchen, die Gewichte nach dem Training nachzubearbeiten, um den Voraussage-Schritt zu beschleunigen, aber ich weiß nicht, wie man die einzelnen Gewichte erhält. Bei der Verwendung von dump_model() können die verschiedenen Entscheidungsbäume in der erstellten Datei angezeigt werden, aber keine Gewichtung wird dort gespeichert. In der API habe ich keine passende Funktion gefunden. Oder kann ich die Gewichte manuell mit dem Schrumpfparameter eta berechnen?

+0

würde eine Antwort auf diese Frage lieben ... gute Frage! –

Antwort

16

Jeder Baum erhält das gleiche Gewicht eta und die Gesamtprognose ist die Summe der Vorhersagen jedes Baumes, wie Sie sagen.

Sie würden vielleicht erwarten, dass die früheren Bäume mehr Gewicht als die letzteren Bäume erhalten, aber das ist nicht notwendig, da die Antwort nach jedem Baum aktualisiert wird. Hier ist ein Spielzeug Beispiel:

Angenommen, wir haben 5 Beobachtungen, mit Antworten 10, 20, 30, 40, 50. Der erste Baum gebaut worden und geben Prognosen von 12, 18, 27, 39, 54

Wenn nun eta = 1 ist, werden die Antwortvariablen, die an den nächsten Baum übergeben werden, -2, 2, 3, 1, -4 sein (dh die Differenz zwischen der Vorhersage und der wahren Antwort). Der nächste Baum wird dann versuchen, das "Rauschen" zu lernen, das nicht vom ersten Baum erfasst wurde. Wenn nrounds = 2 ist, wird die Summe der Vorhersagen der beiden Bäume die endgültige Vorhersage des Modells liefern.

Wenn stattdessen eta = 0,1, werden alle Vorhersagen der Bäume um eta verkleinert, so dass der erste Baum stattdessen 1,2, 1,8, 2,7, 3,9, 5,4 "vorhersagt". Die Antwortvariable, die an den nächsten Baum übergeben wird, hat dann die Werte 8.8, 18.2, 27.3, 36.1, 44.6 (die Differenz zwischen der skalierten Vorhersage und der wahren Antwort). Die zweite Runde verwendet dann diese Antwortwerte, um einen weiteren Baum zu bilden - und wiederum die Vorhersagen werden skaliert von eta. So prognostiziert Baum 2, 7, 18, 25, 40, 40, die, einmal skaliert, 0,7, 1,8, 2,5, 4,0, 4,0 werden. Wie zuvor wird dem dritten Baum die Differenz zwischen diesen Werten und der Antwortvariablen des vorherigen Baums übergeben (so 8.1, 16.4, 24.8, 32.1. 40.6). Auch hier ergibt die Summe der Vorhersagen aller Bäume die endgültige Vorhersage.

Wenn eta = 0,1 und base_score 0 ist, brauchen Sie mindestens 10 Runden, um eine Vorhersage zu erhalten, die in der Nähe sinnvoll ist. Im Allgemeinen benötigen Sie ein Minimum von 1/eta Runden und typischerweise viele mehr.

Der Grund für die Verwendung eines kleinen eta ist, dass das Modell von kleinen Schritten in Richtung der Vorhersage profitiert, anstatt Baum 1 die Mehrheit der Arbeit machen. Es ist ein bisschen wie Kristallisation - kühl langsam und du bekommst größere, bessere Kristalle. Der Nachteil ist, dass Sie nrounds erhöhen müssen, wodurch die Laufzeit des Algorithmus erhöht wird.

+0

Gute Antwort, diese Frage ist wirklich eine allgemeinere Frage. Da Sie nur Residuen anpassen, wird nur die Vorhersage jedes Baumes mit "eta" skaliert. Dies sollte akzeptiert werden. –

+0

@dataShrimp, Hallo, vielleicht können Sie [diese Frage] beantworten (http://stackoverflow.com/questions/35983565/how-is-the-parameter-weight-dmatrix-used-in-the-gradient-boosting-procedure) – Ojtwist

+0

Dies ist eine der klarsten Erklärungen, auf die ich gestoßen bin. Vielen Dank! – santon

Verwandte Themen