用 Python 实现 Gini 决策树分类与可视化-机器学习

用 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 核心程序;或核心程序路径未配置到环境变量。

  • 解决方案

    1. 按 "前置条件" 步骤重新安装 Graphviz 核心程序;
    1. 验证dot -version是否能正常输出;
    1. 若环境变量未生效,重启终端 / IDE,或在代码中手动配置路径(如代码中第 2 步)。

问题 3:图片不生成(无报错但找不到 PNG 文件)

  • 原因:代码中output_img_path路径不存在;或权限不足。

  • 解决方案

    1. 确保代码保存路径无中文(如避免E:\我的代码);
    1. 手动指定绝对路径,如output_img_path = r'E:\ML_Code\decision_tree_gini.png';
    1. 检查文件夹是否有写入权限(如 Windows 下避免 C 盘系统目录)。

五、总结

本文通过 "环境准备→数据生成→模型训练→可视化" 的完整流程,实现了基于 Gini 指标的决策树分类与可视化。核心要点如下:

  1. Graphviz 需双重安装:必须同时安装 "核心程序" 和 Python 的graphviz库;

  2. 数据生成符合题目要求:X 为 100×4 随机矩阵,Y 为二分类标签(含大于 2 的样本);

  3. 决策树参数可控:通过criterion='gini'和max_depth=3实现题目要求;

  4. 结果可验证:通过打印数据信息和图片路径,确保每一步可追溯。

通过此实践,不仅能掌握决策树的基本用法,还能理解 Gini 指标的作用和可视化的价值,为后续机器学习模型学习打下基础。

相关推荐
程序员大雄学编程3 小时前
「机器学习笔记11」深入浅出:解密基于实例的学习(KNN算法核心原理与实践)
人工智能·笔记·机器学习
小黄人软件3 小时前
用AI写的【实时文件搜索引擎】python源码【找资源】
开发语言·python·搜索引擎
原小明4 小时前
【Conda】Conda虚拟环境配置系统环境变量,Jupter可使用
vscode·python·jupyter·conda
B站计算机毕业设计之家4 小时前
深度学习实战:Python水果识别 CNN算法 卷积神经网络(TensorFlow训练+Django网页源码)✅
python·深度学习·神经网络·cnn·tensorflow·水果识别·识别系统
Python极客之家4 小时前
基于数据挖掘的银行贷款审批预测系统
人工智能·python·机器学习·数据挖掘·毕业设计
zhz52144 小时前
ArcGIS Pro 进程管理:自动化解决方案与最佳实践
运维·python·arcgis·自动化
递归不收敛4 小时前
吴恩达机器学习课程(PyTorch适配)学习笔记:1.2 优化算法实践
pytorch·学习·机器学习
kida_yuan4 小时前
【从零开始】16. 基于 CPU 的转换、量化实现
python·llm
fly五行4 小时前
大模型基础入门与 RAG 实战:从理论到 llama-index 项目搭建(有具体代码示例)
python·ai·llama·llamaindex