Uma floresta aleatória pode ser usada para seleção de recurso em regressão linear múltipla?

50

Como a RF pode lidar com a não linearidade, mas não pode fornecer coeficientes, seria aconselhável usar a floresta aleatória para reunir os recursos mais importantes e depois conectá-los a um modelo de regressão linear múltipla para obter seus coeficientes?

Hidden Markov Model
fonte
@ user777 você quer dizer, você está lendo "explicar" como "obter" ou algo assim?
31515 Shadowtalker
11
Como parece haver uma preocupação substancial com o que essa pergunta está tentando perguntar, você poderia editá-la para esclarecer a confusão?
whuber

Respostas:

71

Como a RF pode lidar com a não linearidade, mas não pode fornecer coeficientes, seria aconselhável usar a Floresta Aleatória para reunir os Recursos mais importantes e depois conectá-los a um modelo de Regressão Linear Múltipla para explicar seus sinais?

Interpreto a pergunta de uma frase do OP como significando que ele deseja entender a conveniência do seguinte pipeline de análise:

  1. Ajustar uma floresta aleatória a alguns dados
  2. Por alguma métrica de importância variável de (1), selecione um subconjunto de recursos de alta qualidade.
  3. Usando as variáveis ​​de (2), estime um modelo de regressão linear. Isso dará ao OP acesso aos coeficientes que o OP observa que o RF não pode fornecer.
  4. A partir do modelo linear em (3), interprete qualitativamente os sinais das estimativas do coeficiente.

Eu não acho que esse pipeline realizará o que você gostaria. Variáveis ​​importantes em florestas aleatórias não têm necessariamente nenhum tipo de relação linearmente aditiva com o resultado. Essa observação não deve surpreender: é o que torna a floresta aleatória tão eficaz na descoberta de relacionamentos não lineares.

Aqui está um exemplo. Criei um problema de classificação com 10 recursos de ruído, dois recursos de "sinal" e um limite de decisão circular.

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))) 

insira a descrição da imagem aqui

E quando aplicamos o modelo de RF, não nos surpreendemos ao descobrir que esses recursos são facilmente identificados como importantes pelo modelo. (Nota: este modelo não está totalmente ajustado .)

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

Mas quando selecionamos apenas esses dois recursos úteis, o modelo linear resultante é horrível.

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

A parte importante do resumo é a comparação do desvio residual e do desvio nulo. Podemos ver que o modelo basicamente não faz nada para "mover" o desvio. Além disso, as estimativas do coeficiente são essencialmente zero.

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

O que explica a grande diferença entre os dois modelos? Bem, claramente o limite de decisão que estamos tentando aprender não é uma função linear dos dois recursos de "sinal". Obviamente, se você conhecesse a forma funcional do limite de decisão antes de estimar a regressão, poderia aplicar alguma transformação para codificar os dados de uma maneira que a regressão pudesse descobrir ... (Mas nunca conheci a forma do limite à frente tempo em qualquer problema do mundo real.) Como estamos trabalhando apenas com dois recursos de sinal nesse caso, um conjunto de dados sintéticos sem ruído nos rótulos das classes, esse limite entre as classes é muito óbvio em nosso gráfico. Mas é menos óbvio ao trabalhar com dados reais em um número realista de dimensões.

Além disso, em geral, a floresta aleatória pode ajustar modelos diferentes para diferentes subconjuntos dos dados. Em um exemplo mais complicado, não será óbvio o que está acontecendo em um único gráfico, e construir um modelo linear de poder preditivo semelhante será ainda mais difícil.

Como estamos preocupados apenas com duas dimensões, podemos criar uma superfície de previsão. Como esperado, o modelo aleatório descobre que a vizinhança em torno da origem é importante.

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")

insira a descrição da imagem aqui

Como está implícito em nossa saída do modelo abismal, a superfície de previsão para o modelo de regressão logística de variável reduzida é basicamente plana.

insira a descrição da imagem aqui

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 observa que a associação à classe não é uma função linear dos recursos, mas que uma função linear está sob uma transformação. Como o limite de decisão é se enquadrarmos esses recursos, poderemos construir um modelo linear mais útil. Isso é deliberado. Embora o modelo de RF possa encontrar sinal nesses dois recursos sem transformação, o analista precisa ser mais específico para obter resultados igualmente úteis no GLM. Talvez isso seja suficiente para o OP: encontrar um conjunto útil de transformações para 2 recursos é mais fácil que 12. Mas o que quero dizer é que, mesmo que uma transformação produza um modelo linear útil, a importância do recurso de RF não sugerirá a transformação por si só.1=x12+x22,

Restabelecer Monica
fonte
11
Eu acho que, apesar de agradável, perde tudo. Tente um modelo um pouco mais complexo - um que eu chamaria de não trivial o suficiente para ser informativo. Considere isso ( people.kyb.tuebingen.mpg.de/spider/demo_dec_vs_svm_2.jpg ) com algum ruído de sal e pimenta. Agora ajuste-o com RF. Agora use RF como "filtro" para remover fenômenos "espúrios" e treine seu modelo alternativo nas saídas da RF, não em seus coeficientes. O OP especifica "recursos", não coeficientes. O OP não diz "floresta aleatória reduzida", mas "floresta aleatória". A implicação é para a saída da floresta completa.
EngrStudent - Restabelece Monica
3
Curiosamente, seu exemplo é linear nos preditores - se você os transformar primeiro. Sua equação é , portanto, tirar o quadrado de e transforma em um modelo linear. De fato, é um dos exemplos que Friedman, Hastie e Tibshirani costumavam mostrar que o reforço se encaixa em um modelo de baixa dimensão (aditivo, no caso de tocos). x 1 x 2y=x12+x22x1x2
Hong Ooi
3
@ user777, tenho usado florestas aleatórias para redução de dimensionalidade contra problemas complexos há anos. Meu ex-empregador, a Intel Semiconductor, possui processos de produção com 20 mil colunas e 20 mil etapas e, para menos de 10 defeitos, usa isso como parte de um conjunto de ferramentas analíticas para passar de 20 mil colunas para 30 colunas. Eles ministram cursos internamente e fazem palestras sobre o conteúdo externamente. ( web.stanford.edu/class/ee392m/Lecture3Tuv.pdf ) A "floresta" é uma ferramenta incrivelmente poderosa e você seguiu o caminho errado. Você perdeu dois solidamente bons.
EngrStudent - Reintegrar Monica
2
@EngrStudent "A Intel usa RF para passar de muitas para menos colunas." É exatamente o que minha demonstração faz. Ele também responde à pergunta específica do OP sobre se esses recursos podem ser usados ​​com lucro em um modelo linear, e minha resposta é "em geral eles não serão diretamente úteis, mas neste exemplo, você pode considerá-los úteis em uma transformação".
Reponha Monica em
12

A resposta do @Sycorax é fantástica. Além dos aspectos totalmente descritos do problema relacionados ao ajuste do modelo, há outro motivo para não prosseguir com um processo de várias etapas, como executar florestas aleatórias, laços ou rede elástica para "aprender" quais recursos devem alimentar a regressão tradicional. Regressão simples não saber sobre a penalização que adequadamente se passou durante o desenvolvimento da floresta aleatória ou outros métodos, e caberia efeitos unpenalized que são mal tendenciosa parecer demasiado forte na previsão de . Isso não seria diferente do que executar a seleção de variáveis ​​passo a passo e relatar o modelo final sem levar em consideração como ele chegou.Y

Frank Harrell
fonte
2
Obrigado, Dr. Harrell! Na minha opinião, se o OP usasse esse pipeline de análise, o OP faria a seleção descendente de RF e o ajuste do modelo linear dentro de seu esquema de validação (cruzada). Isso é suficiente para atenuar o viés que você descreve ou há outro problema oculto aqui que estou perdendo?
Reintegrar Monica
2
Não sei como fazer um modelo linear adequado "dentro" do esquema. Não sei como mitigar o viés de sobrecapagem / estimativa que resultaria. Talvez uma abordagem melhor seja a aproximação do modelo, às vezes chamada de pré-condicionamento. Aqui você usa modelos tradicionais ou árvores únicas (o que exigiria uma tonelada de nós) para aproximar a saída de uma caixa preta, herdando o encolhimento da caixa preta.
Frank Harrell
8

Uma floresta aleatória executada corretamente aplicada a um problema que é mais "apropriado para a floresta aleatória" pode funcionar como um filtro para remover o ruído e gerar resultados mais úteis como entradas para outras ferramentas de análise.

Isenções de responsabilidade:

  • É uma "bala de prata"? De jeito nenhum. A quilometragem varia. Funciona onde funciona, e não em outro lugar.
  • Existem maneiras pelas quais você pode usá-lo de maneira incorreta e obter respostas que estão no domínio do lixo para o vodu? pode apostar. Como toda ferramenta analítica, ela tem limites.
  • Se você lamber um sapo, sua respiração cheira a sapo? provável. Eu não tenho experiência lá.

Eu tenho que dar um "grito" aos meus "espreitadelas" que fizeram "Aranha". ( link ) O problema de exemplo deles informou minha abordagem. ( link ) Eu também amo estimadores de Theil-Sen, e gostaria de poder dar apoio a Theil e Sen.

Minha resposta não é sobre como errar, mas sobre como pode funcionar se você acertar. Enquanto eu uso ruído "trivial", quero que você pense em ruído "não trivial" ou "estruturado".

Um dos pontos fortes de uma floresta aleatória é o quão bem ela se aplica a problemas de alta dimensão. Não consigo mostrar 20k colunas (também conhecido como espaço dimensional de 20k) de uma maneira visual limpa. Não é uma tarefa fácil. No entanto, se você tiver um problema dimensional de 20k, uma floresta aleatória pode ser uma boa ferramenta quando a maioria das pessoas cai de cara no chão.

Este é um exemplo de remoção de ruído do sinal usando uma floresta aleatória.

#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))

Deixe-me descrever o que está acontecendo aqui. Esta imagem abaixo mostra os dados de treinamento para a classe "1". A classe "2" é aleatória uniforme no mesmo domínio e intervalo. Você pode ver que as "informações" de "1" são principalmente uma espiral, mas foram corrompidas pelo material de "2". Ter 33% dos seus dados corrompidos pode ser um problema para muitas ferramentas de ajuste. Theil-Sen começa a se degradar em cerca de 29%. ( link )

insira a descrição da imagem aqui

Agora separamos as informações, apenas tendo uma idéia do que é ruído.

#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")

Aqui está o resultado apropriado:

insira a descrição da imagem aqui

Eu realmente gosto disso porque pode mostrar os pontos fortes e fracos de um método decente para um problema difícil ao mesmo tempo. Se você olhar perto do centro, poderá ver como há menos filtragem. A escala geométrica da informação é pequena e a floresta aleatória está ausente. Diz algo sobre o número de nós, o número de árvores e a densidade da amostra para a classe 2. Há também uma "lacuna" próxima (-50, -50) e "jatos" em vários locais. Em geral, no entanto, a filtragem é decente.

Compare vs. SVM

Aqui está o código para permitir uma comparação com o 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))

Isso resulta na imagem a seguir.

insira a descrição da imagem aqui

Este é um SVM decente. O cinza é o domínio associado à classe "1" pelo SVM. Os pontos azuis são as amostras associadas à classe "1" pela RF. O filtro baseado em RF funciona comparativamente ao SVM sem uma base explicitamente imposta. Pode-se ver que os "dados restritos" próximos ao centro da espiral são muito mais "rigorosamente" resolvidos pelo RF. Também existem "ilhas" em direção à "cauda", onde o RF encontra associação que o SVM não encontra.

Estou entretido. Sem ter experiência, fiz uma das primeiras coisas também feitas por um colaborador muito bom em campo. O autor original usou "distribuição de referência" ( link , link ).

EDITAR:

Aplique o FOREST aleatório neste modelo:
Embora o usuário777 tenha uma idéia interessante de um CART sendo o elemento de uma floresta aleatória, a premissa da floresta aleatória é "agregação de grupos de alunos fracos". O CART é um aprendiz fraco conhecido, mas não é nada remotamente próximo de um "conjunto". O "conjunto" embora em uma floresta aleatória é destinado "no limite de um grande número de amostras". A resposta do usuário777, no gráfico de dispersão, usa pelo menos 500 amostras e isso diz algo sobre a legibilidade humana e o tamanho das amostras nesse caso. O sistema visual humano (em si um conjunto de alunos) é um incrível sensor e processador de dados e considera esse valor suficiente para facilitar o processamento.

Se tomarmos as configurações padrão em uma ferramenta de floresta aleatória, podemos observar o comportamento do erro de classificação para as primeiras várias árvores e não atingir o nível de uma árvore até que haja cerca de 10 árvores. Inicialmente o erro cresce, a redução do erro se torna estável em torno de 60 árvores. Por estável, quero dizer

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

Qual produz:
insira a descrição da imagem aqui

Se, em vez de olharmos para o "aprendiz fraco mínimo", olharmos para o "conjunto mínimo fraco" sugerido por uma breve heurística para a configuração padrão da ferramenta, os resultados são um pouco diferentes.

Note que usei "linhas" para desenhar o círculo indicando a aresta sobre a aproximação. Você pode ver que é imperfeito, mas muito melhor do que a qualidade de um único aluno.

insira a descrição da imagem aqui

A amostragem original possui 88 amostras "interiores". Se o tamanho da amostra for aumentado (permitindo a aplicação do conjunto), a qualidade da aproximação também melhora. O mesmo número de alunos com 20.000 amostras se encaixa incrivelmente melhor.

insira a descrição da imagem aqui

As informações de entrada de qualidade muito mais alta também permitem avaliar o número apropriado de árvores. A inspeção da convergência sugere que 20 árvores é o número mínimo suficiente nesse caso específico para representar bem os dados.

insira a descrição da imagem aqui

EngrStudent - Restabelecer Monica
fonte
Como isso prova / refuta que o RF pode ser usado para selecionar recursos de alta qualidade para um modelo linear? Você não discute a seleção de recursos ou modelos lineares em sua resposta.
Reinstate Monica
a premissa do solicitante é sobre o uso de RF como pré-filtro e, em seguida, analisar os parâmetros do modelo linear. Ele não estava olhando para os parâmetros da floresta. Quando li, devido à sua falta de profundidade ou especificidade, o "modelo linear múltiplo" parecia secundário. Para mim, isso parecia "um RF pode pré-processar / limpar os dados antes de colocá-los na ferramenta analítica x".
EngrStudent - Reintegrar Monica
Eu vejo artefatos horizontais e verticais. Fico tentado a criar "dados conjugados" em coordenadas giradas 45 graus e anexar as colunas ao RF. Aposto que uma transformação como essa reduziria o número de artefatos, embora não tenha certeza de como isso alteraria os parâmetros de entrada.
EngrStudent - Reinstala Monica 11/11
2
Como um aparte, a "floresta de rotação" é uma variação recente dessa idéia, onde o PCA é usado para determinar a nova base. ncbi.nlm.nih.gov/pubmed/16986543
Restabelece Monica
11
Puro: Liu, Fei Tony, Ting, Kai Ming e Zhou, Zhi-Hua. “Floresta de isolamento.” Data Mining, 2008. ICDM'08. Oitava Conferência Internacional do IEEE em.
EngrStudent - Restabelece Monica