Jak znaleźć przedział prognozy GBM

12

Pracuję z modelami GBM przy użyciu pakietu Caret i szukam metody rozwiązania przedziałów prognoz dla moich przewidywanych danych. Szukałem obszernie, ale wpadłem tylko na kilka pomysłów, aby znaleźć przedziały prognoz dla Losowego Lasu. Każdy kod pomocy / R byłby bardzo mile widziany!

CooperBuckeye05
źródło

Odpowiedzi:

4

EDYCJA: Jak wskazano w komentarzach poniżej, daje to przedziały ufności dla prognoz, a nie ściśle przedziały prognozowania . Byłem trochę zadowolony z mojej odpowiedzi i powinienem to przemyśleć.

Zignoruj ​​tę odpowiedź lub spróbuj zbudować kod, aby uzyskać przedziały prognozowania.


Użyłem prostego bootstrapu do tworzenia interwałów przewidywania kilka razy, ale mogą istnieć inne (lepsze) sposoby.

Rozważ oildane w caretpakiecie i załóżmy, że chcemy wygenerować częściowe zależności i przedziały 95% dla efektu Stearic na Palmitic. Poniżej znajduje się tylko prosty przykład, ale możesz bawić się nim w zależności od potrzeb. Upewnij się, że gbmpakiet jest zaktualizowany, aby umożliwić grid.pointsargument wplot.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))))

Jest to jeden ze sposobów, aby to zrobić, które przynajmniej starają się wyjaśnić niepewności wynikające z dostrajania GBM. Podobne podejście zastosowano w http://onlinelibrary.wiley.com/doi/10.2193/2006-503/abstract

Czasami oszacowanie punktowe jest poza przedziałem, ale modyfikacja siatki strojenia (tj. Zwiększenie liczby drzew i / lub głębokości) zwykle rozwiązuje ten problem.

Mam nadzieję że to pomoże!

ErikL
źródło
1
Jeśli dobrze rozumiem twój kod, masz 95% przedział ufności dla prognoz. To nie to samo co przedział predykcji 95% , który dodaje błąd resztkowy (losowy).
Hong Ooi
Nie! Masz rację. Trochę za szybko odpowiadałem. Dzięki, zredaguję moją odpowiedź.
ErikL
dzięki za pomoc! Mam jednak problem z funkcją ładowania początkowego. Zamieściłem tę kwestię w stats.stackexchange.com/questions/117329/... . Nie jestem do końca pewien, jak poprawnie skonfigurować funkcję ładowania początkowego w moim zestawie danych.
CooperBuckeye05
1
Myślę, że w tym momencie nie tego szukam, więc wciąż szukam odpowiedzi!
CooperBuckeye05