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]