为啥我的决策树会创建一个实际上并未划分样本的拆分?
Posted
技术标签:
【中文标题】为啥我的决策树会创建一个实际上并未划分样本的拆分?【英文标题】:Why is my decision tree creating a split that doesn't actually divide the samples?为什么我的决策树会创建一个实际上并未划分样本的拆分? 【发布时间】:2018-10-09 04:39:34 【问题描述】:这是我对著名的Iris 数据集进行二特征分类的基本代码:
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier, export_graphviz
from graphviz import Source
iris = load_iris()
iris_limited = iris.data[:, [2, 3]] # This gets only petal length & width.
# I'm using the max depth as a way to avoid overfitting
# and simplify the tree since I'm using it for educational purposes
clf = DecisionTreeClassifier(criterion="gini",
max_depth=3,
random_state=42)
clf.fit(iris_limited, iris.target)
visualization_raw = export_graphviz(clf,
out_file=None,
special_characters=True,
feature_names=["length", "width"],
class_names=iris.target_names,
node_ids=True)
visualization_source = Source(visualization_raw)
visualization_png_bytes = visualization_source.pipe(format='png')
with open('my_file.png', 'wb') as f:
f.write(visualization_png_bytes)
当我检查我的树的可视化时,我发现了这个:
乍一看,这是一棵相当普通的树,但我发现它有些奇怪。节点 #6 总共有 46 个样本,其中只有一个是杂色的,因此该节点被标记为弗吉尼亚。这似乎是一个相当合理的停下来的地方。但是,由于某种我无法理解的原因,该算法决定进一步拆分为节点 #7 和 #8。但奇怪的是,仍然存在的 1 versicolor 仍然被错误分类,因为两个节点最终都具有Virginica 类。为什么要这样做?它是否只是盲目地只看基尼系数的下降,而不看它是否有任何影响——这对我来说似乎是一种奇怪的行为,而且我在任何地方都找不到它的记录。
是否可以禁用,或者这实际上是否正确?
【问题讨论】:
【参考方案1】:为什么要这样做?
因为它提供了有关样本类别的更多信息。您是对的,这种拆分不会改变任何预测的结果,但模型现在更加确定。考虑节点 #8 中的样本:在拆分之前,模型大约 98% 确信这些样本是弗吉尼亚州。但是,拆分后,模型说这些样本肯定是弗吉尼亚州。
是不是一味地只看基尼系数下降,而不看有没有影响
默认情况下,DecisionTree 会继续分裂,直到所有叶子节点都是纯的。有一些参数会影响分裂行为。但是,它没有明确考虑拆分节点是否会在预测标签方面产生影响。
是否可以禁用,或者这实际上是否正确?
如果拆分产生两个具有相同标签的叶节点,我认为没有办法强制 DecisionTreeClassifier 不拆分。但是通过仔细设置min_samples_leaf
和/或min_impurity_decrease
参数,您可以实现类似的效果。
【讨论】:
以上是关于为啥我的决策树会创建一个实际上并未划分样本的拆分?的主要内容,如果未能解决你的问题,请参考以下文章