2017-05-24 7 views
3

J'ai formé un modèle de forêt aléatoire en utilisant scikit-learn et maintenant je veux sauvegarder ses structures arborescentes dans un fichier texte pour pouvoir l'utiliser ailleurs. Selon this link un objet arbre se compose d'un nombre de tableaux parallèles chacun contient des informations sur les différents noeuds de l'arbre (ex enfant gauche, enfant droit, quelle fonction il examine, ...). Cependant, il semble n'y avoir aucune information sur l'étiquette de classe correspondant à chaque nœud de feuille! Il n'est même pas mentionné dans les exemples fournis dans le lien ci-dessus.Où scikit-learn conserve-t-il les étiquettes de décision de chaque noeud feuille dans sa structure arborescente?

Est-ce que quelqu'un sait où sont les étiquettes de classe stockées dans la structure d'arbre de décision de scikit-learn?

Répondre

3

Prenez un coup d'oeil à la documentation pour sklearn.tree.DecisionTreeClassifier.tree_.value:

from sklearn.datasets import load_iris 
from sklearn.cross_validation import cross_val_score 
from sklearn.tree import DecisionTreeClassifier 

clf = DecisionTreeClassifier(random_state=0) 
iris = load_iris() 

clf.fit(iris.data, iris.target) 

print(clf.classes_) 

[0, 1, 2] 

print(clf.tree_.value) 

[[[ 50. 50. 50.]] 

[[ 50. 0. 0.]] 

[[ 0. 50. 50.]] 

[[ 0. 49. 5.]] 

[[ 0. 47. 1.]] 

[[ 0. 47. 0.]] 

[[ 0. 0. 1.]] 

[[ 0. 2. 4.]] 

[[ 0. 0. 3.]] 

[[ 0. 2. 1.]] 

[[ 0. 2. 0.]] 

[[ 0. 0. 1.]] 

[[ 0. 1. 45.]] 

[[ 0. 1. 2.]] 

[[ 0. 0. 2.]] 

[[ 0. 1. 0.]] 

[[ 0. 0. 43.]]] 

Chaque ligne de clf.tree_.value « contient la valeur de prédiction constante de chaque noeud, » (help(clf.tree_)) qui correspond à l'indice index des clf.classes_.

Voir this answer pour (à peine) plus de détails.

+2

En ajoutant à la réponse, pour chaque ligne de ce tableau, vous pouvez faire 'clf.classes_ [np.argmax (value)]' pour obtenir le label de classe prédit. –

+0

@not_a_robot Merci. vous l'avez parfaitement expliqué. Cependant je ne peux toujours pas trouver où clf.tree_.value est mentionné dans la documentation. Je suppose que je n'en ai plus besoin puisque ta réponse est exactement ce que je cherchais. – user3597574

+0

Juste une autre petite question. On dirait que clf.classes_ me donne des étiquettes de [0, ..., n-1], quelles que soient les étiquettes que j'utilise. Ai-je raison? Je m'attendais à [1, ..., n] Dans mon cas. – user3597574