【问题标题】:How to make Python decision tree more understandable?如何让 Python 决策树更容易理解?
【发布时间】:2026-02-03 17:50:02
【问题描述】:

我有一个数据文件。数据的最后一列具有 +1 和 -1 区别变量。我还将每列的 id 名称放在一个单独的文件中。

例如

1 2 3 4 1
5 6 7 8 1
9 1 2 3 -1
4 5 6 7 -1
8 9 1 2 -1

对于每一列,我分别有 Q1、Q2、Q3、Q4、Q5 名称。

我想实现决策树分类器,所以我写了以下代码:

import numpy
from sklearn import tree

print('Reading data from ' + fileName);
data = numpy.loadtxt(fileName);
print('Getting ids from ', idFile)
idArray = numpy.genfromtxt('cleanedID.csv', dtype='str')

print('Adding ids')
print('data dimensions: ', data.shape)
print('idArray dimensions: ', idArray.shape)
data = numpy.append(idArray, data, axis = 0)


y = data[:,-1]
x = data[:, 1:-1]

classifier = tree.DecisionTreeClassifier(max_depth = depth)
classifier = classifier.fit(x, y)

with open('graph.dot', 'w') as file:
    tree.export_graphviz(classifier, out_file = file)

file.close()

我使用 graphviz 将 .dot 文件转换为 .png 文件。

问题在于决策树看起来像:

我不明白 X[number] 是什么意思。我搜索并发现 value = [5 0] 表示 5 类有 0 个对象,0 类有 5 个对象,但我只有 +1 和 -1 区分变量。无论如何我可以调整这个决策树,以便我可以在决策树图片中看到列名(Q1、Q2、Q3....),这样我就可以理解这意味着什么?

谢谢

【问题讨论】:

  • 您的数据有多少列?
  • @yangjie 有603列
  • X[n] 仅表示第 n 列中的值

标签: python tree scikit-learn data-analysis


【解决方案1】:

Value = [5 0] 表示第一个类有 5 个成员,第二个类有 0 个成员。对你来说,班级顺序大概是[-1 1]

关于列名:正如 yangjie 指出的,X[158] 表示第 159 列(零索引)。规则已经很清楚了:X[168]<=1.5 表示对于给定的行,树根据第 168 列的值以及它与 1.5 的比较来决定是向左还是向右。

您可以使用feature_names 可选参数将列名添加到export_graphviz

【讨论】:

  • 杨杰指出了这一点。您说过 X[168]
  • 编辑说明如何添加功能名称。您关于行数的问题没有意义。决策树作用于单行。对于单行,它试图通过在每个结点将该行中的特定列值与阈值进行比较来到达末端叶子。对于单行,第 168 列只有一个值。如果您在谈论训练,那么“样本”数量是可以合理显示的最多信息:这么多样本向左,那么多样本向右(samples==rows)。
  • 谢谢!你解决了我的问题。只是一个简单的问题,value = [a, b] 中的类的顺序是居高临下的吗?
  • 是的,他们从最傲慢到最小。实际上,它们通常按字典顺序排列(即,将它们放在 Python 列表中并排序)。