sklearn.ensemble.GradientBoostingClassifier を使用して GBDT を構築すると、ツリーのセットができます。1 本の木の構造を把握できます。しかし、一連のツリーの場合、どの方法でツリーにアクセスしたかを知るにはどうすればよいでしょうか?
たとえば、次のコードを見てください。
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_ にアクセスしますか? 結果はどのようにまとめられますか?
マニュアルでは、「各サンプルが各試行の下で終了するリーフ インデックスを取得するための apply メソッドを公開するようになりました」と記載されています。
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 の単純な関数であることが最終的にわかりました。