Имеют ли предсказания модели случайного леса интервал предсказания?


52

Если я запускаю randomForestмодель, я могу делать прогнозы на основе этой модели. Есть ли способ получить интервал прогнозирования для каждого из прогнозов, чтобы я знал, насколько «уверена» модель в своем ответе. Если это возможно, то просто ли это основано на изменчивости зависимой переменной для всей модели или она будет иметь более широкие и узкие интервалы в зависимости от конкретного дерева решений, которое использовалось для конкретного прогноза?


3
AFAIK, все библиотеки RF имеют какую-то scoreфункцию для оценки производительности. Поскольку выходные данные основаны на большинстве голосов деревьев в лесу, в случае классификации это даст вам вероятность того, что этот результат будет правдивым, основываясь на распределении голосов. Я не уверен насчет регрессии .... Какую библиотеку вы используете?
sashkello

1
Вы должны прочитать это: stats.stackexchange.com/questions/12425/…
0asa

Ответы:


40

Это частично ответ на @Sashikanth Dareddy (так как он не помещается в комментарии) и частично ответ на оригинальное сообщение.

Запомните, что такое интервал прогнозирования, это интервал или набор значений, где мы прогнозируем, что будущие наблюдения будут лежать. Обычно интервал прогнозирования имеет 2 основных элемента, которые определяют его ширину, фрагмент, представляющий неопределенность относительно прогнозируемого среднего значения (или другого параметра), это часть доверительного интервала, и фрагмент, представляющий изменчивость отдельных наблюдений вокруг этого среднего значения. Доверительный интервал является довольно устойчивым благодаря центральной предельной теореме, и в случае случайного леса также помогает начальная загрузка. Но интервал прогнозирования полностью зависит от предположений о том, как данные распределяются, учитывая, что переменные предиктора, CLT и начальная загрузка не влияют на эту часть.

Интервал прогнозирования должен быть шире, если соответствующий доверительный интервал также будет шире. Другие вещи, которые могут повлиять на ширину интервала прогнозирования, - это предположения о равной дисперсии или нет, это должно исходить из знаний исследователя, а не из модели случайного леса.

Интервал прогнозирования не имеет смысла для категорического результата (вы могли бы сделать набор прогнозирования, а не интервал, но большую часть времени он, вероятно, был бы не очень информативным).

Мы можем увидеть некоторые проблемы, связанные с интервалами прогнозирования, путем симуляции данных, когда мы знаем точную правду. Рассмотрим следующие данные:

set.seed(1)

x1 <- rep(0:1, each=500)
x2 <- rep(0:1, each=250, length=1000)

y <- 10 + 5*x1 + 10*x2 - 3*x1*x2 + rnorm(1000)

Эти конкретные данные соответствуют предположениям для линейной регрессии и довольно просты для случайного подбора леса. Мы знаем из «истинной» модели, что когда оба предиктора равны 0, среднее значение равно 10, мы также знаем, что отдельные точки следуют нормальному распределению со стандартным отклонением 1. Это означает, что интервал прогнозирования 95% основан на совершенных знаниях для эти точки будут от 8 до 12 (ну, на самом деле, с 8.04 до 11.96, но округление делает это проще). Любой предполагаемый интервал прогнозирования должен быть шире этого (отсутствие точной информации добавляет ширину для компенсации) и включать этот диапазон.

Давайте посмотрим на интервалы от регрессии:

fit1 <- lm(y ~ x1 * x2)

newdat <- expand.grid(x1=0:1, x2=0:1)

(pred.lm.ci <- predict(fit1, newdat, interval='confidence'))
#        fit       lwr      upr
# 1 10.02217  9.893664 10.15067
# 2 14.90927 14.780765 15.03778
# 3 20.02312 19.894613 20.15162
# 4 21.99885 21.870343 22.12735

(pred.lm.pi <- predict(fit1, newdat, interval='prediction'))
#        fit      lwr      upr
# 1 10.02217  7.98626 12.05808
# 2 14.90927 12.87336 16.94518
# 3 20.02312 17.98721 22.05903
# 4 21.99885 19.96294 24.03476

Мы можем видеть, что есть некоторая неопределенность в оценочных средних (доверительный интервал), и это дает нам интервал прогнозирования, который шире (но включает) диапазон от 8 до 12.

Теперь давайте посмотрим на интервал, основанный на индивидуальных предсказаниях отдельных деревьев (мы должны ожидать, что они будут шире, поскольку случайный лес не извлекает выгоду из предположений (которые, как мы знаем, справедливо для этих данных), которые делает линейная регрессия):

library(randomForest)
fit2 <- randomForest(y ~ x1 + x2, ntree=1001)

pred.rf <- predict(fit2, newdat, predict.all=TRUE)

pred.rf.int <- apply(pred.rf$individual, 1, function(x) {
  c(mean(x) + c(-1, 1) * sd(x), 
  quantile(x, c(0.025, 0.975)))
})

t(pred.rf.int)
#                           2.5%    97.5%
# 1  9.785533 13.88629  9.920507 15.28662
# 2 13.017484 17.22297 12.330821 18.65796
# 3 16.764298 21.40525 14.749296 21.09071
# 4 19.494116 22.33632 18.245580 22.09904

Интервалы шире, чем интервалы прогнозирования регрессии, но они не охватывают весь диапазон. Они включают в себя истинные значения и, следовательно, могут быть допустимыми в качестве доверительных интервалов, но они только предсказывают, где находится среднее (прогнозируемое значение), но не являются дополнительным компонентом для распределения вокруг этого среднего. Для первого случая, когда x1 и x2 равны 0, интервалы не опускаются ниже 9,7, это очень отличается от истинного интервала прогнозирования, который уменьшается до 8. Если мы создадим новые точки данных, то будет несколько точек (гораздо больше чем 5%), которые находятся в интервалах истинности и регрессии, но не попадают в интервалы случайного леса.

Чтобы сгенерировать интервал прогнозирования, вам нужно будет сделать некоторые строгие предположения о распределении отдельных точек вокруг прогнозируемых средних, затем вы можете взять прогнозы из отдельных деревьев (загруженный фрагмент доверительного интервала), а затем сгенерировать случайное значение из предполагаемого распределение с этим центром. Квантили для этих сгенерированных кусочков могут формировать интервал прогнозирования (но я все равно протестирую его, возможно, вам придется повторить процесс еще несколько раз и объединить).

Вот пример выполнения этого путем добавления нормальных (так как мы знаем, что исходные данные использовали нормальные) отклонений к прогнозам со стандартным отклонением, основанным на оценочной MSE из этого дерева:

pred.rf.int2 <- sapply(1:4, function(i) {
  tmp <- pred.rf$individual[i, ] + rnorm(1001, 0, sqrt(fit2$mse))
  quantile(tmp, c(0.025, 0.975))
})
t(pred.rf.int2)
#           2.5%    97.5%
# [1,]  7.351609 17.31065
# [2,] 10.386273 20.23700
# [3,] 13.004428 23.55154
# [4,] 16.344504 24.35970

Эти интервалы содержат интервалы, основанные на совершенных знаниях, поэтому выглядите разумно. Но они будут сильно зависеть от сделанных допущений (допущения действительны здесь, потому что мы использовали знания о том, как моделировались данные, они могут быть не такими достоверными в реальных случаях данных). Я все еще повторял бы симуляции несколько раз для данных, которые больше похожи на ваши реальные данные (но симулированы, чтобы вы знали правду) несколько раз, прежде чем полностью доверять этому методу.


11

Я понимаю, что это старая статья, но я провел несколько симуляций на эту тему и подумал, что поделюсь своими выводами.

@GregSnow сделал очень подробный пост об этом, но я считаю, что при расчете интервала с использованием прогнозов по отдельным деревьям он смотрел на который составляет только 70% интервал прогнозирования. Нам нужно взглянуть на чтобы получить интервал прогнозирования 95%.[ μ + 1,96 σ , μ - 1,96 σ ][μ+σ,μσ][μ+1.96σ,μ1.96σ]

Внося это изменение в код @GregSnow, мы получаем следующие результаты

set.seed(1)
x1 <- rep( 0:1, each=500 )
x2 <- rep( 0:1, each=250, length=1000 )
y <- 10 + 5*x1 + 10*x2 - 3*x1*x2 + rnorm(1000)

library(randomForest)
fit2 <- randomForest(y~x1+x2)
pred.rf <- predict(fit2, newdat, predict.all=TRUE)
pred.rf.int <- t(apply( pred.rf$individual, 1, function(x){ 
  c( mean(x) + c(-1.96,1.96)*sd(x), quantile(x, c(0.025,0.975)) )}))

pred.rf.int
                          2.5%    97.5%
1  7.826896 16.05521  9.915482 15.31431
2 11.010662 19.35793 12.298995 18.64296
3 14.296697 23.61657 14.749248 21.11239
4 18.000229 23.73539 18.237448 22.10331

Теперь, сравнивая их с интервалами, сгенерированными путем добавления нормального отклонения к прогнозам со стандартным отклонением, как MSE, как @GregSnow предположил, что мы получаем,

pred.rf.int2 <- sapply(1:4, function(i) {
   tmp <- pred.rf$individual[i,] + rnorm(1000, 0, sqrt(fit2$mse))
   quantile(tmp, c(0.025, 0.975))
   })
t(pred.rf.int2)
          2.5%    97.5%
[1,]  7.486895 17.21144
[2,] 10.551811 20.50633
[3,] 12.959318 23.46027
[4,] 16.444967 24.57601

Интервал по обоим этим подходам сейчас выглядит очень близко. Построение интервала прогнозирования для трех подходов по распределению ошибок в этом случае выглядит следующим образом

введите описание изображения здесь

  • Черные линии = интервалы прогнозирования от линейной регрессии,
  • Красные линии = интервалы случайных лесов, рассчитанные по индивидуальным прогнозам,
  • Синие линии = интервалы случайного леса, рассчитанные путем добавления нормального отклонения к прогнозам

Теперь давайте снова запустим симуляцию, но на этот раз увеличим дисперсию ошибки. Если наши расчеты интервалов прогнозирования хороши, мы должны получить более широкие интервалы, чем мы получили выше.

set.seed(1)
x1 <- rep( 0:1, each=500 )
x2 <- rep( 0:1, each=250, length=1000 )
y <- 10 + 5*x1 + 10*x2 - 3*x1*x2 + rnorm(1000,mean=0,sd=5)

fit1 <- lm(y~x1+x2)
newdat <- expand.grid(x1=0:1,x2=0:1)
predict(fit1,newdata=newdat,interval = "prediction")
      fit       lwr      upr
1 10.75006  0.503170 20.99695
2 13.90714  3.660248 24.15403
3 19.47638  9.229490 29.72327
4 22.63346 12.386568 32.88035

set.seed(1)
fit2 <- randomForest(y~x1+x2,localImp=T)
pred.rf.int <- t(apply( pred.rf$individual, 1, function(x){ 
  c( mean(x) + c(-1.96,1.96)*sd(x), quantile(x, c(0.025,0.975)) )}))
pred.rf.int
                          2.5%    97.5%
1  7.889934 15.53642  9.564565 15.47893
2 10.616744 18.78837 11.965325 18.51922
3 15.024598 23.67563 14.724964 21.43195
4 17.967246 23.88760 17.858866 22.54337

pred.rf.int2 <- sapply(1:4, function(i) {
   tmp <- pred.rf$individual[i,] + rnorm(1000, 0, sqrt(fit2$mse))
   quantile(tmp, c(0.025, 0.975))
   })
t(pred.rf.int2)
         2.5%    97.5%
[1,] 1.291450 22.89231
[2,] 4.193414 25.93963
[3,] 7.428309 30.07291
[4,] 9.938158 31.63777

введите описание изображения здесь

Теперь это ясно дает понять, что вычисление интервалов прогнозирования с помощью второго подхода является гораздо более точным и дает результаты, довольно близкие к интервалу прогнозирования из линейной регрессии.

Принимая предположение о нормальности, есть еще один более простой способ вычисления интервалов прогнозирования из случайного леса. Из каждого отдельного дерева мы имеем предсказанное значение ( ), а также среднеквадратическую ошибку ( ). Таким образом, предсказание для каждого отдельного дерева можно представить как . Используя свойства нормального распределения, наш прогноз из случайного леса будет иметь распределение . Применяя это к примеру, который мы обсуждали выше, мы получаем следующие результаты M S E i N ( μ i , R M S E i ) N ( μ i / n , R M S E i / n )μiMSEiN(μi,RMSEi)N(μi/n,RMSEi/n)

mean.rf <- pred.rf$aggregate
sd.rf <- mean(sqrt(fit2$mse))
pred.rf.int3 <- cbind(mean.rf - 1.96*sd.rf, mean.rf + 1.96*sd.rf)
pred.rf.int3
1  1.332711 22.09364
2  4.322090 25.08302
3  8.969650 29.73058
4 10.546957 31.30789

Они очень хорошо сочетаются с линейными модельными интервалами, а также с подходом, предложенным @GregSnow. Но обратите внимание, что основополагающее предположение во всех обсуждаемых нами методах состоит в том, что ошибки следуют нормальному распределению.


10

Если вы используете R, вы можете легко получить интервалы прогнозирования для прогнозов регрессии случайных лесов: просто используйте пакет quantregForest(доступен на CRAN ) и прочитайте статью Н. Майнсхаузена о том, как условные квантили можно вывести с помощью лесов квантильной регрессии и как они может использоваться для построения интервалов прогнозирования. Очень информативно, даже если вы не работаете с R!


Похоже, что документ был перенесен сюда: jmlr.org/papers/volume7/meinshausen06a/meinshausen06a.pdf
Восстановить Монику

2
Это похоже на соответствующий ответ и не требует распределительных предположений относительно прогнозирующего интервала. Существует учебник о том , как сделать это в Python здесь: blog.datadive.net/prediction-intervals-for-random-forests
Colin

6

Это легко решить с помощью randomForest.

Сначала позвольте мне разобраться с регрессионной задачей (если в вашем лесу 1000 деревьев). В predictфункции у вас есть возможность вернуть результаты из отдельных деревьев. Это означает, что вы получите 1000 столбцов вывода. Мы можем взять среднее значение из 1000 столбцов для каждой строки - это обычный выходной сигнал RF, который был бы получен любым способом. Теперь, чтобы получить интервал прогнозирования, скажем, +/- 2 стандарт. все отклонения, которые вам нужно сделать, это для каждой строки из 1000 значений вычислить +/- 2-й стандарт. отклонения и сделать их ваши верхние и нижние границы вашего прогноза.

Во-вторых, в случае классификации помните, что каждое дерево выводит либо 1, либо 0 (по умолчанию), а сумма по всем 1000 деревьям, деленная на 1000, дает вероятность класса (в случае двоичной классификации). Для того чтобы поставить интервал прогнозирования на вероятность, вам нужно изменить мин. Опция nodeize (см. документацию randomForest для точного названия этой опции), как только вы установите для нее значение >> 1, отдельные деревья будут выводить числа в диапазоне от 1 до 0. Теперь вы можете повторить тот же процесс, как описано выше для задача регрессии.

Я надеюсь, что в этом есть смысл.


Я не пробовал это, но, кажется, имеет смысл. Спасибо за ответ на мой старый вопрос.
Дин МакГрегор

1
Я думаю, что этот метод даст нечто большее, чем доверительный интервал, чем интервал прогнозирования. Результаты следует сравнивать с линейной моделью, в которой теория интервалов прогнозирования хорошо известна. Лучше всего на некоторых смоделированных данных, где правда известна и все предположения верны.
Грег Сноу,

1
@GregSnow: То, что вы получите от того, что я описал выше, определенно является интервалом прогнозирования. Обратите внимание, что интервалы прогнозирования, как правило, намного шире, чем доверительные интервалы, поскольку доверительные интервалы действительно указывают, где находится средняя статистика по количеству, где, поскольку прогнозирование связано только с одним наблюдением, следовательно, большая неопределенность и, следовательно, более широкие интервалы. 1000 предсказаний, которые вы получаете от 1000 деревьев, можно рассматривать как загрузочную выборку, и вам не нужно применять допущения нормальности здесь. Даже простой децильный анализ даст хорошие результаты.

5
@SashikanthDareddy, То, что вы получите от того, что вы описываете, определенно не является интервалом предсказания. Интервал прогнозирования определяется не просто шире. Да, отдельные деревья образуют загрузчик, но загрузчик оценивает параметры, а не отдельные значения. Интервал прогнозирования очень зависит от распределения отдельных точек. Тот факт, что ваш метод дает интервал для пропорций с категориальным результатом вместо категорий, показывает это. Смотрите мой пример в добавленном ответе.
Грег Сноу,

0

Я пробовал несколько вариантов (это все WIP):

  1. Я фактически сделал зависимую переменную проблемой классификации с результатами в виде диапазонов вместо одного значения. Результаты, которые я получил, были плохими по сравнению с использованием простого значения. Я отказался от этого подхода.

  2. Затем я преобразовал его в несколько задач классификации, каждая из которых была нижней границей для диапазона (результатом модели было то, будет ли она пересекать нижнюю границу или нет), а затем запустил все модели (~ 20), а затем объединить результат, чтобы получить окончательный ответ в виде диапазона. Это работает лучше, чем 1 выше, но не так хорошо, как мне нужно. Я все еще работаю над улучшением этого подхода.

Я использовал оценки OOB и "оставь один раз", чтобы решить, насколько хороши / плохи мои модели.


0

Проблема построения интервалов прогнозирования для случайных лесных прогнозов была рассмотрена в следующей статье:

Чжан, Хаоже, Джошуа Циммерман, Дэн Нетлтон и Даниэль Дж. Нордман. «Случайные интервалы прогнозирования леса». Американский статистик, 2019.

Пакет R "rfinterval" является его реализацией, доступной в CRAN.

Монтаж

Чтобы установить R-пакет rfinterval :

#install.packages("devtools")
#devtools::install_github(repo="haozhestat/rfinterval")
install.packages("rfinterval")
library(rfinterval)
?rfinterval

использование

Быстрый старт:

train_data <- sim_data(n = 1000, p = 10)
test_data <- sim_data(n = 1000, p = 10)

output <- rfinterval(y~., train_data = train_data, test_data = test_data,
                     method = c("oob", "split-conformal", "quantreg"),
                     symmetry = TRUE,alpha = 0.1)

### print the marginal coverage of OOB prediction interval
mean(output$oob_interval$lo < test_data$y & output$oob_interval$up > test_data$y)

### print the marginal coverage of Split-conformal prediction interval
mean(output$sc_interval$lo < test_data$y & output$sc_interval$up > test_data$y)

### print the marginal coverage of Quantile regression forest prediction interval
mean(output$quantreg_interval$lo < test_data$y & output$quantreg_interval$up > test_data$y)

Пример данных:

oob_interval <- rfinterval(pm2.5 ~ .,
                            train_data = BeijingPM25[1:1000, ],
                            test_data = BeijingPM25[1001:2000, ],
                            method = "oob",
                            symmetry = TRUE,
                            alpha = 0.1)
str(oob_interval)

1
Добро пожаловать на сайт, @ xiaolongmao. Вы можете принять участие в нашем туре . Пожалуйста, не публикуйте одинаковые ответы в нескольких темах. Попробуйте настроить свои ответы на конкретный вопрос в каждой теме. Если у вас есть случай, когда вы действительно считаете, что идентичный ответ полностью отвечает на вопрос, это означает, что вопрос является дубликатом. Когда вы достигнете 50 репутации, вы можете оставить комментарий к OP. Тем временем вы можете пометить Q для закрытия как дубликат.
gung - Восстановить Монику
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.