web-dev-qa-db-fra.com

Comment accéder à la profondeur de l'arborescence dans scikit-learn de Python?

J'utilise scikit-learn pour créer une forêt aléatoire. Cependant, je veux trouver les profondeurs individuelles de chaque arbre. Cela semble être un attribut simple à avoir mais selon la documentation, ( http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html ) il n'y a aucun moyen d'y accéder.

Si cela n'est pas possible, existe-t-il un moyen d'accéder à la profondeur de l'arbre à partir d'un modèle d'arbre de décision?

Toute aide serait appréciée. Je vous remercie.

22
iltp38

Chaque instance de RandomForestClassifier possède un attribut estimators_, qui est une liste d'instances DecisionTreeClassifier . La documentation montre qu'une instance de DecisionTreeClassifier a un attribut tree_, qui est une instance de la classe (non documentée, je crois) Tree. Une exploration dans l'interpréteur montre que chaque instance de Tree a un paramètre max_depth qui apparaît pour être ce que vous ' re cherche - encore une fois, il est sans papiers.

Dans tous les cas, si forest est votre instance de RandomForestClassifier, alors:

>>> [estimator.tree_.max_depth for estimator in forest.estimators_]
[9, 10, 9, 11, 9, 9, 11, 7, 13, 10]

devrait faire l'affaire.

Chaque estimateur possède également une méthode get_depth() qui peut être utilisée pour récupérer la même valeur avec une syntaxe plus brève:

>>> [estimator.get_depth() for estimator in forest.estimators_]
[9, 10, 9, 11, 9, 9, 11, 7, 13, 10]

Pour éviter le mélange, il convient de noter qu'il existe un attribut de chaque estimateur (et non le tree_) de chaque estimateur appelé max depth qui renvoie le réglage du paramètre plutôt que la profondeur de la arbre réel. La relation entre estimator.get_depth(), estimator.tree_.max_depth et estimator.max_depth est expliquée dans l'exemple ci-dessous:

from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier(n_estimators=3, random_state=4, max_depth=6)
iris = load_iris()
clf.fit(iris['data'], iris['target'])
[(est.get_depth(), est.tree_.max_depth, est.max_depth) for est in clf.estimators_]

En dehors:

[(6, 6, 6), (3, 3, 6), (4, 4, 6)]

Définir la profondeur maximale à la valeur par défaut None permettrait au premier arbre de s'étendre jusqu'à la profondeur 7 et la sortie serait:

[(7, 7, None), (3, 3, None), (4, 4, None)]
32
jme