2017-06-07 15 views
1

Ich arbeite gerade an einem Datensatz, der 4 kategorische Eingabevariablen und eine numerische Ausgabe enthält.Konfidenzintervall für die Xgboost-Regression in R

Ich habe ein Modell mit dem Paket xgboost in R erstellt. Aber ich kann keinen Weg finden, ein CI zu berechnen.

Wie kann ich das Konfidenzintervall für meine Vorhersagen berechnen? Ich habe this answer to a classification problem gefunden, aber ich verstehe es nicht richtig. Kann mir jemand das Problem genauer erklären?

Antwort

0

Soweit ich das beurteilen kann, gibt es keine direkte Möglichkeit, dies mit dem Paket xgboost zu berechnen.

Der verknüpfte Artikel gab Ihnen einen Rahmen dafür, wie Sie es tun könnten. Es bezieht sich darauf, "Bagging" zu machen, was im Grunde bedeutet, dasselbe Modell viele Male zu erzeugen (das hat Zufälligkeit). Wenn Sie für xgboost den colsample_bytree (die zufällige Auswahl der in den einzelnen Baumstrukturen zu verwendenden Spalten) auf < 1 und subsample (das zufällige Prozent der zu verwendenden Zeilen in jedem Baum) < 1 setzen, wird ein "zufälliges Element" eingeführt "zum Modell.

Wenn Sie die obigen Variablen auf weniger als 1 setzen, hätten Sie ein Modell mit einem zufälligen Element. Wenn Sie dieses Modell zu 100 verschiedenen Zeitpunkten ausführen würden, jedes Mal mit einem anderen Startwert, würden Sie 100 einzigartige xgboost-Modelle mit 100 verschiedenen Vorhersagen für jede Beobachtung erhalten. Unter Verwendung dieser 100 Vorhersagen können Sie ein benutzerdefiniertes Konfidenzintervall unter Verwendung des Mittelwerts und der Standardabweichung der 100 Vorhersagen erstellen.

Ich kann nicht dafür bürgen, wie effektiv oder zuverlässig diese benutzerdefinierten Konfidenzintervalle sein würden, aber wenn Sie dem Beispiel im verlinkten Artikel folgen wollten, wie würden Sie es tun, und dies ist die Erklärung dessen, worüber sie gesprochen haben.

Hier ist ein Beispielcode, dies zu tun, vorausgesetzt, Sie 500 Beobachtungen haben:

##make an empty data frame with a column per bagging run 
predictions <- data.frame(matrix(0,500,100)) 

library(xgboost) 

##come up with 100 unique seed values that you can reproduce 
set.seed(123) 
seeds <- runif(100,1,100000) 

for (i in 1:ncol(predictions){ 

set.seed(seeds[i]) 
xgb_model <- xgboost(data = train, 
        label = y, 
        objective = "reg:linear", 
        eval_metric = "rmse", 
        subsample = .8, 
        colsample_bytree = .8 
        ) 

predictions[,i] <- predict(xgb_model,newdata = test) 

} 
0

Eine große Möglichkeit, die Quantile von einer xgboost Regression zu erhalten, ist in diesem Blog-Eintrag beschrieben. Ich glaube, das ist eine elegantere Lösung als die andere Methode in der verknüpften Frage (für die Regression) vorschlagen.

https://www.bigdatarepublic.nl/regression-prediction-intervals-with-xgboost/

Grundsätzlich kann Ihr Problem wie folgt beschrieben werden (aus dem Blog):

In dem Fall, dass der Quantilswert q relativ weit entfernt von den beobachteten Werten innerhalb der Partition ist, dann Da der Gradient und der Hessian beide für eine große Differenz x_i-q konstant sind, bleibt der Punktestand Null und es findet keine Teilung statt.

Dann wird die folgende Lösung vorgeschlagen:

Eine interessante Lösung, die durch eine Spaltung zu zwingen, ist die Randomisierung bis zum Gradient hinzufügen. Wenn die Unterschiede zwischen den Beobachtungen x_i und den alten Quantilschätzungen q innerhalb der Partition groß sind, wird diese Randomisierung eine zufällige Aufteilung dieses Volumens erzwingen.

Verwandte Themen