So finden Sie ein GBM-Vorhersageintervall

12

Ich arbeite mit GBM-Modellen unter Verwendung des Caret-Pakets und suche nach einer Methode, um die Vorhersageintervalle für meine vorhergesagten Daten zu lösen. Ich habe intensiv gesucht, aber nur ein paar Ideen gefunden, um Vorhersageintervalle für Random Forest zu finden. Jeder Hilfe / R-Code wäre sehr dankbar!

CooperBuckeye05
quelle

Antworten:

4

EDIT: Wie in den Kommentaren unten ausgeführt, gibt dies die Konfidenzintervalle für Vorhersagen und nicht ausschließlich die Vorhersageintervalle an . War etwas auslöserisch mit meiner Antwort zufrieden und hätte diesbezüglich etwas extra überlegen sollen.

Sie können diese Antwort ignorieren oder versuchen, auf dem Code aufzubauen, um die Vorhersageintervalle zu erhalten.


Ich habe den einfachen Bootstrap ein paar Mal zum Erstellen von Vorhersageintervallen verwendet, aber es gibt möglicherweise andere (bessere) Möglichkeiten.

Betrachten Sie die oilDaten im caretPaket und nehmen Sie an, dass wir partielle Abhängigkeiten und 95% -Intervalle für die Wirkung von Stearic auf Palmitic erzeugen möchten. Im Folgenden finden Sie nur ein einfaches Beispiel, aber Sie können damit herumspielen, um es Ihren Bedürfnissen anzupassen. Stellen Sie sicher, dass das gbmPaket aktualisiert wurde, um das grid.pointsArgument zuzulassenplot.gbm

library(caret)
data(oil)
#train the gbm using just the defaults.
tr <- train(Palmitic ~ ., method = "gbm" ,data = fattyAcids, verbose = FALSE)

#Points to be used for prediction. Use the quartiles here just for illustration
x.pt <- quantile(fattyAcids$Stearic, c(0.25, 0.5, 0.75))

#Generate the predictions, or in this case, the partial dependencies at the selected points. Substitute plot() for predict() to get predictions
p <- plot(tr$finalModel, "Stearic", grid.levels = x.pt, return.grid = TRUE)

#Bootstrap the process to get prediction intervals
library(boot)

bootfun <- function(data, indices) {
  data <- data[indices,]

  #As before, just the defaults in this example. Palmitic is the first variable, hence data[,1]
  tr <- train(data[,-1], data[,1], method = "gbm", verbose=FALSE)

  # ... other steps, e.g. using the oneSE rule etc ...
  #Return partial dependencies (or predictions)

  plot(tr$finalModel, "Stearic", grid.levels = x.pt, return.grid = TRUE)$y
  #or predict(tr$finalModel, data = ...)
}

#Perform the bootstrap, this can be very time consuming. Just 99 replicates here but we usually want to do more, e.g. 500. Consider using the parallel option
b <- boot(data = fattyAcids, statistic = bootfun, R = 99)

#Get the 95% intervals from the boot object as the 2.5th and 97.5th percentiles
lims <- t(apply(b$t, 2, FUN = function(x) quantile(x, c(0.025, 0.975))))

Dies ist eine Möglichkeit, die zumindest versucht, die Unsicherheiten zu berücksichtigen, die sich aus der Abstimmung des GbM ergeben. Ein ähnlicher Ansatz wurde in http://onlinelibrary.wiley.com/doi/10.2193/2006-503/abstract verwendet

Manchmal liegt die Punktschätzung außerhalb des Intervalls, aber das Ändern des Abstimmungsrasters (dh das Erhöhen der Anzahl der Bäume und / oder der Tiefe) löst dies normalerweise.

Hoffe das hilft!

ErikL
quelle
1
Wenn ich Ihren Code richtig verstehe, haben Sie ein Konfidenzintervall von 95% für Vorhersagen. Dies ist nicht dasselbe wie ein Vorhersageintervall von 95% , bei dem der verbleibende (zufällige) Fehler addiert wird.
Hong Ooi
D'oh! Du hast Recht. War etwas zu schnell beim Antworten. Danke, ich bearbeite meine Antwort.
ErikL
danke für die Hilfe! Ich habe jedoch ein Problem mit der Bootstrap-Funktion. Ich habe dieses Problem unter stats.stackexchange.com/questions/117329/… gepostet . Ich bin nicht genau sicher, wie ich die Bootstrap-Funktion mit meinem Datensatz richtig einrichten soll.
CooperBuckeye05
1
Ich vermute, an diesem Punkt ist das nicht das, wonach ich suche, also suche ich immer noch nach einer Antwort!
CooperBuckeye05