R: Що я бачу в часткових залежностях графіків gbm та RandomForest?


14

Власне, я думав, що зрозумів, що можна показати за допомогою часткової залежності, але, використовуючи дуже простий гіпотетичний приклад, я здивувався. У наступному фрагменті коду я генерую три незалежні змінні ( a , b , c ) та одну залежну змінну ( y ) з c, що показує тісний лінійний зв’язок з y , а a і b некорельовані з y . Я роблю аналіз регресії з підсиленим деревом регресії за допомогою пакету R gbm:

a <- runif(100, 1, 100)
b <- runif(100, 1, 100)
c <- 1:100 + rnorm(100, mean = 0, sd = 5)
y <- 1:100 + rnorm(100, mean = 0, sd = 5)
par(mfrow = c(2,2))
plot(y ~ a); plot(y ~ b); plot(y ~ c)
Data <- data.frame(matrix(c(y, a, b, c), ncol = 4))
names(Data) <- c("y", "a", "b", "c")
library(gbm)
gbm.gaus <- gbm(y ~ a + b + c, data = Data, distribution = "gaussian")
par(mfrow = c(2,2))
plot(gbm.gaus, i.var = 1)
plot(gbm.gaus, i.var = 2)
plot(gbm.gaus, i.var = 3)

Не дивно, що для змінних a і b ділянки часткової залежності дають горизонтальні лінії навколо середнього a . Що мені загадки - це графік для змінної c . Я отримую горизонтальні лінії для діапазонів c <40 і c > 60, а вісь y обмежена значеннями, близькими до середнього значення y . Оскільки a і b абсолютно не пов'язані з y (і, отже, в моделі змінюється значення 0), я очікував, що cпоказала б часткову залежність уздовж всього діапазону замість тієї сигмоподібної форми для дуже обмеженого діапазону її значень. Я намагався знайти інформацію у Фрідмана (2001) "Жадне наближення функції: машина для підвищення градієнта" та в Hastie et al. (2011) "Елементи статистичного навчання", але мої математичні навички занадто низькі, щоб зрозуміти всі рівняння та формули, що містяться в них. Отже, моє запитання: що визначає форму ділянки часткової залежності для змінної c ? (Будь-ласка, поясніть словами, зрозумілими не-математику!)

ДОБАВЕНО 17 квітня 2014 року:

Дочекавшись відповіді, я використовував ті самі приклади даних для аналізу з R-пакетом randomForest. Діаграми часткової залежності randomForest набагато більше нагадують те, що я очікував від графіків gbm: часткова залежність пояснювальних змінних a і b змінюється випадковим чином і близько 50, тоді як пояснювальна змінна c показує часткову залежність за весь її діапазон (і майже майже весь діапазон у ). Які можуть бути причини цих різних форм сюжетів часткової залежності в gbmі randomForest?

часткові сюжети gbm та randomForest

Тут модифікований код, який порівнює графіки:

a <- runif(100, 1, 100)
b <- runif(100, 1, 100)
c <- 1:100 + rnorm(100, mean = 0, sd = 5)
y <- 1:100 + rnorm(100, mean = 0, sd = 5)
par(mfrow = c(2,2))
plot(y ~ a); plot(y ~ b); plot(y ~ c)
Data <- data.frame(matrix(c(y, a, b, c), ncol = 4))
names(Data) <- c("y", "a", "b", "c")

library(gbm)
gbm.gaus <- gbm(y ~ a + b + c, data = Data, distribution = "gaussian")

library(randomForest)
rf.model <- randomForest(y ~ a + b + c, data = Data)

x11(height = 8, width = 5)
par(mfrow = c(3,2))
par(oma = c(1,1,4,1))
plot(gbm.gaus, i.var = 1)
partialPlot(rf.model, Data[,2:4], x.var = "a")
plot(gbm.gaus, i.var = 2)
partialPlot(rf.model, Data[,2:4], x.var = "b")
plot(gbm.gaus, i.var = 3)
partialPlot(rf.model, Data[,2:4], x.var = "c")
title(main = "Boosted regression tree", outer = TRUE, adj = 0.15)
title(main = "Random forest", outer = TRUE, adj = 0.85)

1
Ви можете дійсно налаштувати гіперпараметри на дотик. Я не впевнений, яка кількість дерев за замовчуванням у гбм, але це може бути настільки мало, що вона не встигає вивчити здорову кривизну.
Ши-Паркес

@Shea Parkes - Ти маєш рацію. Кількість дерев за замовчуванням становить 100, що було недостатньо для створення гарної моделі. З 2000 дерев ділянки часткової залежності gbm та випадкових лісів майже однакові.
користувач7417

Відповіді:


7

Я витратив деякий час на написання власного "part.function-plotter", перш ніж зрозумів, що він уже входить у бібліотеку R randomForest.

[EDIT ... але потім я витратив рік, створюючи пакет CRAN ForestFloor , який, на мій погляд, значно кращий, ніж класичні сюжети часткової залежності]

Сюжет Partial.function чудовий у випадках, коли ви показуєте цей приклад моделювання, де пояснювальна змінна не взаємодіє з іншими змінними. Якщо кожна пояснювальна змінна додатково вносить внесок у цільовий-Y якоюсь невідомою функцією, цей метод чудово показує, що оцінена прихована функція. Я часто бачу таке сплющення в межах часткових функцій.

Деякі причини: randomForsest має аргумент під назвою 'nodesize = 5', тобто жодне дерево не підрозділяє групу з 5 членів або менше. Тому кожне дерево не може розрізнити з подальшою точністю. Шар укладання / завантажувального шару ансамблю згладжує за допомогою голосування за багато крокових функцій окремих дерев - але лише посередині області даних. Наближаючись до кордонів даних, представлених простором, "амплітуда" parcial.function впаде. Встановлення nodesize = 3 та / або отримати більше спостережень порівняно зі шумом може зменшити цей ефект згладжування кордону ... Коли співвідношення сигнал / шум взагалі падає у випадкових лісах, масштаб прогнозів конденсується. Таким чином, прогнози не є абсолютно точними, а лише лінійно корелюються з цільовими. Ви можете бачити значення a і b як приклади та надзвичайно низьке співвідношення сигнал / шум, і тому ці часткові функції дуже плоскі. Приємна особливість випадкового лісу, що ви вже з діапазону передбачень навчальних наборів можете здогадатися, наскільки добре працює модель. OOB.прогнози також чудові ..

вирівнювання часткової ділянки в регіонах без даних є розумним: Оскільки випадковий ліс та CART є моделюванням, керованим даними, мені особисто подобається концепція, що ці моделі не екстраполюють. Таким чином, прогнозування c = 500 або c = 1100 точно таке ж, як c = 100, або в більшості випадків також c = 98.

Ось приклад коду зі зменшенням облямування кордону:

Я не пробував пакет gbm ...

ось деякий ілюстративний код на основі вашого прикладу ...

#more observations are created...
a <- runif(5000, 1, 100)
b <- runif(5000, 1, 100)
c <- (1:5000)/50 + rnorm(100, mean = 0, sd = 0.1)
y <- (1:5000)/50 + rnorm(100, mean = 0, sd = 0.1)
par(mfrow = c(1,3))
plot(y ~ a); plot(y ~ b); plot(y ~ c)
Data <- data.frame(matrix(c(y, a, b, c), ncol = 4))
names(Data) <- c("y", "a", "b", "c")
library(randomForest)
#smaller nodesize "not as important" when there number of observartion is increased
#more tress can smooth flattening so boundery regions have best possible signal to             noise, data specific how many needed

plot.partial = function() {
partialPlot(rf.model, Data[,2:4], x.var = "a",xlim=c(1,100),ylim=c(1,100))
partialPlot(rf.model, Data[,2:4], x.var = "b",xlim=c(1,100),ylim=c(1,100))
partialPlot(rf.model, Data[,2:4], x.var = "c",xlim=c(1,100),ylim=c(1,100))
}

#worst case! : with 100 samples from Data and nodesize=30
rf.model <- randomForest(y ~ a + b + c, data = Data[sample(5000,100),],nodesize=30)
plot.partial()

#reasonble settings for least partial flattening by few observations: 100 samples and nodesize=3 and ntrees=2000
#more tress can smooth flattening so boundery regions have best possiblefidelity
rf.model <- randomForest(y ~ a + b + c, data = Data[sample(5000,100),],nodesize=5,ntress=2000)
plot.partial()

#more observations is great!
rf.model <- randomForest(y ~ a + b + c,
 data = Data[sample(5000,5000),],
 nodesize=5,ntress=2000)
plot.partial()

4

Як було сказано в коментарях вище, модель gbm була б кращою за допомогою певної настройки параметрів. Простий спосіб виявити проблеми в моделі та необхідність таких параметрів - це генерування деяких діагностичних діаграм. Наприклад, для моделі gbm вище з параметрами за замовчуванням (і використовуючи пакет plotmo для створення графіків) у нас є

gbm.gaus <- gbm(y~., data = Data, dist = "gaussian")
library(plotmo)   # for the plotres function
plotres(gbm.gaus) # plot the error per ntrees and the residuals

що дає

сюжет

На лівій ділянці ми бачимо, що крива помилок не знизилася. А на правій ділянці залишки - це не те, що ми хотіли б.

Якщо ми відновимо модель з більшою кількістю дерев

gbm.gaus1 <- gbm(y~., data = Data, dist = "gaussian",
                 n.trees=5000, interact=3)
plotres(gbm.gaus1)

ми отримуємо

сюжет

Ми бачимо, що крива помилок знизу у великій кількості дерев, а ділянка залишків здоровіша. Ми також можемо побудувати графіки часткової залежності для нової моделі gbm та випадкової лісової моделі

library(plotmo)
plotmo(gbm.gaus1, pmethod="partdep", all1=TRUE, all2=TRUE)
plotmo(rf.model,  pmethod="partdep", all1=TRUE, all2=TRUE)

що дає

сюжет

На сьогодні графіки gbm та випадкових лісових моделей схожі, як і очікувалося.


3

Вам потрібно оновити свій interaction.depthпараметр під час створення вашої розширеної моделі. Він за замовчуванням дорівнює 1, і всі дерева, gbmстворені алгоритмом, розбиваються лише один раз на кожне. Це означає, що кожне дерево просто розщеплюється на змінну, cі залежно від вибірки спостережень, яку він використовує, воно розколоться десь близько 40 - 60.

Ось часткові сюжети с interaction.depth = 3

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


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