it-swarm.com.de

Zufällige Interpretation der Gesamtstruktur

Ich habe eine zufällige Gesamtstruktur für meine Daten ausgeführt und die Ausgabe in Form einer Matrix erhalten. Welche Regeln wurden zur Klassifizierung angewendet?

P.S. Ich möchte ein Profil des Kunden als Ausgabe, z. Person aus New York, arbeitet in der Technologiebranche usw.

Wie kann ich die Ergebnisse einer zufälligen Gesamtstruktur interpretieren?

24
user2061730

Betrachten Sie die Regeln, die von jedem einzelnen Baum angewendet werden

Wenn Sie das Paket randomForest verwenden, greifen Sie auf die angepassten Bäume im Wald zu.

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

Dies zeigt die Ausgabe von Baum 1 von 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
...

Sie beginnen mit dem Lesen in der ersten Zeile, die den Wurzelspalt beschreibt. Die Wurzelaufteilung basierte auf Variable 3, d. H., Wenn Petal.Length <= 2.50 zum linken Tochterknoten (Zeile 2) und wenn Petal.Length > 2.50 zum rechten Tochterknoten (Zeile 3) weitergeht. Wenn der Status einer Zeile -1 ist, wie in Zeile 2, bedeutet dies, dass wir ein Blatt erreicht haben und eine Vorhersage treffen, in diesem Fall die Klasse 1, d. H.setosa.

Es ist alles im Handbuch geschrieben, also schauen Sie sich ?randomForest und ?getTree für weitere Details an.

Betrachtung der unterschiedlichen Bedeutung im gesamten Wald

Schauen Sie sich ?importance und ?varImpPlot an. Auf diese Weise erhalten Sie eine einzelne Bewertung für jede Variable, die in der gesamten Gesamtstruktur zusammengefasst ist.

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

Das Paket " inTrees " R kann hilfreich sein. 

Hier ist ein Beispiel. 

Extrahiere rohe Regeln aus einer zufälligen Gesamtstruktur:

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"

Regeln messen. len ist die Anzahl der Paare mit variablen Werten in einer Bedingung, freq ist der Prozentsatz der Daten, die eine Bedingung erfüllen, pred ist das Ergebnis einer Regel, dh condition => pred, err ist die Fehlerrate einer Regel. 

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"

Beschneide jede Regel:

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"

Wählen Sie einen kompakten Regelsatz aus:

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

Erstellen Sie eine geordnete Regelliste als Klassifizierer:

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

Regeln lesbarer machen:

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"

Häufige Variableninteraktionen extrahieren (Beachten Sie, dass die Regeln nicht gelöscht oder ausgewählt werden): 

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"

Diese häufigen Muster können auch mit der Funktion presentRules in lesbarer Form dargestellt werden. 

Außerdem können Regeln oder häufige Muster in LaTex formatiert werden. 

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.

Neben den oben genannten großartigen Antworten fand ich ein anderes Instrument interessant, um die allgemeinen Ausgaben einer zufälligen Gesamtstruktur zu untersuchen: Funktion explain_forest das Paket randomForestExplainer. hier für weitere Details.

beispielcode:

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

Bitte beachten Sie: localImp muss als TRUE eingestellt sein, andernfalls wird der explain_forest mit einem Fehler beendet

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

Dadurch wird eine .html-Datei mit dem Namen Your_forest_explained.html in Ihrem my/destination/path generiert, die Sie problemlos in einem Webbrowser öffnen können.

In diesem Bericht finden Sie nützliche Informationen zur Struktur von Bäumen und Gesamtstrukturen sowie einige nützliche Statistiken zu den Variablen.

Als Beispiel sehen Sie unten ein Diagramm der Verteilung der minimalen Tiefe zwischen den Bäumen des gewachsenen Waldes

 enter image description here

oder eines der Multi-Way-Wichtungsdiagramme

 enter image description here

Sie können sich auf this beziehen, um den Bericht zu interpretieren.

1
Nemesi