这是我对著名的 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 个样本,其中只有一个是杂色的,因此该节点被标记为 virginica。这似乎是一个相当合理的停下来的地方。但是,出于某种我无法理解的原因,该算法决定进一步拆分为节点 #7 和 #8。但奇怪的是,仍然在那里的 1 versicolor 仍然被错误分类,因为无论如何这两个节点最终都具有 virginica 类。为什么要这样做?它是否盲目地只关注基尼系数的下降而不考虑它是否会产生任何影响 - 这对我来说似乎是奇怪的行为,而且我在任何地方都找不到它的记录。
是否可以禁用,或者这实际上是正确的吗?
最佳答案
为什么要这样做?
因为它提供了有关样本类别的更多信息。你是对的,这种 split 不会改变任何预测的结果,但模型现在更加确定。考虑节点 #8 中的样本:在拆分之前,该模型大约有 98% 的置信度认为这些样本是 virginica。然而,拆分后,模型说这些样本肯定是弗吉尼亚。
是不是一味的只看基尼下降,不看有没有影响
默认情况下,决策树会继续 split ,直到所有叶节点都是纯节点。有一些参数会影响 split 行为。然而,它没有明确考虑拆分节点是否会对预测标签产生影响。
是否可以禁用,或者这实际上是正确的吗?
如果拆分产生两个具有相同标签的叶节点,我认为没有办法强制 DecisionTreeClassifier 不拆分。但是,通过仔细设置 min_samples_leaf
和/或 min_impurity_decrease
参数,您可以实现类似的效果。
关于python - 为什么我的决策树创建的拆分实际上并未划分样本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50077562/