studio mtext ggplot change r profiling output random-forest

mtext - Interpretación de salida forestal aleatoria



plot title r (3)

He ejecutado un bosque aleatorio para mis datos y obtuve la salida en forma de una matriz. ¿Cuáles son las reglas que aplica para clasificar?

PS Quiero un perfil del cliente como resultado, por ejemplo, Persona de Nueva York, trabaja en la industria de la tecnología, etc.

¿Cómo puedo interpretar los resultados de un bosque aleatorio?


Mirando las reglas aplicadas por cada árbol individual.

Suponiendo que usa el paquete randomForest , así es como accede a los árboles ajustados en el bosque.

library(randomForest) data(iris) rf <- randomForest(Species ~ ., iris) getTree(rf, 1)

Esto muestra la salida del árbol # 1 de 500:

left daughter right daughter split var split point status prediction 1 2 3 3 2.50 1 0 2 0 0 0 0.00 -1 1 3 4 5 4 1.65 1 0 4 6 7 4 1.35 1 0 5 8 9 3 4.85 1 0 6 0 0 0 0.00 -1 2 ...

Comienzas a leer en la primera línea que describe la división de la raíz. La división de la raíz se basó en la variable 3, es decir , si Petal.Length <= 2.50 continúa al nodo Petal.Length > 2.50 izquierdo (línea 2) y si Petal.Length > 2.50 continúa al nodo Petal.Length > 2.50 derecho (línea 3). Si el estado de una línea es -1 , como está en la línea 2, significa que hemos alcanzado una hoja y realizaremos una predicción, en este caso clase 1 , es decir , setosa .

Todo está escrito en el manual, así que eche un vistazo a ?randomForest y ?getTree para obtener más detalles.

Mirando la importancia variable en todo el bosque

Echa un vistazo a ?importance y ?varImpPlot . Esto le proporciona una única puntuación por variable agregada en todo el bosque.

> importance(rf) MeanDecreaseGini Sepal.Length 10.03537 Sepal.Width 2.31812 Petal.Length 43.82057 Petal.Width 43.10046


Además de las excelentes respuestas anteriores, encontré interesante otro instrumento diseñado para explorar los resultados generales de un bosque aleatorio: función explain_forest el paquete randomForestExplainer . Vea here para más detalles.

código de ejemplo:

library(randomForest) data(Boston, package = "MASS") Boston$chas <- as.logical(Boston$chas) set.seed(123) rf <- randomForest(medv ~ ., data = Boston, localImp = TRUE)

Tenga en cuenta que: localImp debe configurarse como TRUE , de lo contrario, la explain_forest se explain_forest con un error

library(randomForestExplainer) setwd(my/destination/path) explain_forest(rf, interactions = TRUE, data = Boston)

Esto generará un archivo .html , llamado Your_forest_explained.html , en su my/destination/path que puede abrir fácilmente en un navegador web.

En este informe encontrará información útil sobre la estructura de árboles y bosques y varias estadísticas útiles sobre las variables.

Como ejemplo, vea a continuación una gráfica de la distribución de profundidad mínima entre los árboles del bosque cultivado

o una de las parcelas de importancia de múltiples vías

Puede referirse a here para la interpretación del informe.


El inTrees " inTrees " R podría ser útil.

Aquí hay un ejemplo.

Extraer reglas brutas de un bosque aleatorio:

library(inTrees) library(randomForest) data(iris) X <- iris[, 1:(ncol(iris) - 1)] # X: predictors target <- iris[,"Species"] # target: class rf <- randomForest(X, as.factor(target)) treeList <- RF2List(rf) # transform rf object to an inTrees'' format exec <- extractRules(treeList, X) # R-executable conditions exec[1:2,] # condition # [1,] "X[,1]<=5.45 & X[,4]<=0.8" # [2,] "X[,1]<=5.45 & X[,4]>0.8"

Mida las reglas len es el número de pares de valores variables en una condición, freq es el porcentaje de datos que satisfacen una condición, pred es el resultado de una regla, es decir, condition => pred , err es la tasa de error de una regla.

ruleMetric <- getRuleMetric(exec,X,target) # get rule metrics ruleMetric[1:2,] # len freq err condition pred # [1,] "2" "0.3" "0" "X[,1]<=5.45 & X[,4]<=0.8" "setosa" # [2,] "2" "0.047" "0.143" "X[,1]<=5.45 & X[,4]>0.8" "versicolor"

Pode cada regla:

ruleMetric <- pruneRule(ruleMetric, X, target) ruleMetric[1:2,] # len freq err condition pred # [1,] "1" "0.333" "0" "X[,4]<=0.8" "setosa" # [2,] "2" "0.047" "0.143" "X[,1]<=5.45 & X[,4]>0.8" "versicolor"

Seleccione un conjunto de reglas compacto:

(ruleMetric <- selectRuleRRF(ruleMetric, X, target)) # len freq err condition pred impRRF # [1,] "1" "0.333" "0" "X[,4]<=0.8" "setosa" "1" # [2,] "3" "0.313" "0" "X[,3]<=4.95 & X[,3]>2.6 & X[,4]<=1.65" "versicolor" "0.806787615686919" # [3,] "4" "0.333" "0.04" "X[,1]>4.95 & X[,3]<=5.35 & X[,4]>0.8 & X[,4]<=1.75" "versicolor" "0.0746284932951366" # [4,] "2" "0.287" "0.023" "X[,1]<=5.9 & X[,2]>3.05" "setosa" "0.0355855756152103" # [5,] "1" "0.307" "0.022" "X[,4]>1.75" "virginica" "0.0329176860493297" # [6,] "4" "0.027" "0" "X[,1]>5.45 & X[,3]<=5.45 & X[,4]<=1.75 & X[,4]>1.55" "versicolor" "0.0234818254947883" # [7,] "3" "0.007" "0" "X[,1]<=6.05 & X[,3]>5.05 & X[,4]<=1.7" "versicolor" "0.0132907201116241"

Construye una lista de reglas ordenadas como un clasificador:

(learner <- buildLearner(ruleMetric, X, target)) # len freq err condition pred # [1,] "1" "0.333333333333333" "0" "X[,4]<=0.8" "setosa" # [2,] "3" "0.313333333333333" "0" "X[,3]<=4.95 & X[,3]>2.6 & X[,4]<=1.65" "versicolor" # [3,] "4" "0.0133333333333333" "0" "X[,1]>5.45 & X[,3]<=5.45 & X[,4]<=1.75 & X[,4]>1.55" "versicolor" # [4,] "1" "0.34" "0.0196078431372549" "X[,1]==X[,1]" "virginica"

Hacer las reglas más legibles:

readableRules <- presentRules(ruleMetric, colnames(X)) readableRules[1:2, ] # len freq err condition pred # [1,] "1" "0.333" "0" "Petal.Width<=0.8" "setosa" # [2,] "3" "0.313" "0" "Petal.Length<=4.95 & Petal.Length>2.6 & Petal.Width<=1.65" "versicolor"

Extraiga interacciones de variables frecuentes (tenga en cuenta que las reglas no se eliminan ni se seleccionan):

rf <- randomForest(X, as.factor(target)) treeList <- RF2List(rf) # transform rf object to an inTrees'' format exec <- extractRules(treeList, X) # R-executable conditions ruleMetric <- getRuleMetric(exec, X, target) # get rule metrics freqPattern <- getFreqPattern(ruleMetric) # interactions of at least two predictor variables freqPattern[which(as.numeric(freqPattern[, "len"]) >= 2), ][1:4, ] # len sup conf condition pred # [1,] "2" "0.045" "0.587" "X[,3]>2.45 & X[,4]<=1.75" "versicolor" # [2,] "2" "0.041" "0.63" "X[,3]>4.75 & X[,4]>0.8" "virginica" # [3,] "2" "0.039" "0.604" "X[,4]<=1.75 & X[,4]>0.8" "versicolor" # [4,] "2" "0.033" "0.675" "X[,4]<=1.65 & X[,4]>0.8" "versicolor"

También se pueden presentar estos patrones frecuentes en una forma legible utilizando la función presentRules.

Además, las reglas o patrones frecuentes se pueden formatear en LaTex.

library(xtable) print(xtable(freqPatternSelect), include.rownames=FALSE) # /begin{table}[ht] # /centering # /begin{tabular}{lllll} # /hline # len & sup & conf & condition & pred // # /hline # 2 & 0.045 & 0.587 & X[,3]$>$2.45 /& X[,4]$<$=1.75 & versicolor // # 2 & 0.041 & 0.63 & X[,3]$>$4.75 /& X[,4]$>$0.8 & virginica // # 2 & 0.039 & 0.604 & X[,4]$<$=1.75 /& X[,4]$>$0.8 & versicolor // # 2 & 0.033 & 0.675 & X[,4]$<$=1.65 /& X[,4]$>$0.8 & versicolor // # /hline # /end{tabular} # /end{table}