Additive Verzerrung in xgboost (und deren Korrektur?)

9

Ich nehme gerade an einem Wettbewerb teil. Ich weiß, dass es meine Aufgabe ist, das gut zu machen, aber vielleicht möchte jemand mein Problem und seine Lösung hier diskutieren, da dies auch für andere auf ihrem Gebiet hilfreich sein könnte.

Ich habe ein xgboost-Modell trainiert (ein baumbasiertes Modell und ein lineares Modell und ein Ensemble aus beiden). Wie bereits hier besprochen , war der mittlere absolute Fehler (MAE) auf dem Trainingssatz (wo ich eine Kreuzvalidierung durchgeführt habe) gering (ca. 0,3), dann lag der Fehler auf dem durchgehaltenen Testsatz bei etwa 2,4. Dann begann der Wettbewerb und der Fehler lag bei 8 (!) Und überraschenderweise lag die Prognose immer ca. 8-9 über dem wahren Wert !! Sehen Sie die gelb umkreiste Region im Bild:

Geben Sie hier die Bildbeschreibung ein

Ich muss sagen, dass der Zeitraum der Trainingsdaten im Oktober '15 endete und der Wettbewerb jetzt begann (April '16 mit einem Testzeitraum von ca. 2 Wochen im März).

Heute habe ich gerade die konstanten Werte von 9 von meiner Prognose abgezogen und der Fehler ging auf 2 zurück und ich bekam die Nummer 3 auf dem Leadboard (für diesen einen Tag). ;) Dies ist der Teil rechts von der gelben Linie.

Also, was möchte ich diskutieren:

  • Wie reagiert xgboost auf das Hinzufügen eines Intercept-Terms zur Modellgleichung? Könnte dies zu Verzerrungen führen, wenn sich das System zu stark ändert (wie in meinem Fall vom 15. Oktober bis 16. April)?
  • Könnte ein xgboost-Modell ohne Achsenabschnitt robuster gegenüber parallelen Verschiebungen des Zielwerts sein?

Ich werde meine Voreingenommenheit von 9 weiter abziehen und wenn jemand interessiert ist, könnte ich Ihnen das Ergebnis zeigen. Es wäre einfach interessanter, hier mehr Einblick zu bekommen.

Ric
quelle
Klingt so, als hätten Sie Ihr Modell basierend auf Testdaten manuell geändert. Ja, es ist besser, aber es ist nicht reproduzierbar. Ihr Modell stimmt ziemlich gut mit der Krümmung der Daten überein. Der Grund für den Fehler in dieser Region scheint am Anfang zu liegen, wenn die rote Linie sinkt, während die blaue Linie steigt. Ich würde versuchen herauszufinden, wie dieses Verhalten modelliert werden kann.
Winks
@Winks danke, dass du zu mir zurückgekommen bist! Ich muss sagen, dass es vor dem Wettkampf eine Testphase gab und sogar dort gab es den 8-9-Fehler und immer positiv ... es ist also nicht nur der Zug am Anfang des Screenshots, sondern anscheinend hat sich das gesamte System geändert. Andere Konkurrenten scheinen es von Anfang an richtig zu haben ... also ja, vielleicht bin ich einfach zu schlecht ... oder sie verwenden bessere Daten. Ich war nur überrascht, diesen schlimmen Fehler jetzt zu sehen, während die Trainingsdaten (und die Aufteilung von Zug / Test und die X-Validierung ...) so robust waren.
Ric

Antworten:

3

Ich werde mir selbst antworten und Sie über meine Ergebnisse informieren, falls jemand interessiert ist.

Zuerst die Tendenz: Ich habe mir die Zeit genommen, alle aktuellen Daten zu sammeln und sie korrekt zu formatieren und so weiter. Ich hätte das schon lange vorher tun sollen. Das Bild ist das folgende:

Geben Sie hier die Bildbeschreibung ein

Sie sehen die Daten von Ende 2015 und dann vom 16. April. Das Preisniveau ist völlig anders. Ein Modell, das auf Daten von 2015 trainiert wurde, kann diese Änderung in keiner Weise erhalten.

Zweitens: Die Passform von xgboost. Das folgende Setup hat mir sehr gut gefallen. Zug- und Testfehler sind jetzt sehr nahe und immer noch gut:

xgb_grid_1 <- expand.grid(
    nrounds = c(12000),
    eta = c(0.01),
    max_depth = c(3),
    gamma = 1,
    colsample_bytree = c(0.7),
    min_child_weight = c(5) 
  )

  xgb_train_1 <- train(
    x = training,y = model.data$Price[inTrain],
    trControl = ctrl,
    tuneGrid = xgb_grid_1,
    method="xgbTree" 
   ,subsample = 0.8
    )

Daher benutze ich viele Bäume und alle sind höchstens 3 Spalten tief (wie hier empfohlen ). Auf diese Weise ist die Berechnung schnell (die Baumgröße wächst mit jedem Split um den Faktor 2) und die Überanpassung scheint verringert zu sein.

Meine Zusammenfassung: Verwenden Sie Bäume mit einer kleinen Anzahl von Blättern, aber vielen, und suchen Sie nach aktuellen Daten. Für den Wettbewerb war das Pech für mich ...

Ric
quelle
Vielen Dank für das Teilen (+1). Nur um das Offensichtliche in Bezug auf Ihren Code zu fragen: Sie suchen hier eindeutig nicht entlang eines Rasters. Trainieren Sie einfach (und erhalten Sie Resampling-Statistiken) für eine einzelne Parametereinstellung. Sind Sie auf die "3" gestoßen, indem Sie verschiedene Parameterwerte verwendet haben? War "3" basierend auf RMSE oder einem anderen Kriterium optimal?
usεr11852
@ usεr11852 In meinen "ersten Tagen" mit xgoost habe ich max_depth viel zu groß gewählt. Wenn Sie dem Link in meiner Antwort ("hier") folgen, sehen Sie eine Diskussion. Schließlich habe ich nur 3 gewählt. Wie im obigen Code angegeben, können Sie das Caret-Paket verwenden, um eine Rastersuche durchzuführen. Alternativ können Sie, wie ich mich erinnere, einige Routinen in xgboost direkt verwenden, und kürzlich habe ich begonnen, mlr zu verwenden, was dasselbe tut. Je mehr Rauschen Sie haben, desto geringer ist die Tiefe (oft nur 1 oder 2).
Ric
Vielen Dank für die Antwort, aber es ist nicht das, was ich in meinem Kommentar frage: D. Ich habe den Link ("hier") vor meinem Kommentar gelesen, aber Sie haben nicht kommentiert, welche Tiefe aufgrund Ihres Kriteriums (MAE?) Die optimale war, nur dass " Ich habe Ihren Rat befolgt ... bis 3, aber ... ". War "3" also basierend auf Ihrem RMSE / MAE-Fehler optimal oder was sonst (minimale Diskrepanz zwischen Test- / Trainingsfehler)? Zum Beispiel suche ich routinemäßig direkt in der Baumtiefe, aber vielleicht haben Sie nicht "3" verwendet, aber trotzdem?
usεr11852
Streng kommentarmäßig, warum sind Sie von caretzu mlrgewechselt? Für mich scheinen sie sich ziemlich zu überschneiden, vielleicht verpasse ich etwas anderes.
usεr11852
@ usεr11852 für den ersten Kommentar: Wenn dies ein ML-Wettbewerb ist, sollten Sie höchstwahrscheinlich die Tiefe im Raster durchsuchen. Dies war ein Prognosewettbewerb mit einem klaren Signal, und meiner Meinung nach war die Auswahl guter Funktionen (z. B. Wettervariablen) entscheidender. Da das Ziel einen Regimewechsel durchführte, hatte ich während des Live-Peroids nicht genügend repräsentative Daten, so dass ich nur eine Tiefe von drei nahm.
Ric