版本矩阵
| 组件 | 版本 |
|---|---|
| scikit-learn | 1.8.0 |
| python-graphviz | 0.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. 防止过拟合
过拟合的原因
在不加限制的情况下,决策树会持续生长直到:
- 所有叶节点的基尼系数或信息熵达到最优(通常为0)
- 没有更多的特征可用于进一步分割数据
- 每个叶节点仅包含单一类别的样本
具体表现:
- 训练集上可能达到100%的准确率
- 测试集上表现显著下降
根本原因:
- 样本偏差问题:训练数据不能完全代表整体数据分布
- 噪声敏感问题:决策树会捕捉训练数据中的随机噪声
解决方法
-
预剪枝(Pre-pruning):
- 设置最大深度(max_depth)
- 设置叶节点最小样本数(min_samples_leaf)
-
后剪枝(Post-pruning):
- 使用代价复杂度剪枝(CCP)
- 基于验证集性能进行剪枝
-
集成方法:
- 随机森林
- 梯度提升树
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_names | feature_names数量与X特征列不一致 | 统一特征数 |
| 训练集1.0、测试集明显下降 | 树无约束生长导致过拟合 | 加max_depth/min_samples_leaf等参数 |