如何获得sklearn GBDT的整个决策过程?

时间:2017-12-04 06:11:44

标签: python tree scikit-learn boosting

当使用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片。

另一个更新:------

在阅读代码herehere之后,我终于弄清楚了,GBDT的decision_function返回init_value+sum_{for each leaf}(learning_rate*leaf_value),预测概率是decision_function的一个简单函数。

0 个答案:

没有答案