有没有办法在决策树的每个叶子下面获取样本?

Far*_*han 8 python machine-learning decision-tree scikit-learn

我使用数据集训练了决策树.现在我想看看哪些样本落在树的哪个叶子下面.

从这里我想要红色圆圈样本.

在此输入图像描述

我正在使用Python的Sklearn的决策树实现.

Max*_*ers 11

如果您只想要每个样品的叶子,您可以使用

clf.apply(iris.data)
Run Code Online (Sandbox Code Playgroud)

数组([1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ,1,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,14,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,14,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5 ,5,5,5,10,5,5,5,5,5,10,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,10,5,5,5,5,10,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,10,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5 ,5,16,16,16,16,16,16,6,16,16,16,16,16,16,16,16,16,16,16,16,8,16,16,16,16 ,16,16,15,16,16,11,16,16,16,8,8,16,16,16,15,16,16,16,16,16,16,16,16,16,16 ,16])

如果要获取每个节点的所有样本,可以使用计算所有决策路径

dec_paths = clf.decision_path(iris.data)
Run Code Online (Sandbox Code Playgroud)

然后遍历决策路径,将它们转换为数组,toarray()并检查它们是否属于某个节点.所有内容都存储在defaultdict密钥是节点编号的位置,值是样本编号.

for d, dec in enumerate(dec_paths):
    for i in range(clf.tree_.node_count):
        if dec.toarray()[0][i] == 1:
            samples[i].append(d)
Run Code Online (Sandbox Code Playgroud)

完整的代码

import sklearn.datasets
import sklearn.tree
import collections

clf = sklearn.tree.DecisionTreeClassifier(random_state=42)
iris = sklearn.datasets.load_iris()
clf = clf.fit(iris.data, iris.target)

samples = collections.defaultdict(list)
dec_paths = clf.decision_path(iris.data)

for d, dec in enumerate(dec_paths):
    for i in range(clf.tree_.node_count):
        if dec.toarray()[0][i] == 1:
            samples[i].append(d) 
Run Code Online (Sandbox Code Playgroud)

产量

print(samples[13])
Run Code Online (Sandbox Code Playgroud)

[70,126,138]