Як знайти інтервал прогнозування GBM


12

Я працюю з моделями GBM, використовуючи пакет caret і шукаю спосіб вирішити інтервали передбачення для моїх прогнозованих даних. Я широко шукав, але придумав лише кілька ідей, щоб знайти інтервали передбачення для Random Forest. Будь-який код допомоги / R буде дуже вдячний!

Відповіді:


4

EDIT: Як зазначено в коментарях нижче, це дає інтервали довіри для прогнозів, а не строго прогнозні інтервали. Трохи викликав задоволення моєю відповіддю, і мені слід було б подумати над цим.

Не соромтеся ігнорувати цю відповідь або спробуйте побудувати на коді, щоб отримати інтервали передбачення.


Я використовував простий завантажувальний інструмент для створення інтервалів передбачення кілька разів, але можуть бути й інші (кращі) способи.

Розглянемо oilдані в caretпакеті та припустимо, що ми хочемо генерувати часткові залежності та 95% інтервали для впливу Stearic на Palmitic. Нижче - лише простий приклад, але ви можете пограти з ним відповідно до ваших потреб. Переконайтеся, що gbmпакет оновлений, щоб дозволити grid.pointsаргумент вplot.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))))

Це один із способів зробити це, принаймні, спробувати врахувати невизначеності, що виникають при налаштуванні gbm. Аналогічний підхід застосовувався в http://onlinelibrary.wiley.com/doi/10.2193/2006-503/ab Abstract

Іноді оцінка точки знаходиться за межами інтервалу, але модифікація сітки настройки (тобто збільшення кількості дерев та / або глибини) зазвичай вирішує це.

Сподіваюся, це допомагає!


1
Якщо я правильно зрозумів ваш код, у вас є 95% інтервал довіри для прогнозів. Це не те саме , що інтервал прогнозування 95% , який додає залишкову (випадкову) помилку.
Hong Ooi

D'oh! Ви праві. Був трохи надто швидким у відповіді. Дякую, я відредагую свою відповідь.
ErikL

дякую за допомогу! У мене виникають проблеми, хоча з функцією завантаження. Я опублікував цю проблему на stats.stackexchange.com/questions/117329/… . Я не зовсім впевнений, як правильно налаштувати функцію завантаження з моїм набором даних.
CooperBuckeye05

1
Я думаю, на даний момент це не те, що я шукаю, тому я все ще шукаю відповідь!
CooperBuckeye05
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.