当前位置: 首页 > news >正文

决策树算法详解:从 ID3、C4.5 到 CART 以及 sklearn 参数调优

一、什么是决策树?

决策树通过对训练样本的学习,并建立分类规则,然后依据分类规则,对新样本数据进行分类预测,属于有效监督学习。

核心:所以数据从根节点一步一步落到叶子节点。

决策树的结构非常类似生活中的判断过程:

例如:

天气怎么样?

├── 晴天 → 湿度高吗?

│ ├── 是 → 不打球

│ └── 否 → 打球

└── 阴天 → 打球

其中:

  • 根节点:第一个节点
  • 非叶子节点:中间节点
  • 叶子节点:最终结果节点

决策树的核心问题是:

如何选择最优特征进行数据划分?

不同算法采用了不同的方法:

  • ID3:使用信息增益
  • C4.5:使用信息增益率
  • CART:使用基尼指数(Gini Index)

二、ID3 算法:基于信息增益选择特征

1. 信息熵(Entropy)

ID3 算法的核心思想是:

选择能够最大程度降低数据不确定性的特征作为划分依据。

衡量数据混乱程度的指标就是信息熵。

公式:

\[ H(D) = -\sum p_i \log_2(p_i) \]

其中:

  • \( p_i \):某一类别出现的概率
  • 熵越小,数据越纯净
  • 熵越大,数据越混乱

在决策树中,希望划分之后的数据熵越来越小。

文件中的案例使用"是否外出打球"作为分类任务:

14 天数据中:

  • 打球:9 天
  • 不打球:5 天

因此类别熵为:

\[ H(D) = 0.940 \]


2. 信息增益(Information Gain)

信息增益表示:

一个特征能够减少多少信息的不确定性。

公式:

\[ \text{Gain}(D, A) = H(D) - H(D|A) \]

如果某个特征带来的信息增益最大,则说明该特征最具有分类能力,会优先作为决策树节点。


3. ID3 案例计算

假设数据包含:

特征分类
天气晴天、阴天、雨天
温度热、温和、凉爽
湿度高、正常
有风、无风

分别计算不同特征的信息增益。

(1)天气特征

天气划分后:

  • 晴天:5 天
  • 阴天:4 天
  • 雨天:5 天

计算得到:

\[ H(D|\text{天气}) = 0.693 \]

因此:

\[ \text{Gain}(\text{天气}) = 0.940 - 0.693 = 0.247 \]

(2)温度特征

计算得到:

\[ \text{Gain}(\text{温度}) = 0.940 - 0.911 = 0.029 \]

(3)湿度特征

计算得到:

\[ \text{Gain}(\text{湿度}) = 0.151 \]

(4)风特征

计算得到:

\[ \text{Gain}(\text{风}) = 0.048 \]

最终结果:

特征信息增益
天气0.247
湿度0.151
0.048
温度0.029

因此:

\[ \text{天气} > \text{湿度} > \text{风} > \text{温度} \]

天气成为根节点。


三、C4.5 算法:解决 ID3 容易偏向取值多特征的问题

1. 为什么需要 C4.5?

ID3 算法存在一个问题:

如果某个特征拥有大量不同取值,例如:

  • 编号
  • 用户 ID
  • 商品编号

虽然信息增益很高,但实际没有分类意义。

因此 C4.5 提出:

使用信息增益率代替信息增益。


2. 信息增益率

计算过程:

  1. 计算类别熵
  2. 计算每个属性的信息熵
  3. 计算信息增益:\[ \text{Gain} = H(D) - H(D|A) \]
  4. 计算信息增益率:\[ \text{GainRatio} = \frac{\text{Gain}}{H(A)} \]

选择信息增益率最大的特征。


3. C4.5 案例计算

计算结果:

特征信息增益率
天气0.1566
湿度0.151
0.049
温度0.0186

排序:

\[ \text{天气} > \text{湿度} > \text{风} > \text{温度} \]

因此依旧选择天气作为首个划分节点。


四、CART 算法:基于基尼指数

CART(Classification And Regression Tree)是目前应用非常广泛的一种决策树算法。

它与 ID3、C4.5 最大的区别:

  • ID3:信息增益
  • C4.5:信息增益率
  • CART:基尼指数

CART 选择:

使划分后的数据基尼指数最小的特征。


1. 基尼指数(Gini Index)

公式:

\[ \text{Gini}(D) = 1 - \sum p_i^2 \]

含义:

  • Gini 越小,数据越纯
  • 最好的划分方式就是让划分后的 Gini 指数最低

例如贷款预测案例:

根据年龄特征:

  • 青年
  • 中年
  • 老年

分别计算不同年龄节点的基尼指数。


五、决策树剪枝:解决过拟合问题

1. 为什么需要剪枝?

在决策树学习过程中,模型会不断地对数据进行划分。

如果不限制树的生长:

例如:

有 1000 条训练数据,构建出来的决策树可能生成 1000 条不同的路径。

也就是说:

  • 每一个样本都有自己对应的一条判断路线
  • 树会完全记住训练数据
  • 对训练数据预测效果很好
  • 但是面对新的未知数据时,可能无法正确判断

这种现象称为:

过拟合(Overfitting)

即:

模型过度学习训练数据中的细节和噪声,导致泛化能力下降。

因此,需要通过剪枝(Pruning)降低模型复杂度,提高模型对新数据的预测能力。


2. 决策树如何剪枝?

决策树剪枝主要分为两种:

(1)预剪枝(Pre-Pruning)

预剪枝是在:

决策树生成过程中提前限制树的生长。

也就是说,在树还没有完全建立之前,根据一定条件停止继续划分。

例如:

  • 限制树的最大深度
  • 限制叶子节点数量
  • 限制叶子节点最少样本数量

优点:

  • 训练速度快
  • 可以减少模型复杂度
  • 防止过拟合

缺点:

  • 可能提前停止,导致模型没有充分学习数据规律

(2)后剪枝(Post-Pruning)

后剪枝是在:

决策树已经完全生成之后,再删除不必要的分支。

流程:

  1. 先构建完整决策树
  2. 分析每个节点的重要程度
  3. 删除贡献较小的节点
  4. 得到更加简单的决策树

优点:

  • 保留更多数据规律
  • 通常泛化能力更强

缺点:

  • 计算成本较高

3. 预剪枝策略

在实际机器学习中,预剪枝通常通过以下方式实现:

(1)限制树的深度

参数:

max_depth

表示:

决策树允许达到的最大层数。

例如:

如果设置:

max_depth = 3

表示树最多只有 3 层。

作用:

  • 防止树无限增长
  • 降低模型复杂度
  • 减少过拟合

在数据量较小的时候,可以不限制深度;

如果:

  • 样本数量多
  • 特征数量多

则可以尝试限制树深度。


(2)限制叶子节点数量

参数:

max_leaf_nodes

表示:

限制决策树最大的叶子节点数量。

例如:

设置:

max_leaf_nodes = 10

那么:

  • 当叶子节点达到 10 个
  • 模型不会继续产生新的分支

作用:

  • 控制树结构规模
  • 防止模型学习过多细节

(3)限制叶子节点样本数量

参数:

min_samples_leaf

表示:

叶子节点中最少需要包含多少个样本。

例如:

min_samples_leaf = 5

表示:

一个叶子节点至少需要 5 个样本。

如果某个节点样本过少:

  • 说明该节点可能只是在记忆训练数据
  • 容易造成过拟合

因此可以进行剪枝。


4. 基尼系数与剪枝

CART 算法使用:

基尼指数(Gini Index)

作为节点划分标准。

公式:

\[ \text{Gini}(D) = 1 - \sum p_i^2 \]

其中:

  • \( p_i \):类别比例

基尼指数越小:

说明数据越纯。

在剪枝过程中:

如果某个节点继续划分后:

  • 基尼指数下降不明显
  • 分类效果提升很小

那么这个节点可能没有必要继续展开。

因此:

基尼系数不仅用于选择划分节点,也可以辅助判断树结构是否合理。

CART 算法本身就是通过基尼指数最小化准则进行特征选择。


5. 剪枝前后的决策树变化

剪枝前:

根节点 | ---------------- | | 节点A 节点B / \ / \ C D E F /|\ /|\ ...大量分支...

特点:

  • 树结构复杂
  • 节点数量多
  • 容易过拟合

剪枝后:

根节点 | ---------------- | | 节点A 节点B | 结果

特点:

  • 删除无意义分支
  • 模型更加简单
  • 泛化能力提高

六、sklearn 中的决策树剪枝参数

在 sklearn 中:

from sklearn.tree import DecisionTreeClassifier model = DecisionTreeClassifier( criterion='gini', max_depth=5, min_samples_leaf=10, max_leaf_nodes=20 )

其中:

<

参数
http://www.jsqmd.com/news/1298192/

相关文章:

  • 2026年7月贵州一体化污水处理/贵州环保设备厂家推荐参考_贵州天地黔诚环保有限公司 - 行业平台推荐
  • COM3D2实时女仆编辑器:免费开源的游戏角色定制终极指南
  • WebRTC在线考试系统开发与优化实践
  • 智能体时代AI安全架构怎么重构?主智能体时代的安全范式变革
  • Simulink与强化学习设计器联合应用:从模型创建到智能体部署全流程
  • PHP协议过滤器:从数据流处理到安全攻防的深度解析
  • 从零实现一个分布式文件系统:HDFS的核心设计
  • 2026年7月东莞LED屏/LED屏工程公司哪家专业_广东沃安科技有限公司 - 品牌宣传支持者
  • 破局 AI 应用黑盒:LangSmith 全链路调试+评估实战,从入门到企业级项目落地
  • RAG系统构建指南:检索增强生成技术实践
  • 回溯算法精讲:从核心思想到N皇后、全排列实战应用
  • DX进化驱动器全形态套装DIY指南:从原理到实战
  • R的扩展包(Packages)是R语言功能扩展的核心
  • PID控制算法详解:从原理到嵌入式C语言实现与调参
  • 低成本低减排高效螺旋桨选型指南:三个必查硬指标 - 行业深度分析
  • 从LED驱动到FPGA状态机:硬件入门的跑马灯实战全解析
  • 安卓模拟器横评:MuMu、雷电、夜神三款主流怎么选?实测聊聊我的结论
  • 2026年7月武汉毛坯房整装设计施工/武汉旧房改造设计高端公司推荐_武汉市易禾空间装饰设计工程有限公司 - 行业平台推荐
  • STM32F429内部FLASH操作全解析:从原理到实战避坑指南
  • 当阳光遇见“充电宝”:光储一体化如何重塑每一个用电场景的底层逻辑?
  • 女子摔角技术解析:从动作衔接、安全配合到剧情节奏的竞技艺术
  • 语言模型与知识图谱融合的智能摘要技术解析
  • Linux 命令与系统调用实战:内核这家“外包公司“是怎么接单的
  • 乌鲁木齐市头屯河区防水补漏_2026新疆首府工业新区漏水维修避坑指南与五大正规团队推荐 - 雨婺虹房屋维修
  • $2删库,$5万赔偿:7起AI Agent摧毁生产环境事故全复盘
  • 2026年7月杜邦纸袋小批量定制/龙港防水杜邦纸袋公司推荐合集_龙港亚细亚包装有限公司 - 品牌宣传支持者
  • 智谱AI上市与大模型技术商业化分析
  • 2026最新自动视频总结选择建议|亲测好用工具整理推荐
  • 嵌入式入门:0.96寸OLED屏驱动原理、应用与优化实战
  • C#动态修改Windows默认打印机:从Win32 API调用到权限处理的完整指南