python - 为什么我的决策树创建的拆分实际上并未划分样本?

标签 python python-3.x machine-learning scikit-learn decision-tree

这是我对著名的 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)

当我检查我的树的可视化时,我发现了这个:

Tree visualization result

乍一看这是一棵相当普通的树,但我注意到它有些奇怪。节点 #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/

相关文章:

python - PyTorch:用 GPU 训练比用 CPU 训练同样的东西会产生更严重的错误

python - 导入项目根以上的模块

python - PCA fit() 运行时警告(在 true_divide 中遇到无效值)

python - 链接回 Sphinx 中的源代码文件

sql-server - 使用 pyspark 对 SQL Server JDBC 使用 Windows 身份验证

python - 使用 Tensorflow 进行在线学习

machine-learning - 如何计算空白 token 预测的变压器损耗?

javascript - tensorflowjs 如何在 cnn 预测中获取内层输出

python - 在 PySide 中创建跑马灯效果

python - 统一python 2/3版本支持类型