Vom Rpart-Paket generierte Testregeln
Ich möchte eine aus einem Baum generierte Regel programmgesteuert testen. In den Bäumen könnte der Weg zwischen Wurzel und Blatt (Endknoten) in der Regel interpretiert werden.
In R könnten wir das verwendenrpart
paket und mache folgendes: (In diesem Beitrag verwende ich dasiris
Datensatz, nur zum Beispiel)
library(rpart)
model <- rpart(Species ~ ., data=iris)
Mit diesen beiden Zeilen bekam ich einen Baum mit dem Namenmodel
, dessen klasse istrpart.object
(rpart
Dokumentation, Seite 21). Dieses Objekt enthält viele Informationen und unterstützt eine Vielzahl von Methoden. Insbesondere hat das Objekt eineframe
Variable (auf die standardmäßig zugegriffen werden kann:model$frame
) (idem) und die Methodepath.rpath
(rpart
Dokumentation, Seite 7), die den Pfad vom Wurzelknoten zum gewünschten Knoten angibt (node
Argument in der Funktion)
Dasrow.names
desframe
Variable enthält die Knotennummern des Baumes. Dasvar
Spalte gibt die Split-Variable im Knoten,yval
der angepasste Wert undyval2
Klassenwahrscheinlichkeiten und andere Informationen.
> model$frame
var n wt dev yval complexity ncompete nsurrogate yval2.1 yval2.2 yval2.3 yval2.4 yval2.5 yval2.6 yval2.7
1 Petal.Length 150 150 100 1 0.50 3 3 1.00000000 50.00000000 50.00000000 50.00000000 0.33333333 0.33333333 0.33333333
2 <leaf> 50 50 0 1 0.01 0 0 1.00000000 50.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000
3 Petal.Width 100 100 50 2 0.44 3 3 2.00000000 0.00000000 50.00000000 50.00000000 0.00000000 0.50000000 0.50000000
6 <leaf> 54 54 5 2 0.00 0 0 2.00000000 0.00000000 49.00000000 5.00000000 0.00000000 0.90740741 0.09259259
7 <leaf> 46 46 1 3 0.01 0 0 3.00000000 0.00000000 1.00000000 45.00000000 0.00000000 0.02173913 0.97826087
Aber nur die als gekennzeichneten<leaf>
in demvar
Spalte sind Endknoten (Blätter). In diesem Fall sind die Knoten 2, 6 und 7.
Wie oben erwähnt, können Sie diepath.rpart
Methode zum Extrahieren einer Regel (diese Technik wird in derrattle
Paket und im ArtikelSharma-Kredit-Score, wie folgt:
Darüber hinaus behält das Modell die Werte des vorhergesagten Werts bei
predicted.levels <- attr(model, "ylevels")
Dieser Wert entspricht der Spalteyval
in demmodel$frame
Datensatz.
Für das Blatt mit der Knotennummer 7 (Zeilennummer 5) ist der vorhergesagte Wert
> ylevels[model$frame[5, ]$yval]
[1] "virginica"
und die Regel ist
> rule <- path.rpart(model, nodes = 7)
node number: 7
root
Petal.Length>=2.45
Petal.Width>=1.75
So könnte die Regel als gelesen werden
If Petal.Length >= 2.45 AND Petal.Width >= 1.75 THEN Species = Virginica
Ich weiß, dass ich testen kann (in einem Testdatensatz verwende ich den Irisdatensatz erneut), wie viele echte Positive ich für diese Regel habe, wobei der neue Datensatz wie folgt untergeordnet wird
> hits <- subset(iris, Petal.Length >= 2.45 & Petal.Width >= 1.75)
und dann Berechnen der Verwirrungsmatrix
> table(hits$Species, hits$Species == "virginica")
FALSE TRUE
setosa 0 0
versicolor 1 0
virginica 0 45
(Hinweis: Ich habe den gleichen Iris-Datensatz zum Testen verwendet.)
Wie kann ich die Regel programmatisch auswerten? Ich könnte die Bedingungen wie folgt aus der Regel extrahieren
> unlist(rule, use.names = FALSE)[-1]
[1] "Petal.Length>=2.45" "Petal.Width>=1.75"
Aber wie kann ich von hier aus weitermachen? Ich kann das nicht benutzensubset
Funktion
Danke im Voraus
HINWEIS: Diese Frage wurde zur besseren Übersichtlichkeit stark überarbeitet