web-dev-qa-db-ja.com

Pythonのscikit-learnでツリーの深さにどのようにアクセスしますか?

私はscikit-learnを使用してランダムフォレストを作成しています。しかし、私は各木の個々の深さを見つけたいです。単純な属性のように見えますが、ドキュメントによると( http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html )方法はありませんそれへのアクセスの。

これが不可能な場合、ディシジョンツリーモデルからツリーの深さにアクセスする方法はありますか?

任意の助けいただければ幸いです。ありがとうございました。

22
iltp38

RandomForestClassifierの各インスタンスには_estimators__属性があり、これは DecisionTreeClassifier インスタンスのリストです。ドキュメントは、DecisionTreeClassifierのインスタンスが_tree__属性を持っていることを示しています。これは(ドキュメント化されていない)Treeクラスのインスタンスです。インタプリタのいくつかの調査では、各Treeインスタンスに_max_depth_パラメータがあり、これはが表示されているように見えるなぜなら、これも文書化されていないからです。

いずれの場合でも、forestRandomForestClassifierのインスタンスである場合、次のようになります。

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

トリックを行う必要があります。

各推定器には get_depth() メソッドもあり、より簡単な構文で同じ値を取得するために使用できます。

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

混同を避けるために、実際のツリーの深さではなくパラメーターの設定を返す_tree__と呼ばれる各推定量の属性(および各推定量の_max depth_ではない)があることに注意してください。以下の例では、estimator.get_depth()、_estimator.tree_.max_depth_、および_estimator.max_depth_が相互にどのように関連しているかが明確になっています。

_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_]
_

でる:

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

最大深度をデフォルト値Noneに設定すると、最初のツリーが深度7まで拡張され、出力は次のようになります。

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