版本矩阵

组件版本
scikit-learn1.8.0
python-graphviz0.21
系统 Graphviz最新版

1. 参数CRITERION

criterion 参数用于决定不纯度的计算方法,sklearn提供了两种选择:

  • 输入 entropy,使用信息熵(Entropy)
  • 输入 gini,使用基尼系数(Gini Impurity)

基尼系数与信息熵的区别

信息熵计算公式:H(X) = -Σp(x)log₂p(x)

  • 涉及对数运算,计算复杂度比基尼系数高
  • 对数据不纯度的惩罚更强

基尼系数计算公式:Gini = 1 - Σp(x)²

  • 更加简单直接,不需要对数运算
  • 计算速度更快

实际应用建议

  • 对于结构化数据(如表格数据),可以优先尝试基尼系数
  • 在计算资源受限的实时系统中,基尼系数是更好的选择
  • 当数据质量较高且维度适中时(如UCI数据集),可以比较两种指标的效果
  • 在集成学习中(如随机森林),两种指标的差异通常会被弱化

2. 初步建模代码

# 导入需要的算法库和模块
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split

# 加载数据
wine = load_wine()

# 数据拆分
Xtrain, Xtest, Ytrain, ytest = train_test_split(
    wine.data, wine.target, test_size=0.3, random_state=420
)

# 建立模型
clf = tree.DecisionTreeClassifier(criterion="gini")
clf = clf.fit(Xtrain, Ytrain)
clf.score(Xtest, ytest)

3. 画决策树(Graphviz可视化)

import graphviz
from sklearn import tree

feature_name = ['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮',
                '非黄烷类酚类','花青素','颜色强度','色调',
                'od280/od315 稀释葡萄酒','脯氨酸']

dot_data = tree.export_graphviz(
    clf,
    out_file=None,
    feature_names=feature_name,
    class_names=["琴酒","雪莉","贝尔摩德"],
    filled=True,
    rounded=True
)
graph = graphviz.Source(dot_data)
graph

export_graphviz 参数说明

参数说明
feature_names每个属性的名字
class_names每个因变量类别的名字
label是否显示不纯度信息,默认为 all
filled是否给每个节点的主分类绘制不同的颜色
out_file输出的 dot 文件的名字
rounded默认为 True,表示对每个节点的边框加圆角

4. 防止过拟合

过拟合的原因

在不加限制的情况下,决策树会持续生长直到:

  1. 所有叶节点的基尼系数或信息熵达到最优(通常为0)
  2. 没有更多的特征可用于进一步分割数据
  3. 每个叶节点仅包含单一类别的样本

具体表现

  • 训练集上可能达到100%的准确率
  • 测试集上表现显著下降

根本原因

  1. 样本偏差问题:训练数据不能完全代表整体数据分布
  2. 噪声敏感问题:决策树会捕捉训练数据中的随机噪声

解决方法

  1. 预剪枝(Pre-pruning)

    • 设置最大深度(max_depth)
    • 设置叶节点最小样本数(min_samples_leaf)
  2. 后剪枝(Post-pruning)

    • 使用代价复杂度剪枝(CCP)
    • 基于验证集性能进行剪枝
  3. 集成方法

    • 随机森林
    • 梯度提升树

5. random_state

  • 用来设置分支中的随机模型的参数
  • 默认是 None,在高维度时随机性会表现更明显
  • 输入任意整数,会一直长出同一棵树,让模型稳定下来

6. splitter

  • 输入 best:决策树在分支时优先选择更重要的特征进行分支
  • 输入 random:决策树在分支时会更加随机,树会因为含有更多的不必要的信息而更深更大

7. 常见问题排查

症状根因定位修复
ModuleNotFoundError: No module named ‘graphviz’未安装 python-graphviz 包pip install graphviz
ExecutableNotFoundError只装python包,未装系统Graphviz安装系统Graphviz并配置PATH
ValueError: Length of feature_namesfeature_names数量与X特征列不一致统一特征数
训练集1.0、测试集明显下降树无约束生长导致过拟合加max_depth/min_samples_leaf等参数