用 Python 实现 Gini 决策树分类与可视化
引言
通过构建决策树(采用Gini指标)对随机生成(通过np.random.randint方法)的数字进行分类,自变量X为100x4的矩阵,随机生成的数字大于10,因变量Y为大于2的100x1矩阵。树的最大深度限制为3层,训练完成之后将树可视化显示。
整体流程:
(1)生成数据:创建随机特征矩阵 X 和随机二进制分类标签 Y。
(2)训练模型:使用生成的特征和标签数据训练一个深度为 3 的决策树分类器。
(3)可视化模型:通过 Graphviz 将训练好的决策树模型导出并渲染为 PNG 图像,最终展示决策树的结构。
决策树是机器学习中经典的分类模型,以直观的树状结构易于理解,而 Gini 系数(基尼不纯度)是常用的决策树分裂指标。本文将带大家从 0 到 1 实现:随机生成数据集→用 Gini 指标训练决策树→通过 Graphviz 可视化决策树,全程附详细代码、安装命令与问题解决方案,适合机器学习初学者入门实践。
一、前置条件:环境准备
在开始前,需确保环境满足以下条件,核心是Python 基础环境 + 必备库 + Graphviz 工具(重点避坑:Graphviz 需 "核心程序 + Python 接口" 双重安装)。
1.1 基础环境:Python
首先确保已安装 Python(推荐 3.8~3.12 版本,兼容性最佳),可通过官网下载:Python 官网。
验证 Python 是否安装成功:打开终端 / 命令提示符,输入以下命令,能显示版本号即正常:
python --version # Windows
# 或
python3 --version # Mac/Linux
1.2 必备 Python 库安装
需安装 3 个核心库:numpy(生成随机数据)、scikit-learn(训练决策树)、graphviz(Python 接口,调用可视化工具)。
打开终端 / 命令提示符,执行以下pip 安装命令:
# 一次性安装所有必备库
pip install numpy scikit-learn graphviz
-
numpy:用于生成 100×4 的随机特征矩阵 X 和分类标签 Y;
-
scikit-learn:提供决策树分类器(DecisionTreeClassifier)和可视化导出工具;
-
graphviz:Python 与 Graphviz 核心程序的交互接口(仅装此库不够,需配合核心程序)。
1.3 Graphviz 核心程序安装(关键!)
graphviz库仅为 Python 接口,真正实现 "树转图片" 的是Graphviz 核心程序(含dot.exe等工具),必须单独安装,否则会报 "找不到 dot 文件" 错误。
分系统安装指南:
操作系统 | 安装方式 | 关键步骤 |
---|---|---|
Windows | 官网下载 | 1. 下载地址:Graphviz 官网,选择 "Windows 64-bit msi" 安装包;2. 安装时务必勾选 "Add Graphviz to the system PATH for all users"(自动配置环境变量);3. 若未勾选,需手动记录安装路径(如D:\Development_tools\Graphviz\bin),后续在代码中配置。 |
Mac | Homebrew | 打开终端,执行命令:brew install graphviz(需先安装 Homebrew,官网:brew.sh) |
Linux | 包管理器 | 打开终端,执行命令:sudo apt-get install graphviz(Ubuntu/Debian)或sudo yum install graphviz(CentOS) |
验证核心程序是否安装成功:
安装后关闭所有终端 / IDE,重新打开一个新终端,执行以下命令:
dot -version
若输出类似dot - graphviz version 10.0.1 (20231223.1711)的信息,说明核心程序与环境变量配置成功。
二、完整实现步骤:从数据生成到可视化
2.1 代码文件命名建议
为便于管理,建议将代码保存为decision_tree_gini_visual.py(直观体现 "决策树 + Gini + 可视化" 核心功能),保存路径建议无中文(如E:\ML_Code[decision_tree_gini_visual.py](http://decision_tree_gini_visual.py)),避免路径解析错误。
2.2 完整代码(带详细注释)
pyhton
# 1. 导入必备库
import numpy as np # 生成随机数据
from sklearn.tree import DecisionTreeClassifier, export_graphviz # 决策树模型与导出
import graphviz # 可视化接口
import os # 路径与文件验证
# 2. 配置Graphviz路径(关键!替换为你的Graphviz的bin目录路径)
# 若安装时已勾选添加PATH,此步骤可省略;若未勾选,需手动填写路径(加r避免转义错误)
graphviz_bin_path = r'D:\Development_tools\Graphviz\bin' # 示例路径,需替换为自己的
os.environ["PATH"] += os.pathsep + graphviz_bin_path
print(f"✅ 已添加Graphviz路径:{graphviz_bin_path}")
# 3. 生成随机数据集(符合题目要求)
np.random.seed(42) # 设置随机种子,确保结果可复现
# 自变量X:100×4矩阵,随机整数(范围0-19,确保有大于10的值)
X = np.random.randint(low=0, high=20, size=(100, 4))
# 因变量Y:100×1二分类标签(随机整数0-4,大于2则为1,否则为0,确保Y>2的样本存在)
Y = (np.random.randint(low=0, high=5, size=(100, 1)) > 2).astype(int).flatten()
# 打印数据信息,验证生成结果
print(f"✅ 数据集生成完成:")
print(f" - 自变量X形状:{X.shape}(100个样本,4个特征)")
print(f" - 因变量Y形状:{Y.shape}(100个标签)")
print(f" - Y=1的样本数:{sum(Y==1)}(Y>2的样本),Y=0的样本数:{sum(Y==0)}")
# 4. 训练Gini决策树(最大深度3)
# criterion='gini':使用Gini指标作为分裂标准
# max_depth=3:限制树的最大深度为3层
dt_model = DecisionTreeClassifier(criterion='gini', max_depth=3, random_state=42)
dt_model.fit(X, Y) # 用生成的X和Y训练模型
print(f"✅ 决策树训练完成(Gini指标,最大深度3)")
# 5. 决策树可视化与结果保存(输出PNG图片)
# 导出决策树为dot格式数据(用于Graphviz渲染)
dot_data = export_graphviz(
dt_model,
out_file=None, # 不保存为文件,直接传入内存
feature_names=[f'特征{i+1}' for i in range(4)], # 特征名称(便于理解)
class_names=['类别0', '类别1'], # 分类标签名称(对应Y=0和Y=1)
filled=True, # 节点填充颜色(颜色深浅表示类别占比)
rounded=True, # 节点边框圆角
special_characters=True # 支持特殊字符(如中文)
)
# 用Graphviz渲染dot数据,生成PNG图片
graph = graphviz.Source(dot_data)
# 保存图片到当前代码所在目录,格式为PNG
output_img_path = "decision_tree_gini.png" # 图片文件名
graph.render(
filename=output_img_path.replace(".png", ""), # 去掉扩展名,避免重复
format='png', # 强制输出PNG格式
cleanup=True # 清理中间生成的dot文件,仅保留PNG
)
# 验证图片是否生成成功
if os.path.exists(output_img_path):
# 获取图片绝对路径,方便用户查找
img_abs_path = os.path.abspath(output_img_path)
print(f"✅ 决策树PNG图片生成成功!")
print(f" - 图片保存路径:{img_abs_path}")
# 尝试自动打开图片(需系统支持)
try:
graph.view(output_img_path.replace(".png", ""))
print(f"✅ 正在自动打开图片...")
except Exception as e:
print(f"ℹ️ 自动打开图片失败,可手动打开:{img_abs_path}")
else:
print(f"❌ 图片生成失败,请检查Graphviz路径配置!")
三、运行结果验证
3.1 预期输出信息
运行代码后,终端会打印以下信息(说明每一步均成功):
python
✅ 已添加Graphviz路径:D:\Development_tools\Graphviz\bin
✅ 数据集生成完成:
- 自变量X形状:(100, 4)(100个样本,4个特征)
- 因变量Y形状:(100,)(100个标签)
- Y=1的样本数:48(Y>2的样本),Y=0的样本数:52
✅ 决策树训练完成(Gini指标,最大深度3)
✅ 决策树PNG图片生成成功!
- 图片保存路径:E:\ML_Code\decision_tree_gini.png
✅ 正在自动打开图片...

3.2 决策树图片解读
生成的 PNG 图片会展示 3 层决策树结构,每个节点包含以下关键信息:
-
分裂条件:如 "特征 3 ≤ 9.5"(表示用第 3 个特征的 9.5 作为分裂阈值);
-
Gini 系数:如 "gini = 0.498"(值越小,节点纯度越高);
-
样本数量:如 "samples = 100"(该节点包含的样本数);
-
类别分布:如 "value = [52, 48]"(对应 Y=0 的 52 个样本,Y=1 的 48 个样本);
-
预测类别:节点填充颜色对应 "类别 0" 或 "类别 1"(颜色越深,该类别占比越高)。
四、常见问题与解决方案
问题 1:路径转义错误(SyntaxWarning: invalid escape sequence '\D')
-
原因:Python 中\是转义字符,直接写'D:\Graphviz\bin'会解析错误。
-
解决方案:路径字符串前加r(原始字符串),如r'D:\Graphviz\bin'。
问题 2:Graphviz 未找到(ExecutableNotFound: failed to execute WindowsPath('dot'))
-
原因:仅安装了 Python 的graphviz库,未安装 Graphviz 核心程序;或核心程序路径未配置到环境变量。
-
解决方案:
-
- 按 "前置条件" 步骤重新安装 Graphviz 核心程序;
-
- 验证dot -version是否能正常输出;
-
- 若环境变量未生效,重启终端 / IDE,或在代码中手动配置路径(如代码中第 2 步)。
问题 3:图片不生成(无报错但找不到 PNG 文件)
-
原因:代码中output_img_path路径不存在;或权限不足。
-
解决方案:
-
- 确保代码保存路径无中文(如避免E:\我的代码);
-
- 手动指定绝对路径,如output_img_path = r'E:\ML_Code\decision_tree_gini.png';
-
- 检查文件夹是否有写入权限(如 Windows 下避免 C 盘系统目录)。
五、总结
本文通过 "环境准备→数据生成→模型训练→可视化" 的完整流程,实现了基于 Gini 指标的决策树分类与可视化。核心要点如下:
-
Graphviz 需双重安装:必须同时安装 "核心程序" 和 Python 的graphviz库;
-
数据生成符合题目要求:X 为 100×4 随机矩阵,Y 为二分类标签(含大于 2 的样本);
-
决策树参数可控:通过criterion='gini'和max_depth=3实现题目要求;
-
结果可验证:通过打印数据信息和图片路径,确保每一步可追溯。
通过此实践,不仅能掌握决策树的基本用法,还能理解 Gini 指标的作用和可视化的价值,为后续机器学习模型学习打下基础。