Comment trouver un intervalle de prédiction GBM

12

Je travaille avec des modèles GBM en utilisant le package caret et cherche à trouver une méthode pour résoudre les intervalles de prédiction pour mes données prédites. J'ai beaucoup cherché, mais je n'ai trouvé que quelques idées pour trouver des intervalles de prédiction pour Random Forest. Tout code d'aide / R serait grandement apprécié!

CooperBuckeye05
la source

Réponses:

4

EDIT: Comme indiqué dans les commentaires ci-dessous, cela donne les intervalles de confiance pour les prédictions et non strictement les intervalles de prédiction . Était un peu déclencheur satisfait de ma réponse et aurait dû y réfléchir un peu plus.

N'hésitez pas à ignorer cette réponse ou essayez de vous baser sur le code pour obtenir les intervalles de prédiction.


J'ai utilisé le bootstrap simple pour créer des intervalles de prédiction à quelques reprises mais il peut y avoir d'autres (meilleures) façons.

Considérez les oildonnées du caretpackage et supposons que nous voulons générer des dépendances partielles et des intervalles de 95% pour l'effet de Stearic sur Palmitic. Ci-dessous est juste un exemple simple, mais vous pouvez jouer avec pour répondre à vos besoins. Assurez-vous que le gbmpackage est mis à jour pour autoriser l' grid.pointsargument dansplot.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))))

C'est une façon de le faire qui essaie au moins de tenir compte des incertitudes résultant du réglage du gbm. Une approche similaire a été utilisée dans http://onlinelibrary.wiley.com/doi/10.2193/2006-503/abstract

Parfois, l'estimation ponctuelle est en dehors de l'intervalle, mais la modification de la grille de réglage (c'est-à-dire l'augmentation du nombre d'arbres et / ou de la profondeur) résout généralement cela.

J'espère que cela t'aides!

ErikL
la source
1
Si je comprends bien votre code, ce que vous avez, c'est un intervalle de confiance de 95% pour les prédictions. Ce n'est pas la même chose qu'un intervalle de prédiction à 95% , ce qui ajoute l'erreur résiduelle (aléatoire).
Hong Ooi
Oh! Vous avez raison. Répondait un peu trop vite. Merci, je vais modifier ma réponse.
ErikL
Merci pour l'aide! J'ai cependant un problème avec la fonction d'amorçage. J'ai publié ce problème sur stats.stackexchange.com/questions/117329/… . Je ne sais pas exactement comment configurer correctement la fonction d'amorçage avec mon jeu de données.
CooperBuckeye05
1
Je suppose qu'à ce stade, ce n'est pas ce que je cherche, donc je cherche toujours une réponse!
CooperBuckeye05