Extrahieren Sie den „Pfad“ eines Datenpunkts durch einen Entscheidungsbaum in Sklearn
-
16-10-2019 - |
Frage
Ich arbeite mit Entscheidungsbäumen in Pythons Scikit Learn. Im Gegensatz zu vielen Anwendungsfällen dafür bin ich an dieser Stelle nicht so sehr an der Genauigkeit des Klassifikators interessiert, als ich den spezifischen Pfad extrahiere, den ein Datenpunkt durch den Baum nimmt, wenn ich aufrufe .predict()
darauf. Hat jemand das schon einmal gemacht? Ich möchte einen Datenrahmen erstellen, der ($ x_ {i} $, Pfad $ _ {i} $) Pairs für die Verwendung in einer Down-Stream-Analyse enthält.
Lösung
Es sieht so aus rpart
Bibliothek in Kombination mit dem partykit
Bibliothek. Ich würde idealerweise gerne einen Weg finden, dies in Python zu tun, aber hier ist der Code für alle, die interessiert sind (genommen von genommen von hier):
pathpred <- function(object, ...){
## coerce to "party" object if necessary
if(!inherits(object, "party")) object <- as.party(object)
## get standard predictions (response/prob) and collect in data frame
rval <- data.frame(response = predict(object, type = "response", ...))
rval$prob <- predict(object, type = "prob", ...)
## get rules for each node
rls <- partykit:::.list.rules.party(object)
## get predicted node and select corresponding rule
rval$rule <- rls[as.character(predict(object, type = "node", ...))]
return(rval)
}
Abbildung unter Verwendung der IRIS -Daten und der RPART ():
library("rpart")
library("partykit")
rp <- rpart(Species ~ ., data = iris)
rp_pred <- pathpred(rp)
rp_pred[c(1, 51, 101), ]
Nachgeben,
response prob.setosa prob.versicolor prob.virginica
1 setosa 1.00000000 0.00000000 0.00000000
51 versicolor 0.00000000 0.90740741 0.09259259
101 virginica 0.00000000 0.02173913 0.97826087
rule
1 Petal.Length < 2.45
51 Petal.Length >= 2.45 & Petal.Width < 1.75
101 Petal.Length >= 2.45 & Petal.Width >= 1.75
Das scheint etwas zu sein, was ich zumindest verwenden könnte, um gemeinsame Informationen zur gemeinsamen übergeordneten Knoten abzuleiten.