Чи мають прогнози моделі випадкового лісу інтервал прогнозування?


52

Якщо я запускаю randomForestмодель, я можу робити прогнози на основі моделі. Чи є спосіб отримати інтервал прогнозування кожного з прогнозів таким, що я знаю, наскільки "впевнена" модель у своїй відповіді. Якщо це можливо, це просто ґрунтується на мінливості залежної змінної для всієї моделі чи вона матиме більш широкі та вузькі інтервали залежно від конкретного дерева рішень, яке виконувались для конкретного прогнозу?


3
AFAIK, всі бібліотеки РФ мають певну 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

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

[мк+σ,мк-σ][мк+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

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

Тепер це дає зрозуміти, що обчислення інтервалів прогнозування за другим підходом набагато точніше і дає результати, досить близькі до інтервалу прогнозування від лінійної регресії.

мкiМSЕiN(мкi,RМSЕi)N(мкi/н,RМSЕi/н)

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 стовпців для кожного рядка - це регулярний вихід РФ, який би дав будь-який спосіб. Тепер, щоб отримати інтервал прогнозування, можна сказати +/- 2 std. все, що вам потрібно зробити - це для кожного ряду від 1000 значень обчислювати +/- 2 ст. відхилення і зробіть ці верхні та нижні межі вашим прогнозом.

По-друге, у випадку класифікації пам’ятайте, що кожне дерево виводить або 1, або 0 (за замовчуванням), а сума за всі 1000 дерев, поділених на 1000, дає ймовірність класу (у разі двійкової класифікації). Щоб поставити інтервал передбачення на ймовірність, вам потрібно змінити хв. опція nodesize (див. документацію randomForest для точної назви цього параметра), як тільки ви встановите це значення >> 1, то окремі дерева будуть виводити числа від 1 до 0. Тепер звідси ви можете повторити той самий процес, як описано вище для завдання регресії.

Сподіваюся, це має сенс.


Я не пробував цього, але, здається, це має сенс. Дякую за відповідь на моє давнє запитання.
Дін Макгрегор

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

1
@GregSnow: Що ви отримаєте від того, що я описав вище, це визначеність інтервалу прогнозування. Зауважте, що інтервали прогнозування, як правило, набагато ширші, ніж довірчі інтервали, оскільки довірчі інтервали дійсно визначають, де лежить середня статистика квантитії, коли прогноз стосується лише одного спостереження, отже, більша невизначеність і, отже, більш широкі інтервали. 1000 прогнозів, які ви отримаєте від 1000 дерев, можна вважати завантаженим зразком, і тут не потрібно застосовувати припущення щодо нормальності. Навіть простий аналіз децилів дасть хороші результати.

5
@SashikanthDareddy, те, що ви отримаєте від того, що ви описуєте, - це точно не інтервал прогнозування. Інтервал прогнозування визначається більше, ніж просто ширшим. Так, окремі дерева утворюють завантажувальну стрічку, але завантажувальна програма оцінює параметри, а не окремі значення. Інтервал прогнозування дуже залежить від розподілу окремих балів. Це свідчить про те, що ваш метод дає інтервал для пропорцій із категоричним результатом замість категорій. Дивіться мій приклад у доданій відповіді.
Грег Сніг

0

Я спробував кілька варіантів (це все WIP):

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

  2. Потім я перетворив її на кілька задач класифікації, кожна з яких була нижньою межею для діапазону (результат моделі полягала в тому, переходила вона нижню межу чи ні), а потім запускала всі моделі (~ 20), а потім комбінував результат, щоб отримати остаточну відповідь як діапазон. Це працює краще, ніж 1 вище, але не так добре, як мені потрібно. Я все ще працюю над вдосконаленням цього підходу.

Я використовував оцінку OOB і «відпуск один», щоб вирішити, наскільки хороші / погані мої моделі.


0

Проблема побудови інтервалів прогнозування для випадкових прогнозів лісу розглянута в наступній роботі:

Чжан, Хаоже, Джошуа Циммерман, Дан Нетлтон і Даніель Дж. Нордман. "Інтервали прогнозування випадкових лісів." Американський статистик, 2019.

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

Установка

Щоб встановити пакет rfinterval R :

#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 репутацій, можете опублікувати коментар до ОП. Тим часом, ви можете позначити Q для закриття як дублікат.
gung - Відновіть Моніку
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.