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?
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.
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
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}
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.
ou l'une des parcelles d'importance à plusieurs voies
Vous pouvez vous référer à this pour l'interprétation du rapport.