当使用 sklearn.ensemble.GradientBoostingClassifier 构建 GBDT 时,我有一组树。我可以弄清楚一棵树的结构。但是对于一组树,我怎么知道以哪种方式访问这些树?
以以下代码为例,
from sklearn.datasets import load_iris
from sklearn import tree
from sklearn.ensemble import GradientBoostingClassifier
clf = GradientBoostingClassifier(n_estimators=4)
iris = load_iris()
clf = clf.fit(iris.data, iris.target)
然后,我有4棵树,也就是说,
for i in range(4):
print(clf.estimators_[i,0].tree_)
而且,我可以用树木做到这一点,
clf.predict( array([0,1,2,3]).reshape(1, -1) )
但是在哪个轮次访问 clf.estimators_[0,0].tree_ .. clf.estimators_[3,0].tree_?以及结果是如何组合在一起的?
在手册中,据说,“现在公开一个应用方法来检索每个样本在每次尝试下最终进入的叶索引”。
clf.apply( array([0,1,2,3]).reshape(1, -1) )
我获得了以下数组,
[[ 1., 7., 10.],
[ 1., 7., 10.],
[ 4., 7., 10.],
[ 1., 1., 10.]]
但是怎么读呢?
更新: - - -
我已经从这里阅读了一些源代码:https ://github.com/scikit-learn/scikit-learn/blob/master/sklearn/ensemble/gradient_boosting.py#L1247 看来,索引只是索引,但编码与非叶节点。这就解释了为什么只有 8 片叶子,但内切可以大于 8。
另一个更新:------
看了这里和这里的代码,终于搞明白了,GBDT的decision_function返回init_value+sum_{for each leaf}(learning_rate*leaf_value)
,预测概率就是decision_function的一个简单函数。