【问题标题】:is there any way to get samples under each leaf of a decision tree?有没有办法在决策树的每一片叶子下获取样本?
【发布时间】:2018-01-06 00:19:27
【问题描述】:

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

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

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

【问题讨论】:

标签: python machine-learning scikit-learn decision-tree


【解决方案1】:

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

clf.apply(iris.data)

数组([ 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, 5, 14, 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, 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)

然后遍历决策路径,将它们转换为带有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)

完整代码

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) 

输出

print(samples[13])

[70, 126, 138]

【讨论】:

  • print(samples[13]) 这里的 13 代表什么?输出 [70, 126, 138] 表示特征向量的索引吗?
  • 13是节点号
  • 我可以得到一个测试样本的决策路径,而不是训练样本吗?
  • @AlaaM。你可以运行clf.decision_path(my_test_samples),你应该得到这些样本的决策路径。
  • @AlaaM。看看这个答案:stackoverflow.com/a/43218264/2776376,如果你传入一个样本,你可以为所有有一个样本的节点着色,你可以可视化这个特定样本的决定。
猜你喜欢
  • 2021-01-02
  • 2021-12-25
  • 2020-01-02
  • 1970-01-01
  • 2011-03-03
  • 2020-11-09
  • 2017-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多