Une forêt aléatoire peut-elle être utilisée pour la sélection d’entités dans une régression linéaire multiple?


50

Puisque RF peut gérer la non-linéarité mais ne peut pas fournir de coefficients, serait-il sage d'utiliser une forêt aléatoire pour rassembler les caractéristiques les plus importantes, puis de les brancher dans un modèle de régression linéaire multiple afin d'obtenir leurs coefficients?


@ user777 tu veux dire, tu lis "expliquer" comme "obtenir" ou quelque chose comme ça?
shadowtalker

1
Puisqu'il semble y avoir une préoccupation réelle quant à ce que cette question pourrait essayer de demander, pourriez-vous la modifier, s'il vous plaît, pour dissiper la confusion?
whuber

Réponses:


71

Étant donné que RF peut gérer la non-linéarité mais ne peut pas fournir de coefficients, serait-il sage d'utiliser Random Forest pour rassembler les caractéristiques les plus importantes, puis de les brancher dans un modèle de régression linéaire multiple afin d'expliquer leurs signes?

J'interprète la question en une phrase de OP comme signifiant qu'il souhaite comprendre l'opportunité du pipeline d'analyse suivant:

  1. Ajuster une forêt aléatoire à certaines données
  2. Selon une métrique d’importance variable parmi (1), sélectionnez un sous-ensemble de fonctionnalités de haute qualité.
  3. En utilisant les variables de (2), estimez un modèle de régression linéaire. Cela donnera à l'OP l'accès aux coefficients que l'OP note RF ne peut pas fournir.
  4. À partir du modèle linéaire de (3), interprétez qualitativement les signes des estimations de coefficients.

Je ne pense pas que ce pipeline accomplira ce que vous voudriez. Les variables qui sont importantes dans les forêts aléatoires n'ont pas nécessairement de relation additive linéaire avec le résultat. Cette remarque ne devrait pas être surprenante: c'est ce qui rend la forêt aléatoire si efficace pour découvrir des relations non linéaires.

Voici un exemple. J'ai créé un problème de classification avec 10 fonctions de bruit, deux fonctions de "signal" et une limite de décision circulaire.

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

entrez la description de l'image ici

Et lorsque nous appliquons le modèle RF, nous ne sommes pas surpris de constater que ces caractéristiques sont facilement identifiées comme importantes par le modèle. (NB: ce modèle n'est pas réglé du tout .)

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

Mais lorsque nous sélectionnons seulement ces deux fonctions utiles, le modèle linéaire résultant est affreux.

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

La partie importante du résumé est la comparaison de la déviance résiduelle et de la déviance nulle. Nous pouvons voir que le modèle ne fait fondamentalement rien pour "déplacer" la déviance. De plus, les coefficients estimés sont essentiellement nuls.

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

Qu'est-ce qui explique la différence sauvage entre les deux modèles? De toute évidence, la limite de décision que nous essayons d’apprendre n’est pas une fonction linéaire des deux caractéristiques du "signal". De toute évidence, si vous connaissiez la forme fonctionnelle de la limite de décision avant d'estimer la régression, vous pouvez appliquer une transformation pour coder les données de manière à ce que la régression puisse ensuite découvrir ... (mais je n'ai jamais connu la forme de la limite à venir Dans la mesure où nous ne travaillons que dans deux cas, un ensemble de données synthétiques sans bruit dans les étiquettes de classe, la limite entre les classes est très évidente dans notre graphique. Mais c'est moins évident lorsque vous travaillez avec des données réelles dans un nombre de dimensions réaliste.

De plus, en général, une forêt aléatoire peut adapter différents modèles à différents sous-ensembles de données. Dans un exemple plus compliqué, il ne sera pas évident de savoir ce qui se passe dans un seul complot, et il sera encore plus difficile de créer un modèle linéaire doté d'un pouvoir prédictif similaire.

Comme nous ne sommes concernés que par deux dimensions, nous pouvons créer une surface de prédiction. Comme prévu, le modèle aléatoire apprend que le voisinage autour de l'origine est important.

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

entrez la description de l'image ici

Comme l'indique la sortie de notre modèle abyssal, la surface de prédiction du modèle de régression logistique à variable réduite est fondamentalement plate.

entrez la description de l'image ici

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 note que l'appartenance à une classe n'est pas une fonction linéaire des entités, mais qu'une fonction linéaire est en cours de transformation. Étant donné que la limite de décision est nous pouvons créer un modèle linéaire plus utile si ces deux entités sont quadrillées. C'est délibéré. Bien que le modèle RF puisse trouver le signal dans ces deux entités sans transformation, l'analyste doit être plus spécifique pour obtenir des résultats tout aussi utiles dans le GLM. C’est peut-être suffisant pour OP: il est plus facile de trouver un ensemble de transformations utiles pour 2 entités que 12. Toutefois, même si une transformation produit un modèle linéaire utile, l’importance de l’entité RF ne la suggère pas seule.1=x12+x22,


1
Je pense que, bien que sympathique, il manque l’essentiel. Essayez un modèle légèrement plus complexe - un modèle que j’appellerais suffisamment non-trivial pour être informatif. Considérez ceci ( people.kyb.tuebingen.mpg.de/spider/demo_dec_vs_svm_2.jpg ) avec quelques bruits salés et poivrés . Maintenant, faites-le avec RF. Maintenant, utilisez RF comme "filtre" pour éliminer les phénomènes "parasites", et entraînez votre modèle alternatif sur les sorties du RF, pas ses coefficients. L'OP spécifie des "caractéristiques" et non des coefficients. Le PO ne dit pas "forêt aléatoire réduite" mais "forêt aléatoire". L'implication concerne la sortie de la forêt complète.
EngrStudent - Réintégrer Monica le

3
Fait intéressant, votre exemple est linéaire dans les prédicteurs - si vous les transformez d'abord. Votre équation est , si vous prenez le carré de et que transforme en modèle linéaire. En fait, c'est l'un des exemples que Friedman, Hastie & Tibshirani avaient l'habitude de montrer que la stimulation correspond à un modèle de petite dimension (additif, dans le cas des souches). x 1 x 2y=x12+x22x1x2
Hong Ooi

3
@ user777, j'ai utilisé des forêts aléatoires pour la réduction de la dimensionnalité contre des problèmes complexes pendant des années. Mon ancien employeur, Intel Semiconductor, utilise des processus de production de 20 000 colonnes et de 20 000 étapes. Pour moins de 10 défauts, il les utilise dans le cadre d’une suite d’outils analytiques permettant de passer de 20 000 colonnes à 30 colonnes. Ils donnent des cours en interne et donnent des conférences sur le contenu en externe. ( web.stanford.edu/class/ee392m/Lecture3Tuv.pdf ) La "forêt" est un outil incroyablement puissant et vous avez emprunté la mauvaise route. Il y en a deux solidement bons que vous avez manqués.
EngrStudent

2
@EngrStudent "Intel utilise RF pour passer de plusieurs colonnes à moins de colonnes." C'est exactement ce que ma démonstration fait. Cela répond également à la question particulière d'OP de savoir si ces fonctionnalités peuvent être utilisées de manière rentable dans un modèle linéaire, et ma réponse est "en général, elles ne seront pas directement utiles, mais dans cet exemple, vous pouvez les trouver utiles dans une transformation".
Rétablir Monica

12

La réponse de @Sycorax est fantastique. Outre les aspects parfaitement décrits du problème lié à l'ajustement du modèle, il existe une autre raison de ne pas poursuivre un processus en plusieurs étapes tel que l'exécution de forêts aléatoires, de lasso ou de réseaux élastiques pour "apprendre" les caractéristiques qui alimenteront la régression traditionnelle. Régression ordinaire ne connaîtrait pas sur le Pénalisation qui allait bien pendant le développement de la forêt aléatoire ou les autres méthodes, et cadrerait effets unpenalized qui sont mal biaisées paraître trop forte pour prédire . Ce ne serait pas différent d’exécuter une sélection de variable par étapes et de rapporter le modèle final sans tenir compte de la manière dont il est arrivé.Y


2
Merci, docteur Harrell! Dans mon esprit, si OP utilisait ce pipeline d'analyse, OP effectuerait la sélection descendante RF et l'adaptation du modèle linéaire à l' intérieur de leur schéma de validation (croisée). Cela suffit-il à atténuer le biais que vous décrivez ou y a-t-il un autre problème qui me manque ici?
Réintégrer Monica

2
Je ne sais pas comment faire un modèle linéaire approprié "à l'intérieur" du schéma. Je ne sais pas comment atténuer le biais de sur-adaptation / estimation qui en résulterait. L’approximation du modèle, parfois appelée préconditionnement, est peut-être une meilleure approche. Ici, vous utilisez des modèles traditionnels ou des arbres simples (qui nécessiteraient une tonne de nœuds) pour se rapprocher de la sortie d’une boîte noire, héritant du rétrécissement de la boîte noire.
Frank Harrell

8

Une forêt aléatoire correctement exécutée appliquée à un problème mieux "forêt aléatoire appropriée" peut servir de filtre pour supprimer le bruit et générer des résultats plus utiles en tant qu'entrées pour d'autres outils d'analyse.

Avertissements:

  • Est-ce une "solution miracle"? En aucune façon. Le kilométrage variera. Cela fonctionne où cela fonctionne, et pas ailleurs.
  • Existe-t-il des moyens de l'utiliser brutalement et d'obtenir des réponses erronées? youbetcha. Comme tout outil d'analyse, il a des limites.
  • Si vous léchez une grenouille, votre haleine aura-t-elle une odeur de grenouille? probable. Je n'ai pas d'expérience là-bas.

Je dois donner un "cri" à mes "peeps" qui ont fait "Spider". ( lien ) Leur exemple de problème a éclairé mon approche. ( lien ) J'aime aussi les estimateurs de Theil-Sen, et j'aimerais pouvoir donner des accessoires à Theil et Sen.

Ma réponse ne porte pas sur la façon de se tromper, mais sur la façon dont cela pourrait fonctionner si vous aviez la plupart du temps raison. Bien que j'utilise un bruit "trivial", je souhaite que vous réfléchissiez au bruit "non-trivial" ou "structuré".

L’un des atouts d’une forêt aléatoire est sa capacité à s’appliquer aux problèmes de grandes dimensions. Je ne peux pas afficher des colonnes de 20 ko (un espace dimensionnel de 20 ko) de manière visuelle. Ce n'est pas une tâche facile. Toutefois, si vous rencontrez un problème de 20 000 dimensions, une forêt aléatoire peut être un bon outil lorsque la plupart des autres tombent à plat sur leurs "faces".

Voici un exemple de suppression du bruit d'un signal à l'aide d'une forêt aléatoire.

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

Permettez-moi de décrire ce qui se passe ici. Cette image ci-dessous montre les données d'entraînement pour la classe "1". La classe "2" est uniformément aléatoire sur le même domaine et la même plage. Vous pouvez voir que "l'information" de "1" est principalement une spirale, mais a été corrompue avec le matériel de "2". Avoir 33% de vos données corrompues peut être un problème pour de nombreux outils d'adaptation. Theil-Sen commence à se dégrader à environ 29%. ( lien )

entrez la description de l'image ici

Nous séparons maintenant les informations et n’avons qu’une idée de ce qu'est le bruit.

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

Voici le résultat approprié:

entrez la description de l'image ici

J'aime beaucoup cela, car il peut montrer à la fois les forces et les faiblesses d’une méthode décente face à un problème difficile. Si vous regardez près du centre, vous constaterez que le filtrage est moins efficace. L'échelle géométrique de l'information est petite et la forêt aléatoire en manque. Cela dit quelque chose sur le nombre de nœuds, le nombre d'arbres et la densité d'échantillon pour la classe 2. Il existe également un "écart" proche de (-50, -50) et des "jets" à plusieurs endroits. En général, cependant, le filtrage est correct.

Comparez vs SVM

Voici le code pour permettre une comparaison avec 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))

Il en résulte l'image suivante.

entrez la description de l'image ici

Ceci est un SVM décent. Le gris est le domaine associé à la classe "1" par le SVM. Les points bleus sont les échantillons associés à la classe "1" par le RF. Le filtre RF fonctionne de manière comparable au SVM sans base explicitement imposée. On peut voir que les "données serrées" près du centre de la spirale sont beaucoup plus "étroitement" résolues par le RF. Il y a aussi des "îles" vers la "queue" où le RF trouve une association que le SVM ne fait pas.

Je suis diverti. Sans avoir le fond, j'ai fait l'une des premières choses également faites par un très bon contributeur sur le terrain. L'auteur d'origine utilisait "distribution de référence" ( lien , lien ).

MODIFIER:

Appliquez FOREST de manière aléatoire à ce modèle: bien
que user777 ait bien pensé qu'un CART soit l'élément d'une forêt aléatoire, le principe de base de la forêt aléatoire est "l'agrégation d'ensemble d'apprenants faibles". Le CART est un élève faible connu, mais ce n’est rien à distance d’un "ensemble". L '"ensemble", bien que dans une forêt aléatoire, est destiné "dans la limite d'un grand nombre d'échantillons". La réponse de user777, dans le diagramme de dispersion, utilise au moins 500 échantillons, ce qui en dit long sur la lisibilité humaine et la taille des échantillons. Le système visuel humain (lui-même un ensemble d'apprenants) est un capteur et un processeur de données étonnants et il considère que cette valeur est suffisante pour faciliter le traitement.

Si nous prenons même les paramètres par défaut sur un outil de forêt aléatoire, nous pouvons observer que le comportement de l'erreur de classification augmente pour les premiers arbres, et n'atteint pas le niveau d'arbre avant qu'il y ait environ 10 arbres. Initialement, l'erreur augmente, la réduction d'erreur devient stable autour de 60 arbres. Par stable je veux dire

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

Quels rendements:
entrez la description de l'image ici

Si, au lieu de regarder le "minimum faible apprenant", nous regardons le "minimum faible ensemble" suggéré par une heuristique très brève pour le réglage par défaut de l'outil, les résultats sont quelque peu différents.

Notez, j'ai utilisé des "lignes" pour dessiner le cercle indiquant le bord sur l'approximation. Vous pouvez voir que c'est imparfait, mais bien meilleur que la qualité d'un seul apprenant.

entrez la description de l'image ici

L'échantillonnage d'origine comprend 88 échantillons "intérieurs". Si la taille des échantillons est augmentée (en permettant à l'ensemble de s'appliquer), la qualité de l'approximation s'améliore également. Le même nombre d'apprenants avec 20 000 échantillons constitue un meilleur ajustement.

entrez la description de l'image ici

Les informations d’entrée beaucoup plus qualitatives permettent également d’évaluer le nombre approprié d’arbres. L'inspection de la convergence suggère que 20 arbres est le nombre minimal suffisant dans ce cas particulier pour bien représenter les données.

entrez la description de l'image ici


Comment cela prouve-t-il / réfute-t-il que RF peut être utilisé pour sélectionner des caractéristiques de haute qualité pour un modèle linéaire? Vous ne discutez pas de la sélection des fonctionnalités ou des modèles linéaires dans votre réponse.
Rétablir Monica

le postulat du demandeur est d'utiliser RF comme pré-filtre, puis d'examiner les paramètres du modèle linéaire. Il ne regardait pas les paramètres de la forêt. Lorsque je l'ai lu, à cause de son manque de profondeur ou de spécificité, le "modèle linéaire multiple" semblait secondaire. Pour moi, cela ressemblait à un "peut une RF pré-traiter / nettoyer les données avant de le coller dans l'outil d'analyse x".
EngrStudent

Je vois des artefacts horizontaux et verticaux. Je suis tenté de créer une "donnée conjuguée" sur des coordonnées tournées à 45 degrés et d’ajouter les colonnes au RF. Je parie qu'une telle transformation réduirait le nombre d'artefacts, bien que je ne sois pas sûre de la façon dont elle modifierait les paramètres d'entrée.
EngrStudent

2
En passant, la "forêt de rotation" est une variation récente de cette idée, où l’ACP est utilisée pour déterminer la nouvelle base. ncbi.nlm.nih.gov/pubmed/16986543
Rétablissement de Monica

1
Neat: Liu, Tony Fei, Ting, Kai Ming et Zhou, Zhi-Hua. «Forêt d'isolation». Data Mining, 2008. ICDM'08. Huitième conférence internationale de l'IEEE sur.
EngrStudent
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.