Можно ли использовать случайный лес для выбора признаков в множественной линейной регрессии?


50

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


@ user777 Вы имеете в виду, вы читаете "объяснить" как "получить" или что-то в этом роде?
теневик

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

Ответы:


71

Поскольку RF может обрабатывать нелинейность, но не может предоставлять коэффициенты, было бы разумно использовать Random Forest для сбора наиболее важных объектов, а затем включить эти функции в модель множественной линейной регрессии, чтобы объяснить их признаки?

Я интерпретирую вопрос, состоящий из одного предложения OP, что он хочет понять желательность следующего конвейера анализа:

  1. Подгонка случайного леса к некоторым данным
  2. По некоторому показателю переменной важности из (1) выберите подмножество качественных признаков.
  3. Используя переменные из (2), оцените модель линейной регрессии. Это даст OP доступ к коэффициентам, которые OP примечания не могут предоставить.
  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))) 

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

И когда мы применяем модель RF, мы не удивляемся, обнаружив, что эти функции легко выбираются моделью как важные. (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")

HongOoi отмечает, что членство в классе не является линейной функцией функций, но что линейная функция находится в процессе преобразования. Поскольку граница принятия решения равна если мы возведем эти квадраты в квадрат, мы сможем построить более полезную линейную модель. Это намеренно. В то время как модель RF может найти сигнал в этих двух функциях без преобразования, аналитик должен быть более конкретным, чтобы получить аналогичные полезные результаты в GLM. Возможно, этого достаточно для OP: найти полезный набор преобразований для 2 объектов проще, чем 12. Но я хочу сказать, что даже если преобразование даст полезную линейную модель, важность RF-функции сама по себе не предполагает преобразование.1=x12+x22,


1
Я думаю, что, хотя приятно, это упускает из виду весь смысл. Попробуйте немного более сложную модель - такую, которую я бы назвал достаточно нетривиальной, чтобы быть информативной. Подумайте об этом ( people.kyb.tuebingen.mpg.de/spider/demo_dec_vs_svm_2.jpg ) с небольшим количеством соли и перца. Теперь подгоняем его по РФ. Теперь используйте RF как «фильтр» для удаления «паразитных» явлений и обучайте свою альтернативную модель на выходах RF, а не на его коэффициентах. ОП определяет «особенности», а не коэффициенты. ОП говорит не «редуцированный случайный лес», а «случайный лес». Это подразумевает вывод всего леса.
EngrStudent - Восстановить Монику

3
Интересно, что ваш пример является линейным в предикторах - если вы сначала преобразуете их. Ваше уравнение , поэтому взятие квадрата и превращает его в линейную модель. Фактически, это один из примеров, которые Friedman, Hastie & Tibshirani использовали, чтобы показать, что бустинг подходит для низкоразмерной модели (аддитивная, в случае пней). х 1y=x12+x22x1x2
Хонг Оои

3
@ user777, я использовал случайные леса для уменьшения размерности по сравнению со сложными проблемами в течение многих лет. У моего бывшего работодателя, Intel Semiconductor, есть производственные процессы, которые имеют столбцы по 20 КБ и шаг по 20 КБ, и для менее 10 дефектов используют это как часть набора аналитических инструментов для перехода от столбцов с 20 КБ к 30 столбцам. Они преподают курсы внутри страны и читают лекции по содержанию. ( web.stanford.edu/class/ee392m/Lecture3Tuv.pdf ) «Лес» - это удивительно мощный инструмент, и вы пошли по одному плохому пути. Есть два очень хороших, которые вы пропустили.
EngrStudent - Восстановить Монику

2
@EngrStudent «Intel использует RF для перехода от многих столбцов к меньшему». Это именно то, что делает моя демонстрация. Он также отвечает на конкретный вопрос OP о том, могут ли эти функции выгодно использоваться в линейной модели, и мой ответ таков: «в целом они не будут непосредственно полезны, но в этом примере вы можете найти их полезными при преобразовании».
Восстановить Монику

12

Ответ @Sycorax фантастический. В дополнение к этим полностью описанным аспектам проблемы, связанной с подгонкой модели, есть еще одна причина не проводить многоэтапный процесс, такой как запуск случайных лесов, лассо или эластичной сети, чтобы «узнать», какие функции следует использовать для традиционной регрессии. Обычная регрессия не будет знать о пенализации , что правильно поступила в процессе развития случайного леса или других метод, и будет соответствовать unpenalized эффектов, которые плохо предпочтения оказаться слишком сильными для прогнозирования . Это ничем не отличается от пошагового выбора переменных и представления окончательной модели без учета того, как она появилась.Y


2
Спасибо, доктор Харрелл! На мой взгляд, если OP будет использовать этот конвейер анализа, OP будет выполнять RF-выборку и подгонку линейной модели внутри своей (перекрестной) схемы проверки. Этого достаточно для смягчения предвзятости, которую вы описываете, или есть еще одна проблема, которая скрывается здесь, которую я пропускаю?
Восстановить Монику

2
Я не знаю, как сделать правильную линейную модель "внутри" схемы. Я не знаю, как смягчить перекос оценки / оценки, который может возникнуть. Возможно, лучшим подходом является аппроксимация модели, которую иногда называют предварительным условием. Здесь вы используете традиционные модели или отдельные деревья (для которых потребуется тонна узлов), чтобы приблизить выход черного ящика, унаследовав сжатие черного ящика.
Фрэнк Харрелл

8

Правильно выполненный случайный лес, примененный к проблеме, которая более «подходит для случайного леса», может работать как фильтр для удаления шума и получения результатов, которые более полезны в качестве входных данных для других инструментов анализа.

Отказ от ответственности:

  • Это «серебряная пуля»? Ни за что. Пробег будет меняться. Работает там, где работает, а не где-то еще.
  • Существуют ли способы, которыми вы можете жестоко ошибочно использовать это и получать ответы, которые находятся в области мусора для вуду? Еще бы. Как и у любого аналитического инструмента, у него есть ограничения.
  • Если вы лизаете лягушку, будет ли ваше дыхание пахнуть лягушкой? скорее всего. У меня нет опыта там.

Я должен дать «крик» моим «писк», которые сделали «Паук». ( ссылка ) Их примерная проблема определила мой подход. ( ссылка ) Мне также нравятся оценки Тейл-Сена, и я хотел бы дать реквизит Тейлу и Сену.

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

Одной из сильных сторон случайного леса является то, насколько хорошо он применим к многомерным задачам. Я не могу показать 20-тысячные столбцы (20-мерное пространство) в чистом визуальном виде. Это не простая задача. Тем не менее, если у вас есть проблема в 20k, случайный лес может быть хорошим инструментом, когда большинство других не справляются со своими «лицами».

Это пример удаления шума из сигнала с использованием случайного леса.

#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. Серый - это домен, связанный с классом «1» SVM. Синие точки - это образцы, связанные с классом «1» РФ. Фильтр на основе RF работает сопоставимо с SVM без явно навязанной основы. Видно, что «точные данные» вблизи центра спирали гораздо более «жестко» разрешаются РФ. Есть также «островки» в направлении «хвоста», где РФ находит ассоциацию, которой нет у SVM.

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

РЕДАКТИРОВАТЬ:

Примените случайный FOREST к этой модели:
хотя у user777 есть хорошая мысль о том, что CART является элементом случайного леса, предпосылка случайного леса - это «ансамблевая агрегация слабых учеников». КОРЗИНА - известный слабый ученик, но это далеко не «ансамбль». «Ансамбль», хотя и в случайном лесу, предназначен «в пределах большого количества выборок». В ответе пользователя 777 на диаграмме рассеяния используется не менее 500 выборок, что говорит о читабельности человека и размерах выборки в этом случае. Человеческая зрительная система (сама по себе группа учащихся) представляет собой удивительный датчик и процессор данных, и она считает, что этого значения достаточно для простоты обработки.

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

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

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

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

Обратите внимание, я использовал «линии», чтобы нарисовать круг, обозначающий границу в приближении. Вы можете видеть, что он несовершенен, но гораздо лучше, чем качество одного ученика.

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

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

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

Гораздо более качественная входная информация также позволяет оценить соответствующее количество деревьев. Проверка сходимости показывает, что 20 деревьев является минимально достаточным числом в этом конкретном случае, чтобы хорошо представлять данные.

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


Как это доказывает / опровергает, что RF может использоваться для выбора высококачественных элементов для линейной модели? Вы не обсуждаете выбор характеристик или линейные модели в своем ответе.
Восстановить Монику

предпосылка спрашивающего заключается в том, чтобы использовать RF как предварительный фильтр, а затем смотреть на параметры линейной модели. Он не смотрел на параметры леса. Когда я читал его, из-за недостатка глубины или специфичности, «множественная линейная модель» казалась вторичной. Для меня это выглядело как «может ли RF предварительно обработать / очистить данные перед тем, как вставить их в аналитический инструмент x».
EngrStudent - Восстановить Монику

Я вижу горизонтальные и вертикальные артефакты. У меня возникает соблазн сделать «сопряженные данные» по координатам, повернутым на 45 градусов, и добавить столбцы в RF. Могу поспорить, что подобное преобразование уменьшит количество артефактов, хотя я не уверен, как это изменит входные параметры.
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.