Extraire le « chemin » d'un point de données à travers un arbre de décision dans sklearn
-
16-10-2019 - |
Question
Je travaille avec des arbres de décision dans le scikit python apprendre. Contrairement à de nombreux cas d'utilisation pour cela, je ne suis pas tellement intéressé par la précision du classificateur à ce point tant que je suis extrais le chemin d'un point spécifique de données prend à travers l'arbre quand je l'appelle .predict()
là-dessus. Quelqu'un at-il fait cela avant? Je voudrais construire une trame de données contenant ($ x_ {i} $, chemin $ _ {i} $) paires pour une utilisation dans une analyse en aval.
La solution
On dirait que cela est plus facile à faire en R, en utilisant la bibliothèque rpart
en combinaison avec la bibliothèque partykit
. Je idéalement comme de trouver une façon de le faire en python, mais voici le code, pour toute personne intéressée (prise ):
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)
}
Illustration à l'aide des données d'iris et rpart ():
library("rpart")
library("partykit")
rp <- rpart(Species ~ ., data = iris)
rp_pred <- pathpred(rp)
rp_pred[c(1, 51, 101), ]
Cédant,
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
Ce qui semble être quelque chose que je pourrais au moins utiliser pour obtenir des informations de nœud parent partagé.