我正在使用scikit-learn创建随机森林。然而,我想找到每棵树的个体深度。这似乎是一个简单的属性,但根据文档(http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html),没有访问它的方法。
如果不可能,是否有一种从决策树模型中访问树深度的方法?
任何帮助将不胜感激。谢谢。
如果不可能,是否有一种从决策树模型中访问树深度的方法?
任何帮助将不胜感激。谢谢。
DecisionTreeClassifier
实例的列表。文档显示,`DecisionTreeClassifier`实例具有`tree_`属性,这是`Tree`类(我认为是未记录的)的一个实例。在解释器中的一些探索显示,每个`Tree`实例都有一个`max_depth`参数,看起来这可能是您要查找的内容--再次强调,这是未经记录的。>>> [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)]
del forest.estimators_[0]
。或者仅保留深度为10或以上的树:forest.estimators_ = [e for e in forest.estimators_ if e.tree.max_depth >= 10]
。但看起来RandomForestClassifier
并不是以这种方式构建的,通过修改forest.estimators_
可能会破坏某些东西。您可以尝试并查看结果是否合理。如果是,请更新forest.n_estimators = len(forest.estimators_)
以确保安全。 - jmemax_depth=10
训练的随机森林将返回:[10, 10, 10, ...]
。 - jon_simon