Чи може бути використаний випадковий ліс для вибору ознак при множинній лінійній регресії?


50

Оскільки РФ може обробляти нелінійність, але не може надати коефіцієнтів, чи було б розумно використовувати випадковий ліс для збору найважливіших характеристик, а потім підключити ці функції до множинної лінійної регресійної моделі для отримання їх коефіцієнтів?


@ user777 ти маєш на увазі, ти читаєш "пояснити" як "отримати" чи щось подібне?
shadowtalker

1
Оскільки, здається, існує велика стурбованість з приводу того, що це питання може намагатися задати, ви можете редагувати його, щоб усунути плутанину?
whuber

Відповіді:


71

Оскільки РФ може обробляти нелінійність, але не може надати коефіцієнтів, чи було б розумно використовувати Random Forest для збору найважливіших особливостей, а потім підключити ці функції до моделі множинної лінійної регресії для пояснення їх ознак?

Я трактую однопорядкове запитання ОП так, що ОП бажає зрозуміти бажаність наступного конвеєра аналізу:

  1. Додайте випадковий ліс до деяких даних
  2. За деякими показниками змінного значення (1) виберіть підмножину високоякісних функцій.
  3. За допомогою змінних з (2) оцініть лінійну регресійну модель. Це дасть ОП доступ до коефіцієнтів, які ОП зазначає, що РФ не може надати.
  4. З лінійної моделі в (3) якісно інтерпретуйте ознаки оцінок коефіцієнта.

Я не думаю, що цей трубопровід здійснить те, що ви хотіли б. Змінні, важливі для випадкових лісів, не обов'язково мають будь-яку лінійно-адитивну залежність від результату. Це зауваження не повинно дивувати: саме це робить випадковий ліс настільки ефективним у виявленні нелінійних зв’язків.

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

set.seed(1)
N  <- 500
x1 <- rnorm(N, sd=1.5)
x2 <- rnorm(N, sd=1.5)

y  <- apply(cbind(x1, x2), 1, function(x) (x%*%x)<1)

plot(x1, x2, col=ifelse(y, "red", "blue"))
lines(cos(seq(0, 2*pi, len=1000)), sin(seq(0, 2*pi, len=1000))) 

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

І коли ми застосовуємо модель РФ, ми не здивовані, виявивши, що ці функції легко вибираються як важливі для моделі. (NB: ця модель не налаштований на всіх .)

x_junk   <- matrix(rnorm(N*10, sd=1.5), ncol=10)
x        <- cbind(x1, x2, x_junk)
names(x) <- paste("V", 1:ncol(x), sep="")

rf <- randomForest(as.factor(y)~., data=x, mtry=4)
importance(rf)

    MeanDecreaseGini
x1         49.762104
x2         54.980725
V3          5.715863
V4          5.010281
V5          4.193836
V6          7.147988
V7          5.897283
V8          5.338241
V9          5.338689
V10         5.198862
V11         4.731412
V12         5.221611

Але коли ми обираємо лише ці дві корисні функції, то отримана лінійна модель жахлива.

summary(badmodel <- glm(y~., data=data.frame(x1,x2), family="binomial"))

Важливою частиною резюме є порівняння залишкового відхилення та нульового відхилення. Ми можемо бачити, що модель в принципі нічого не робить, щоб "зрушити" відхилення. Більше того, оцінки коефіцієнтів по суті дорівнюють нулю.

Call:
glm(formula = as.factor(y) ~ ., family = "binomial", data = data.frame(x1, 
    x2))

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-0.6914  -0.6710  -0.6600  -0.6481   1.8079  

Coefficients:
             Estimate Std. Error z value Pr(>|z|)    
(Intercept) -1.398378   0.112271 -12.455   <2e-16 ***
x1          -0.020090   0.076518  -0.263    0.793    
x2          -0.004902   0.071711  -0.068    0.946    
---
Signif. codes:  0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 497.62  on 499  degrees of freedom
Residual deviance: 497.54  on 497  degrees of freedom
AIC: 503.54

Number of Fisher Scoring iterations: 4

Що пояснює дику різницю між двома моделями? Ну, очевидно, що межа рішення, яку ми намагаємося вивчити, не є лінійною функцією двох "сигнальних" ознак. Очевидно, якби ви знали функціональну форму межі рішення перед оцінкою регресії, ви могли застосувати деяку трансформацію для кодування даних таким чином, щоб потім регресія виявила ... (Але я ніколи не знав форми межі вперед часу в будь-якій проблемі реального світу.) Оскільки в цьому випадку ми працюємо лише з двома характеристиками сигналу, синтетичний набір даних без шуму на мітках класу, ця межа між класами є дуже очевидною в нашому сюжеті. Але це менш очевидно при роботі з реальними даними в реалістичній кількості вимірів.

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

Оскільки нас стосуються лише два виміри, ми можемо зробити прогнозовану поверхню. Як і очікувалося, випадкова модель дізнається, що сусідство навколо походження є важливим.

M                 <- 100
x_new             <- seq(-4,4, len=M)
x_new_grid        <- expand.grid(x_new, x_new)
names(x_new_grid) <- c("x1", "x2")
x_pred            <- data.frame(x_new_grid, matrix(nrow(x_new_grid)*10, ncol=10))
names(x_pred)     <- names(x)

y_hat             <- predict(object=rf, newdata=x_pred, "vote")[,2]

library(fields)
y_hat_mat         <- as.matrix(unstack(data.frame(y_hat, x_new_grid), y_hat~x1))

image.plot(z=y_hat_mat, x=x_new, y=x_new, zlim=c(0,1), col=tim.colors(255), 
           main="RF Prediction surface", xlab="x1", ylab="x2")

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

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

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

bad_y_hat     <- predict(object=badmodel, newdata=x_new_grid, type="response")
bad_y_hat_mat <- as.matrix(unstack(data.frame(bad_y_hat, x_new_grid), bad_y_hat~x1))
image.plot(z=bad_y_hat_mat, x=x_new, y=x_new, zlim=c(0,1), col=tim.colors(255), 
           main="Logistic regression prediction surface", xlab="x1", ylab="x2")

1=x12+x22,


1
Я думаю, що, хоча це приємно, він пропускає всю точку. Спробуйте трохи складнішу модель - одну, яку я б назвав достатньо нетривіальною, щоб бути інформативною. Подумайте про це ( people.kyb.tuebingen.mpg.de/spider/demo_dec_vs_svm_2.jpg ) з деяким соляно-перцевим шумом. Тепер підходимо до нього з РФ. Тепер використовуйте РФ як "фільтр" для видалення "помилкових" явищ і тренуйте свою альтернативну модель на вихідних даних РФ, а не на її коефіцієнти. ОП визначає "характеристики", а не коефіцієнти. ОП каже не "скорочений випадковий ліс", а "випадковий ліс". Наслідком є ​​вихід на весь ліс.
EngrStudent

3
y=x12+x22x1x2

3
@ user777, я протягом багатьох років використовую випадкові ліси для зменшення розмірності проти складних проблем. У мого колишнього роботодавця Intel Semiconductor є виробничі процеси, які мають 20-ти колонок і 20-ти кроків, і для менш ніж 10 дефектів використовує це як частину набору аналітичних інструментів, щоб переходити від 20k колонок до 30 стовпців. Вони викладають курси внутрішньо, а лекції за вмістом - зовні. ( web.stanford.edu/class/ee392m/Lecture3Tuv.pdf ) "Ліс" - це надзвичайно потужний інструмент, і ви взяли одну погану дорогу. Є два твердо хороших, які ти пропустив.
EngrStudent

2
@EngrStudent "Intel використовує RF для переходу від багатьох до менших стовпців." Саме це і робить моя демонстрація. Він також відповідає на конкретне запитання ОП щодо того, чи можна ці функції вигідно використовувати в лінійній моделі, і моя відповідь - "загалом вони не будуть безпосередньо корисними, але в цьому прикладі ви можете вважати їх корисними під час перетворення".
Відновіть Моніку

12

Y


2
Дякую, доктор Харрелл! На мій погляд, якби ОП використовував цей конвеєр для аналізу, ОП здійснював би вибір РФ та лінійну модель, що вписується всередину їх схеми (перехресної) перевірки. Це достатньо, щоб пом’якшити опис, який ви описуєте, чи є інша проблема, яка тут ховається, що я пропускаю?
Відновіть Моніку

2
Я не знаю, як зробити правильну лінійну модель "всередині" схеми. Я не знаю, як пом’якшити упередженість / оцінку упередженості, що призведе до цього. Можливо, кращим підходом є наближення моделі, яку іноді називають попередньою умовою. Тут ви використовуєте традиційні моделі або поодинокі дерева (для яких знадобиться тонна вузлів) для наближення виходу чорної скриньки, успадковуючи усадку чорної скриньки.
Френк Харрелл

8

Правильно виконаний випадковий ліс, застосований до проблеми, яка є більш "випадковою лісовою доцільністю", може працювати як фільтр для видалення шуму та отримання результатів, які є більш корисними як вхідні дані до інших інструментів аналізу.

Відмова від відповідальності:

  • Це "срібна куля"? У жодному разі. Пробіг буде різним. Він працює там, де працює, а не деінде.
  • Чи існують способи, коли ви можете погано помилково використати його та отримати відповіді, які знаходяться у домені сміття до вуду? youbetcha. Як і кожен аналітичний інструмент, він має межі.
  • Якщо ви лижете жабу, чи буде ваше дихання пахнути жабою? ймовірно. Я не маю там досвіду.

Я маю дати "крик" моїм "підглядам", які зробили "Павука". ( посилання ) Їх приклад проблема повідомила мій підхід. ( посилання ) Я також люблю оцінювачів Тейль-Сена, і хотів би, щоб я міг дати реквізит Теїлу та Сену.

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

Однією з сильних сторін випадкового лісу є те, наскільки добре він застосовується до проблем з великими розмірами. Я не можу відображати 20k стовпців (він же розмірний проміжок 20k) чисто візуально. Це непросте завдання. Однак якщо у вас проблема з 20-ти розмірним розміром, випадковий ліс може бути хорошим інструментом там, коли більшість інших падають на їхні обличчя.

Це приклад видалення шуму з сигналу за допомогою випадкового лісу.

#housekeeping
rm(list=ls())

#library
library(randomForest)

#for reproducibility
set.seed(08012015)

#basic
n <- 1:2000
r <- 0.05*n +1 
th <- n*(4*pi)/max(n)

#polar to cartesian
x1=r*cos(th) 
y1=r*sin(th)

#add noise
x2 <- x1+0.1*r*runif(min = -1,max = 1,n=length(n))
y2 <- y1+0.1*r*runif(min = -1,max = 1,n=length(n))

#append salt and pepper
x3 <- runif(min = min(x2),max = max(x2),n=length(n)/2)
y3 <- runif(min = min(y2),max = max(y2),n=length(n)/2)

x4 <- c(x2,x3)
y4 <- c(y2,y3)
z4 <- as.vector(matrix(1,nrow=length(x4)))

#plot class "A" derivation
plot(x1,y1,pch=18,type="l",col="Red", lwd=2)
points(x2,y2)
points(x3,y3,pch=18,col="Blue")
legend(x = 65,y=65,legend = c("true","sampled","false"),
col = c("Red","Black","Blue"),lty = c(1,-1,-1),pch=c(-1,1,18))

Дозвольте описати, що тут відбувається. На цьому зображенні нижче представлені дані про навчання для класу "1". Клас "2" є рівномірним випадковим чином для одного домену та діапазону. Видно, що "інформація" "1" - це переважно спіраль, але зіпсована матеріалами з "2". Пошкодження 33% ваших даних може бути проблемою для багатьох інструментів підгонки. Theil-Sen починає деградувати приблизно на 29%. ( посилання )

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

Тепер ми відокремлюємо інформацію, маючи лише уявлення про те, що таке шум.

#Create "B" class of uniform noise
x5 <- runif(min = min(x4),max = max(x4),n=length(x4))
y5 <- runif(min = min(y4),max = max(y4),n=length(x4))
z5 <- 2*z4 

#assemble data into frame 
data <- data.frame(c(x4,x5),c(y4,y5),as.factor(c(z4,z5)))
names(data) <- c("x","y","z")

#train random forest - I like h2o, but this is textbook Breimann
fit.rf <- randomForest(z~.,data=data,
                       ntree = 1000, replace=TRUE, nodesize = 20)
data2 <- predict(fit.rf,newdata=data[data$z==1,c(1,2)],type="response")

#separate class "1" from training data
idx1a <- which(data[,3]==1)

#separate class "1" from the predicted data
idx1b <- which(data2==1)

#show the difference in classes before and after RF based filter
plot(data[idx1a,1],data[idx1a,2])
points(data[idx1b,1],data[idx1b,2],col="Red")

Ось підходящий результат:

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

Мені це дуже подобається, оскільки він може виявити як сильні, так і слабкі сторони гідного методу до важкої проблеми водночас. Якщо ви подивитесь на центр, то побачите, наскільки менше фільтрування. Геометрична шкала інформації невелика, і цього випадкового лісу не вистачає. Це щось говорить про кількість вузлів, кількість дерев та щільність вибірки для класу 2. Існує також "розрив" біля (-50, -50) та "струменів" у кількох місцях. В цілому, однак, фільтрація пристойна.

Порівняйте проти SVM

Ось код для порівняння зі SVM:

#now to fit to svm
fit.svm <-  svm(z~., data=data, kernel="radial",gamma=10,type = "C")

x5 <- seq(from=min(x2),to=max(x2),by=1)
y5 <- seq(from=min(y2),to=max(y2),by=1)

count <- 1
x6 <- numeric()
y6 <- numeric()
for (i in 1:length(x5)){

     for (j in 1:length(y5)){
          x6[count]<-x5[i]
          y6[count]<-y5[j]
          count <- count+1
     }
}

data4 <- data.frame(x6,y6)
names(data4) <- c("x","y")

data4$z <- predict(fit.svm,newdata=data4)

idx4 <- which(data4$z==1,arr.ind=TRUE)


plot(data4[idx4,1],data4[idx4,2],col="Gray",pch=20)
points(data[idx1b,1],data[idx1b,2],col="Blue",pch=20)
lines(x1,y1,pch=18,col="Green", lwd=2)
grid()
legend(x = 65,y=65,
       legend = c("true","from RF","From SVM"),
       col = c("Green","Blue","Gray"),lty = c(1,-1,-1),pch=c(-1,20,15),pt.cex=c(1,1,2.25))

Це призводить до отримання наступного зображення.

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

Це гідний SVM. Сірий - це домен, асоційований з SVM класом "1". Сині крапки - це зразки, асоційовані з РФ класом "1". РЧ-фільтр працює порівняно зі SVM без явно накладеної основи. Видно, що "щільні дані" поблизу центру спіралі набагато більш "щільно" вирішені РФ. Є також "острови" у напрямку до "хвоста", де РФ виявляє асоціацію, що SVM не має.

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

Редагувати:

Застосуйте випадкову
ЛІСУ до цієї моделі: Хоча user777 гарно думає про те, що CART є елементом випадкового лісу, умовою випадкового лісу є "ансамблева сукупність слабких учнів". КАРТА - відомий слабкий учень, але він віддалений від «ансамблю». "Ансамбль", хоча у випадковому лісі призначений "в межах великої кількості зразків". У відповіді user777 у розсипці використовуються щонайменше 500 зразків, що говорить про читабельність людини та розміри вибірки в цьому випадку. Візуальна система людини (сама ансамбль учнів) - це дивовижний сенсор і процесор даних, і вона вважає, що цінність є достатньою для простоти обробки.

Якщо взяти навіть налаштування за замовчуванням на інструменті з випадковим лісом, ми можемо спостерігати, як поведінка помилок класифікації збільшується для перших кількох дерев, і не досягає рівня одного дерева, поки не буде близько 10 дерев. Спочатку зростає похибка, зменшення похибки стає стабільною близько 60 дерев. Під стабільним я маю на увазі

x        <- cbind(x1, x2)
plot(rf,type="b",ylim=c(0,0.06))
grid()

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

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

Зауважте, я використовував "лінії", щоб намалювати коло із зазначенням краю над апроксимацією. Ви можете бачити, що це недосконало, але набагато краще, ніж якість одного учня.

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

Оригінальна вибірка має 88 «внутрішніх» зразків. Якщо збільшити розміри зразків (що дозволяє ансамблю застосовуватись), то і якість наближення також покращується. Така ж кількість учнів, що мають 20 000 зразків, робить приголомшливо кращим.

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

Значно більш якісна вхідна інформація також дозволяє оцінити відповідну кількість дерев. Перевірка конвергенції свідчить про те, що 20 дерев - це мінімально достатня кількість у цьому конкретному випадку, щоб добре представити дані.

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


Як це доводить / спростовує те, що РФ можна використовувати для вибору високоякісних функцій для лінійної моделі? Ви не обговорюєте вибір функції або лінійні моделі у своїй відповіді.
Відновіть Моніку

Примітка запитувача полягає у використанні РФ як попереднього фільтра, а потім при перегляді параметрів лінійної моделі. Він не дивився на параметри лісу. Коли я читав це, через його недостатню глибину чи специфічність, "множинна лінійна модель" здавалася вторинною. Для мене це виглядало як "може попередньо обробити / очистити дані РФ, перш ніж вставляти їх в аналітичний інструмент x".
EngrStudent

Я бачу горизонтальні та вертикальні артефакти. Мені спокуса зробити "зведені дані" за координатами, поверненими на 45 градусів, і додати стовпці до РФ. Я думаю, що таке перетворення зменшило б кількість артефактів, хоча я не впевнений, як це змінить вхідні параметри.
EngrStudent

2
Як осторонь, "ліс обертання" є нещодавньою варіацією цієї ідеї, де PCA використовується для визначення нової основи. ncbi.nlm.nih.gov/pubmed/16986543
Моніку

1
Акуратні: Лю, Фей Тоні, Тін, Кай Мін і Чжоу, Чжі-Хуа. «Ізоляційний ліс». Data Mining, 2008. ICDM'08. Восьма міжнародна конференція IEEE о.
EngrStudent
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.