Boosten und Absacken von Bäumen (XGBoost, LightGBM)

16

Es gibt viele Blog-Posts, YouTube-Videos usw. über die Idee , Bäume zu fangen oder zu vermehren . Mein allgemeines Verständnis ist, dass der Pseudocode für jedes ist:

Absacken:

  1. Nehmen Sie N zufällige Stichproben von x% der Stichproben und y% der Merkmale
  2. Passen Sie Ihr Modell (z. B. Entscheidungsbaum) an jedes von N an
  3. Vorhersage mit jedem N
  4. Mitteln Sie die Vorhersagen, um die endgültige Vorhersage zu erhalten

Erhöhen:

  1. Passen Sie Ihr Modell (z. B. Entscheidungsbaum) an Ihre Daten an
  2. Holen Sie sich die Reste
  3. Passen Sie Ihr Modell an die Residuen an
  4. Gehen Sie zu 2 für N Auffrischungsrunden
  5. Die endgültige Vorhersage ist eine gewichtete Summe der sequentiellen Prädiktoren.

Ich werde alle Klarstellungen zu meinem Verständnis oben nehmen, aber meine beabsichtigte Frage lautet wie folgt:

Sowohl XGBoost als auch LightGBM haben Parameter, die das Absacken ermöglichen. Die Anwendung ist nicht Bagging OR Boosting (worüber in jedem Blog-Beitrag gesprochen wird), sondern Bagging AND Boosting. Was ist der Pseudocode für wo und wann das kombinierte Absacken und Boosten stattfindet?

Ich habe erwartet, dass es "Bagged Boosted Trees" ist, aber es scheint, dass es "Boosted Bagged Trees" ist. Der Unterschied scheint erheblich zu sein.

Eingesackte verstärkte Bäume:

  1. Nehmen Sie N zufällige Stichproben von x% der Stichproben und y% der Merkmale
  2. Passen Sie Boosted-Bäume an jede der N Proben an
  3. Vorhersage mit jedem N
  4. Mitteln Sie die Vorhersagen, um die endgültige Vorhersage zu erhalten

Dies scheint der beste Weg zu sein. Immerhin ist das Risiko beim Boosten eine Überanpassung, und der Hauptvorteil des Einsackens besteht darin, die Überanpassung zu reduzieren. Es scheint eine großartige Idee zu sein, ein paar geboosterte Modelle einzusacken.

Doch von der Suche, zum Beispiel durch die scikit-learn gradient_boosting.py (die Probe Absacken des Fall ist, aber nicht zufällig Merkmalsauswahl), und zusammen ein paar kleine Nuggets über Beiträge über LightGBM und XGBoost Schuster, sieht es aus wie XGBoost und LightGBM Arbeit wie folgt:

Gepackte Bäume:

  1. Passen Sie einen Entscheidungsbaum an Ihre Daten an
  2. Für i in N Auffrischungsrunden:
    • Holen Sie sich die Reste
    • wenn ich bag_frequency == 0 mod (dh bag alle 5 Runden):
      • Nehmen Sie eine einzelne Zufallsstichprobe von x% der Stichproben und y% der Merkmale. benutze diese zufällige Stichprobe für die Zukunft
    • Passen Sie den Baum an die Reste an
  3. Die endgültige Vorhersage ist eine gewichtete Summe der sequentiellen Prädiktoren.

Bitte korrigieren Sie mein Verständnis hier und tragen Sie die Details ein. Boosted Bagged Tree (mit nur 1 zufälligen Baum pro bag_frequency) scheint nicht so mächtig zu sein wie Bagged Boosted Tree.

Jonathan
quelle
2
+1 für eine interessante und sehr gut formulierte Frage. Und willkommen auf der Seite.
mkt - Setzen Sie Monica
du brauchst einen "compute the error" für dein boosting. Falsch gemacht, das fällt auseinander. Die Gewichte sind für adaboost kritisch. Es ist kein roher Rest. ... Wir sprechen nicht über stochastische Gradienten, die beim Boosten notwendig sind, obwohl dies die Dinge beschleunigt.
EngrStudent - Wiedereinsetzung von Monica
Hier ist der Boosted-Bagged. Anstelle eines neuen Baums für jeden Serienschritt erhalten Sie einen neuen Wald mit durchschnittlicher Leistung. Eugene Tuv und Kari Torkkola. jmlr.org/papers/volume10/tuv09a/tuv09a.pdf
Reinstate Monica
Der Bagged Boosted wird einen Wald von Serienensembles bilden und die durchschnittliche Leistung erzielen. Es könnte die Überanpassung hervorrufen, die ein (verstärktes) Serienensemble erzeugen und eine robustere Ausgabe liefern kann, aber die Verstärkung wird nicht sehr groß sein.
EngrStudent - Wiedereinsetzung von Monica

Antworten:

13

Absacken: N Zufallsstichproben von x% der Stichproben und y% der Merkmale entnehmen

Instanzen werden in Bagging wiederholt unterabgetastet , jedoch nicht in Features. ( RandomForests , XGBoost und CatBoost machen beides):

Given dataset D of size N.
For m in n_models:
    Create new dataset D_i of size N by sampling with replacement from D.
    Train model on D_i (and then predict)
Combine predictions with equal weight 

Fügen Sie einen Initialisierungsschritt in Ihren Boosting- Pseudocode ein, um die Redundanz zu beseitigen:

Init data with equal weights (1/N).
For m in n_model:
    Train model on weighted data (and then predict)
    Update weights according to misclassification rate.
    Renormalize weights
Combine confidence weighted predictions

Bagged Boosted Trees (wie Sie es nennen) sind sicherlich ein vernünftiger Ansatz, unterscheiden sich aber von XGBoost oder CatBoost :

Given dataset D of size N.
For m in n_models:
    Create new dataset D_i of size N by sampling with replacement from D.
    (Insert Boosting pseudo code here (on D_i))
Combine predictions with equal weight 

XGBoost und CatBoost basieren beide auf Boosting und verwenden die gesamten Trainingsdaten. Sie implementieren auch das Absacken durch einmaliges Unterabtasten in jeder Boosting-Iteration:

Init data with equal weights (1/N).
For m in n_model:
    Train model on weighted bootstrap sample (and then predict)
    Update weights according to misclassification rate.
    Renormalize weights
Combine confidence weighted predictions

Wenn Sie "Modell an Residuen anpassen" beibehalten möchten, entspricht dies "Modell an Residuen von Daten im Bootstrap-Beispiel anpassen ".


Weitere Bemerkungen :

Wie Sie vorschlagen, gibt es keinen " besten Weg " (kein Satz über freies Mittagessen). "Bagged Boosted Trees" übertreffen möglicherweise XGBoost in bestimmten Datensätzen.

Nehmen Sie eine Zufallsstichprobe von x% der Proben

Diese Zeile ist verwirrend. Woher hast du das?

wenn ich bag_frequency == 0 mod (dh bag alle 5 Runden):

Dies sollte in Ihrem Pseudocode nicht erwähnt werden. Besonders wenn andere, wichtigere Parameter ausgelassen werden (wie die Lernrate beim Boosten).

Laksan Nathan
quelle
(+1) Schöne Antwort! Zur Verdeutlichung: Ist das OP in der Angabe " Sowohl XGBoost als auch LightGBM haben Parameter, die das Absacken ermöglichen " falsch ?
mkt - Setzen Sie Monica
Beide ermöglichen Absacken: bagging_fraction in LightGBM und Substichprobe in XGBoost . Ich bin nicht sicher, warum ich die ganze Zeit auf CatBoost verwiesen habe. Aber alle arbeiten in Bezug auf die Frage auf die gleiche Weise.
Laksan Nathan
Mein Fehler, ich habe die Zeile in Ihrer Antwort verpasst, in der das erwähnt wird. Könnten Sie " einmaliges Unterabtasten bei jeder Boosting-Iteration " erklären ? Meinen Sie damit, dass in jeder Boosting-Iteration viele Unterproben genommen werden, Bäume zu jeder Unterprobe passen und dann die Fehlklassifizierungsrate basierend auf den eingesackten Bäumen berechnet und schließlich die Gewichte aktualisiert werden? Wenn ja, können Sie dies in Ihrem Pseudocode klarstellen?
mkt - Setzen Sie Monica
Es werden nicht viele Unterproben gezeichnet, sondern nur eine: Anstatt das Modell an alle gewichteten Instanzen anzupassen, wird das Modell an einem Bootstrap-Beispiel trainiert.
Laksan Nathan
In Bezug auf "Entnehmen Sie eine einzelne Zufallsstichprobe von x% der Stichproben"; Besser wäre "nimm eine einzelne Stichprobe von x% der Zeilen". Das habe ich von hier bekommen .
Jonathan