共计 2107 个字符,预计需要花费 6 分钟才能阅读完成。
一、CART 决策树原理简介
决策树是一种经典的机器学习算法,而 CART(Classification and Regression Trees)是其中最常见的一种类型。它通过递归地将数据集划分成更小的子集来构建树结构,每个内部节点代表一个特征判断,每个分支代表判断结果,而每个叶节点代表最终的预测结果。

CART 决策树的核心是基尼系数(Gini Index)和二分法:
- 基尼系数:衡量数据集的不纯度,值越小表示数据越纯。计算公式为:Gini = 1 – Σ(p_i)^2,其中 p_i 是第 i 类样本的比例。
- 二分法:CART 每次只做二元分裂,即对于每个特征,选择最优的分割点将数据分成两部分。
二、决策树可视化的痛点
在实际应用中,决策树可视化常遇到以下问题:
- 特征维度高时显示混乱:当特征数量很多时,树的结构会变得非常复杂,难以阅读。
- 分类树与回归树的差异:分类树显示的是类别分布,而回归树显示的是均值,两者可视化方式不同。
- 节点信息不完整:默认可视化可能缺少关键信息,如样本数量、基尼系数等。
三、技术实现:用 sklearn 训练并可视化决策树
1. 数据预处理
我们使用经典的 iris 数据集作为示例:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# 加载数据
iris = load_iris()
X = iris.data
y = iris.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
2. 模型训练与参数调优
from sklearn.tree import DecisionTreeClassifier
# 创建决策树分类器
dtree = DecisionTreeClassifier(criterion='gini', max_depth=3, random_state=42)
# 训练模型
dtree.fit(X_train, y_train)
# 评估模型
print("训练集准确率:", dtree.score(X_train, y_train))
print("测试集准确率:", dtree.score(X_test, y_test))
重要参数说明:
criterion: 分裂标准,’gini’ 表示使用基尼系数max_depth: 树的最大深度,控制模型复杂度random_state: 随机种子,保证结果可复现
3. 可视化输出
首先安装 Graphviz 工具,然后使用以下代码生成可视化:
from sklearn.tree import export_graphviz
import graphviz
# 导出 dot 文件
dot_data = export_graphviz(dtree,
out_file=None,
feature_names=iris.feature_names,
class_names=iris.target_names,
filled=True,
rounded=True,
special_characters=True)
# 渲染并显示
graph = graphviz.Source(dot_data)
graph.render("iris_tree") # 保存为 PDF
graph # 在 Jupyter 中显示
生成的决策树结构示例:
根节点
├── [特征 A ≤ 0.5] -> 左子树
│ ├── [特征 B ≤ 1.2] -> 叶节点 1
│ └── [特征 B > 1.2] -> 叶节点 2
└── [特征 A > 0.5] -> 右子树
├── [特征 C ≤ 2.1] -> 叶节点 3
└── [特征 C > 2.1] -> 叶节点 4
四、避坑指南
- Graphviz 环境变量配置错误
- 问题:执行时报错 ”Graphviz executables not found”
-
解决:下载安装 Graphviz,并将其 bin 目录添加到系统 PATH
-
特征名称未传入
- 问题:可视化时特征显示为 X[0], X[1]等不直观的名称
-
解决:确保传入
feature_names参数 -
中文显示乱码
- 问题:节点中的中文显示为乱码
- 解决:在 export_graphviz 中添加
fontname="SimHei"参数
五、进阶可视化建议
对于更高级的可视化需求,可以使用 dtreeviz 库:
from dtreeviz.trees import dtreeviz
viz = dtreeviz(dtree,
X_train,
y_train,
target_name="class",
feature_names=iris.feature_names,
class_names=iris.target_names)
viz.view()
dtreeviz 提供了更丰富的可视化效果,包括:
– 每个节点的样本分布直方图
– 特征重要性可视化
– 交互式探索功能
六、延伸阅读
- sklearn 决策树官方文档
- Graphviz 官网
- dtreeviz GitHub 仓库
- 《统计学习方法》- 李航(决策树章节)
通过本文的学习,你应该已经掌握了 CART 决策树的原理和 Python 实现方法。决策树可视化是理解模型行为的重要手段,希望这些技巧能帮助你更好地分析和优化模型。
正文完
