当使用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片。
另一个更新:------
在阅读代码here和here之后,我终于弄清楚了,GBDT的decision_function返回init_value+sum_{for each leaf}(learning_rate*leaf_value)
,预测概率是decision_function的一个简单函数。