web-dev-qa-db-fra.com

Interprétation aléatoire de la production forestière

J'ai exécuté une forêt aléatoire pour mes données et obtenu le résultat sous la forme d'une matrice . Quelles sont les règles appliquées pour la classification?

P.S. Je veux un profil du client en sortie, Par exemple. Personne de New York, travaille dans l'industrie de la technologie, etc.

Comment puis-je interpréter les résultats d'une forêt aléatoire?

24
user2061730

Regarder les règles appliquées par chaque arbre

En supposant que vous utilisiez le package randomForest, vous accédez ainsi aux arbres équipés de la forêt.

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

Ceci montre la sortie de l'arbre n ° 1 sur 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
...

Vous commencez à lire à la première ligne ce qui décrit la division racine. La division racine était basée sur la variable 3, c.-à-d. si Petal.Length <= 2.50 continue sur le noeud fille gauche (ligne 2) et si Petal.Length > 2.50 continue sur le noeud fille droit (ligne 3). Si le statut d'une ligne est -1, comme c'est le cas sur la ligne 2, cela signifie que nous avons atteint une feuille et allons effectuer une prédiction, dans ce cas la classe 1, i.e. setosa.

Tout est écrit dans le manuel, alors regardez ?randomForest et ?getTree pour plus de détails.

Regarder une importance variable dans toute la forêt

Regardez ?importance et ?varImpPlot. Cela vous donne un seul score par variable agrégée sur toute la forêt.

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

Le paquetage " inTrees " R pourrait être utile. 

Voici un exemple. 

Extraire les règles brutes d'une forêt aléatoire:

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"

Mesurer les règles. len est le nombre de paires variable-valeur dans une condition, freq est le pourcentage de données satisfaisant une condition, pred est le résultat d'une règle, c'est-à-dire, condition => pred, err est le taux d'erreur d'une règle. 

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"

Taillez chaque règle:

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"

Sélectionnez un jeu de règles compact:

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

Construisez une liste de règles ordonnées en tant que classificateur:

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

Rendre les règles plus lisibles:

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"

Extrayez les interactions de variables fréquentes (notez que les règles ne sont pas élaguées ou sélectionnées): 

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"

On peut également présenter ces modèles fréquents sous une forme lisible à l’aide de la fonction presentRules. 

De plus, des règles ou des modèles fréquents peuvent être formatés dans 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}
32
H.D.

En plus des bonnes réponses ci-dessus, j'ai trouvé un autre instrument intéressant conçu pour explorer les sorties générales d'une forêt aléatoire: function explain_forest le package randomForestExplainer. Voir ici pour plus de détails.

exemple de code:

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

Remarque: localImp doit être défini sur TRUE, sinon le explain_forest se ferme avec une erreur.

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

Cela générera un fichier .html, nommé Your_forest_explained.html, dans votre my/destination/path que vous pourrez facilement ouvrir dans un navigateur Web.

Dans ce rapport, vous trouverez des informations utiles sur la structure des arbres et des forêts, ainsi que plusieurs statistiques utiles sur les variables.

A titre d'exemple, voir ci-dessous une représentation graphique de la distribution de la profondeur minimale entre les arbres de la forêt développée.

enter image description here

ou l'une des parcelles d'importance à plusieurs voies

enter image description here

Vous pouvez vous référer à this pour l'interprétation du rapport.

1
Nemesi