从原理到实践:手把手教你用Python绘制CART决策树

1次阅读
没有评论

共计 1901 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

一、CART 决策树的核心原理

决策树是机器学习中最直观的算法之一,而 CART(Classification and Regression Trees)作为其经典实现,通过简单的二叉树结构完成数据划分。它的核心思想可以用两个关键概念概括:

从原理到实践:手把手教你用 Python 绘制 CART 决策树

  1. 基尼系数(Gini Index):衡量数据不纯度的指标。公式为 (Gini = 1 – \sum(p_i^2)),其中 (p_i) 是某类别在节点中的比例。值越小说明纯度越高,理想情况下纯净节点的基尼系数为 0。

  2. 二分法(Binary Split):对每个特征的所有可能划分点计算基尼系数下降值,选择使不纯度减少最多的特征和阈值作为分裂条件。例如:

    根节点
    ├── [特征 A ≤ 0.5] → 左子树
    └── [特征 A > 0.5] → 右子树

二、为什么我们需要可视化决策树?

实际项目中,决策树的解释性优势常被以下问题削弱:

  • 高维特征灾难:当特征超过 10 个时,传统文本打印会变成难以阅读的 ” 面条代码 ”
  • 分类 / 回归差异:分类树显示类别分布,回归树显示均值预测,初学者容易混淆输出形式
  • 参数敏感陷阱 :max_depth 等参数设置不当会导致树结构过于复杂或欠拟合

三、Python 实现全流程

1. 环境准备

# 安装必要库(命令行执行)pip install scikit-learn graphviz

2. 完整代码示例(以鸢尾花数据集为例)

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier, export_graphviz
import graphviz

# 数据加载
iris = load_iris()
X, y = iris.data, iris.target
feature_names = iris.feature_names  # 获取特征中文名

# 模型训练(关键参数说明)clf = DecisionTreeClassifier(
    criterion="gini",    # 使用基尼系数
    max_depth=3,         # 控制树深度
    min_samples_split=10 # 节点最小样本数
)
clf.fit(X, y)

# 生成可视化文件
dot_data = export_graphviz(
    clf,
    out_file=None,
    feature_names=feature_names,
    class_names=iris.target_names,
    filled=True,
    rounded=True
)
graph = graphviz.Source(dot_data)
graph.render("iris_tree")  # 保存为 PDF

3. 代码关键点解析

  • export_graphviz的 filled 参数用颜色深浅表示节点纯度
  • class_names传入类别标签可提升可读性
  • 生成的 PDF 文件包含完整分裂逻辑:
    [花瓣长度 ≤ 2.45]
    ├── [基尼 =0.0] → 山鸢尾
    └── [花瓣宽度 ≤ 1.75]
        ├── [基尼 =0.168] → 变色鸢尾
        └── [基尼 =0.043] → 维吉尼亚鸢尾

四、三大常见踩坑与解决

  1. Graphviz 报错:找不到可执行文件
  2. 解决方案:从官网下载安装后,需将 bin 目录加入系统 PATH
  3. 验证方法:命令行执行 dot -V 应显示版本号

  4. 特征名称显示为 X[0]等数字

  5. 错误原因:未传入 feature_names 参数
  6. 正确做法:如示例代码显式传入特征名列表

  7. 图片显示乱码

  8. 问题根源:系统缺少中文字体
  9. 快速修复:在 export_graphviz 中添加参数:
    export_graphviz(..., fontname="Microsoft YaHei")

五、进阶可视化工具

对于更复杂场景,推荐尝试 dtreeviz 库:

from dtreeviz.trees import dtreeviz
viz = dtreeviz(
    clf, X, y,
    target_name="iris_type",
    feature_names=feature_names,
    class_names=list(iris.target_names)
)
viz.view()  # 生成交互式可视化

其优势包括:
– 动态显示样本分布直方图
– 鼠标悬停查看详细数据
– 支持 Jupyter Notebook 内联显示

延伸学习资源

  1. sklearn 决策树官方文档
  2. 经典论文:Breiman L.《Classification and Regression Trees》
  3. 可视化工具库:https://github.com/parrt/dtreeviz

通过本文的实践,你会发现决策树的可视化不仅是调试模型的工具,更是向业务方解释 AI 决策过程的桥梁。建议尝试调整 max_depth 等参数,观察树结构变化对模型效果的影响,这种直观感受是学习算法的最佳途径。

正文完
 0
评论(没有评论)