繁体   English   中英

如何强制决策树分成不同的类

[英]How to force decision tree to split into different classes

我正在做一棵决策树,我想强制算法在一个节点之后将结果分成不同的类。 问题是,在我得到的树中,在评估条件(X < 小于某个值)之后,我得到了相同 class 的两个结果(例如,是和是)。 我希望将“是”和“否”作为节点评估的结果。 这是我得到的示例:

1

这是生成树和 plot 的代码:

clf = tree.DecisionTreeClassifier(max_depth=2)
clf = clf.fit(users_data, users_target)

dot_data = tree.export_graphviz(clf, out_file=None, 
                     feature_names= feature_names,  
                     class_names= target_names,  
                     filled=True, rounded=True,  
                     special_characters=True) 

graph = graphviz.Source(dot_data)  
graph

我希望在节点之后找到“YES”和“NO”类。 现在,我在各自条件之后的最后一个级别中获得了相同的课程。

谢谢!

实际上,您的 model 确实看起来确实没有在第一级和第二级节点之间提供任何进一步的区分; 因此,如果您确定这对于您的情况是(某种)最优的,您可以简单地使用max_depth=1而不是 2 要求它停止:

clf = tree.DecisionTreeClassifier(max_depth=1)

但是请记住,实际上这可能远非最佳; 查看 scikit-learn 文档中 iris 数据集的树:

在此处输入图像描述

您可以看到,在树级别的更下方,具有class=versicolor的节点从看起来像class=virginica的“纯”节点出现(反之亦然)。

因此,在决定事先将树修剪为max_depth=1之前,您可能需要检查是否让它进一步增长(即不指定max_depth参数,从而将其保留为默认值None ),这可能对您更好案子。

一切都取决于你为什么要这样做(即你的商业案例):如果它是一个探索性的,你很可能会停止max_depth=1 如果它是预测性的,您应该考虑哪种配置可以最大化适当的指标(最有可能是准确性)。

尝试使用标准 =“熵”。 我发现这可以解决问题

决策树的拆分在某种程度上是推测性的,只要选择的标准因拆分而减少,它们就会发生。 正如您所注意到的,这并不能保证特定的拆分会导致拆分后不同的类占多数。 限制树的深度是您看到分裂没有“发挥”出来的部分原因,直到它可以到达不同类的节点。

修剪树应该会有所帮助。 使用DecisionTreeClassifierccp_alpha参数的合适值,我能够避免类似的问题。 这是我的前后树。

修剪前

修剪后

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM