大数据-273 Spark MLib-决策树分类算法详解:ID3、C4.5、CART 与剪枝原理

TL;DR

  • 场景:需要构建可解释的分类模型,或进行特征分箱与规则提取
  • 结论:决策树通过信息增益、基尼系数等指标选择最优分裂属性,ID3/C4.5/CART 分别采用不同分裂准则,集成方法(随机森林、GBDT)可显著提升泛化能力
  • 产出:掌握决策树核心原理,理解熵、条件熵、信息增益率计算方法,能根据业务场景选择合适的决策树算法

版本矩阵

功能 状态 说明
ID3 算法(信息增益) ✅ 已验证 使用信息熵增益选择分裂属性,倾向于选择值较多的特征
C4.5 算法(信息增益率) ✅ 已验证 用信息增益除以特征熵,克服信息增益的偏向问题
CART 算法(基尼系数) ✅ 已验证 既可用于分类也可用于回归,二叉树结构
决策树剪枝 ✅ 已验证 预剪枝(提前停止)、后剪枝(先生成后修剪)
随机森林集成 ✅ 已验证 Bagging + 决策树,多棵树投票/平均提升泛化能力
GBDT 系列(XGBoost/LightGBM/CatBoost) ✅ 已验证 梯度提升框架,序列化构建提升模型性能

决策树简介

基本介绍

决策树是一种非线性有监督分类模型,程序设计中的条件分支结构就是 if-else 结构

决策树的特点: ● 是一种树形结构,本质上一颗由多个判断节点组成的树 ● 其中每个内部节点表示一个属性上的判断 ● 每个分支代表一个判断结果的输出 ● 最后每个叶节点比代表一种分类结果

下面是一个简单的例子:

核心思想

通过一系列"如果 ... 那么 ..."的分裂规则,把复杂的决策过程拆解成若干简单判断,最终落到叶节点给出预测或决策。

适用任务

分类(Classification)与 回归(Regression)皆可;也常用于特征工程(如自动分箱)与可解释性分析。

代表算法

ID3、C4.5、CART(最常用),以及衍生的集成方法:随机森林(Random Forest)、梯度提升树(GBDT / XGBoost / LightGBM / CatBoost)。

结构与术语

shell 复制代码
            root
          ┌─┴───────┐
     internal     internal
      node1         node2
    ┌──┴──┐          │
  leaf  leaf       leaf
  • 根节点 (root):包含完整样本集
  • 内部节点 (internal/decision node):依据某特征和阈值把样本划分成更"纯净"的子集
  • 叶节点 (leaf / terminal node):输出类别标签或数值预测结果
  • 路径 (path):从根到叶的一条决策链,相当于一个规则组合

分类原则

要按照前四列的信息,使用决策树预测车祸的发生,如何选择根节点呢?

按照天气

按照"天气"列作为根节点,使用决策树预测,如图:

按照温度

按照"温度"列作为根节点,使用决策树预测,如图:

按照湿度

按照风

简单总结

只有使用天气作为根节点时,决策树的高度相对低而且树的两边能将数据分类的更彻底(其他列作为根节点时,树两边分类不纯粹,都有天气)

分类原则总结: 决策树构建过程就是数据不断分裂的递归过程,每一次分裂,尽可能让类别一样的数据在树的一边,当树的叶子节点的数据都是一类的时候,则停止分类。这样分类的数据,每个节点两边的数据不同,将相同的数据分类到树的一侧,能将数据分类的更加纯粹,减少树的高度和训练决策树的迭代次数。

分类原理

熵的介绍

物理学上,熵 Entropy 是 "混乱"程度的量度,系统越有序,熵值越低,系统越混乱或者分散,熵值越高。1948年香农提出了信息熵的概念。

如何衡量纯粹和混乱(信息量的大小)指标,可以使用信息熵或者基尼系数。 熵的定义如下: ● 某个类别下信息量越多,熵越大 ● 信息量越少,熵越小 ● 假设"有工作"这列下只有"否"这个信息类别,那么"有工作"这列的信息熵为:H=-(1xlog1)=0

上图中,如果按照"有工作"、"年龄"、"信贷情况"、"有房子"列使用决策树来预测"类别"。如何选择决策树的根节点分类条件,就是找到某列作为分类条件时,使"类别"这列分类更彻底,也就是找到在某个列作为分类条件下时,"类别"信息熵相对于没有这个分类条件时信息熵降低最大(降低最大,就是熵越低,分类越彻底),这个条件就是分类节点的分类条件,这里要使用条件熵和信息增益。

条件熵

定义:在某个分类条件下某个类别的信息熵叫做条件熵,在知道Y的情况下,X的不确定性。

信息增益

定义:代表熵的变化程度,分类前的信息熵减去分类后的信息熵 在构建决策树时,选择信息增益大的属性作为分类节点的方法也叫ID3分类算法。

基尼系数

基尼系数也可以表示样本的混乱程度,公式如下: 其中,K代表当前列表有K个类别。 基尼系数越小代表信息越纯,类别越少,基尼系数越大,代表信息越混乱,类别越多。基尼增益的计算和信息增益相同,假设某列只有一类值,这列基尼系数为0。

信息增益率

在上图中,如果将"记录ID"也作为分类条件的话,由于"记录ID"对于"是否贷款"列的条件熵为0,可以得到"是否贷款"在"记录ID"这个分类条件下信息增益最大。如果选择"记录ID"作为分类条件,可以将样本完全分开,分类后的信息熵为0,分类结果完全正确,信息增益最大,这种方式我们得到了一颗庞大的树,这种分类方式是不合理的。 使用信息增益来筛选分类条件,更倾向于更混杂的属性,容易出现你过拟合的问题,可以使用信息增益率来解决这个问题。

例如在"记录ID"条件下,"是否贷款"的信息增益最大,信息熵H(记录ID)也比较大,两者相除就是在"记录ID"条件下的增益率,结果比较小,笑出了当某些属性比较混杂时,使用信息增益来选择分类条件的弊端。 使用信息增益率来构建决策树的算法也叫C4.5算法,一般对于信息增益来说,选择信息增益率选择分类条件比较合适。


错误速查卡

症状 根因 定位 修复
决策树过拟合,训练集准确率高但测试集低 树深度过大,节点过多,对训练数据过度拟合 观察验证集曲线,检查树的深度和叶节点数量 采用预剪枝(max_depth、min_samples_split)或后剪枝,降低模型复杂度
信息增益偏向选择取值多的特征 信息增益计算公式倾向于选择分支多的属性 分析特征取值数量与信息增益的关系 使用 C4.5 算法,采用信息增益率替代信息增益
CART 树二叉树结构导致树过深 二叉分裂每次只能将数据分成两部分,可能需要更多层才能达到同等纯度 检查树的深度和每个叶节点的样本量 结合随机森林或梯度提升方法提升效果
连续值特征处理困难 连续变量取值无限,无法直接用于分裂 检查连续特征的分裂点计算 对连续特征进行离散化(分箱),或使用 C4.5/CART 的连续值处理机制
决策树对数据噪声敏感 单个样本的异常值可能影响分裂点的选择 检查数据质量,观察异常样本的影响 在集成学习方法中使用多棵树降低噪声影响(随机森林)
相关推荐
听风者就是我1 小时前
Harness Engineering:AI Agent 时代的工程化实践
后端
财经资讯数据_灵砚智能1 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(日间)2026年4月20日
大数据·人工智能·python·信息可视化·自然语言处理
用户0510122572961 小时前
FFmpeg常用命令行命令
后端
用户962377954481 小时前
原理分析 | Agent —— Tomcat 内存马
后端
Jutick2 小时前
Spring Boot WebSocket 实时行情推送实战:从断线重连到并发优化
后端·架构
Leo8992 小时前
数据结构与算法
后端
Betelgeuse762 小时前
打通 Django 认证:原生 Auth 组件实战与 API 改造
后端·python·django
ltl2 小时前
一致性哈希:不要相信教科书版本
后端
亦暖筑序2 小时前
让 AI 客服真能用的 3 个模块:情绪感知 + 意图识别 + Agent 工具链
java·人工智能·后端