2

我正在学习 ML 并用于scikit-learn进行基本的决策树分类。

特征的值是分类的,所以我用来DictVectorizer转换原始特征值。这是我的代码:

training_set # list of dict representing the traing set
labels # corresponding labels of the training set
vec = DictVectorizer()
vectorized = vec.fit_transform(training_set)
clf = tree.DecisionTreeClassifier()
clf.fit(vectorized.toarray(), labels)

with open("output.dot", "w") as output_file:
    tree.export_graphviz(clf, out_file=output_file)

但我不明白输出图。它包含一棵树,每个节点都被标记X[1] <= 0.5000或类似的东西。我所期望的是标有 的节点FEATURE_1 == VALUE_1un-vectorized信息显示在树上。

是否可以?

更新:

例如,FEATURE_1具有三个可能的值AB、,C它们又分别被矢量化为0,0、。我在图表上想要的是而不是0,11,0FEATURE_1 == AX[1] <= 0.5

在此处输入图像描述

4

4 回答 4

9

您可以将特征名称传递给树导出器方法:

with open("output.dot", "w") as output_file:
    tree.export_graphviz(clf, feature_names=vec.get_feature_names(),
                         out_file=output_file)

分类器本身不知道数据的“含义”,它只处理连续的数值,因此需要使用矢量化器将分类变量一次性编码为二进制变量,可以安全地将其视为连续变量范围[0, 1],所有实际值都是 0 或 1,中间没有任何值。

要了解DictVectorizerone-hot-encoding 是如何进行的,请查看文档中的示例片段

于 2013-09-12T08:30:33.033 回答
1

X[1] <= 0.5000意味着X[1] = 0如果你有二进制变量。如果等式成立,则选择左分支。否则,右分支。你当然可以解析点文件并覆盖它(它只是一个文本文件,用正则表达式很容易做到),但它最初的构造方式是这样固定的,因为默认情况下,树的节点是不等式的。

于 2013-09-12T01:03:41.183 回答
0

当值处于连续区间时,机器学习器将对值进行排序并查找所有中间值以找到具有最高基尼指数的值。

这是合理的,因为在连续域中,找到具有精确值的测试实例的机会,例如 3.1415 是零。在这种情况下,分类器不应该知道该做什么。

我不了解 scikit-learn,但例如在 WEKA 中,可以指定值是连续的还是离散的。

于 2013-09-12T01:03:48.557 回答
0

当您执行 export_graphviz 时,请指定 feature_names,在这种情况下,它们是自变量 DataFrame 的列名。

这将为您生成输出文件中的列名,如下所示。

model = clf.fit(X, y)

dot_data = tree.export_graphviz(model, out_file=None, feature_names=X.columns.values.tolist(), class_names = None, filled=True, rounded=True, special_characters=True)

with open("output.dot", "w") as output_file:
    output_file.write(dot_data)
于 2018-01-05T18:07:36.620 回答