C4.5决策树算法实战:从原理到例题解析

1次阅读
没有评论

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

image.webp

背景介绍

决策树是机器学习中最基础也最直观的算法之一,它通过树形结构对数据进行分类或回归。C4.5 算法是决策树家族中的重要成员,由 Ross Quinlan 在 1993 年提出。相比于 ID3 算法,C4.5 引入了信息增益比(Gain Ratio)来解决 ID3 偏向选择取值较多特征的问题,同时还支持连续属性和缺失值处理,实用性更强。

C4.5 决策树算法实战:从原理到例题解析

算法原理

信息增益比

C4.5 算法的核心改进是使用信息增益比替代信息增益来选择分裂属性。信息增益比的计算分为两步:

  1. 计算信息增益(Information Gain)
  2. 计算分裂信息(Split Information)
  3. 信息增益比 = 信息增益 / 分裂信息

其中,分裂信息用于惩罚取值较多的属性,公式为:

SplitInfo(S,A) = -∑(|Sv|/|S|)*log2(|Sv|/|S|)

与 ID3 的区别

  • ID3 使用信息增益,容易偏向取值多的属性
  • C4.5 使用信息增益比,更平衡
  • C4.5 支持连续属性(通过二分法处理)
  • C4.5 支持缺失值处理
  • C4.5 引入了剪枝策略防止过拟合

例题解析

示例数据集

我们用一个简单的天气数据集来演示 C4.5 的构建过程:

编号 天气 温度 湿度 风速 是否打球
1 晴 高 高 弱 否
2 晴 高 高 强 否
3 阴 高 高 弱 是
4 雨 中 高 弱 是
5 雨 低 中 弱 是
6 雨 低 中 强 否
7 阴 低 中 强 是
8 晴 中 高 弱 否
9 晴 低 中 弱 是
10 雨 中 中 弱 是

计算信息增益比

以 ” 天气 ” 属性为例,计算过程如下:

  1. 计算原始信息熵:
  2. 打球(6 次),不打球(4 次)
  3. Entropy(S) = -(6/10)log2(6/10)-(4/10)log2(4/10) ≈ 0.971

  4. 计算天气各取值的信息熵:

  5. 晴(2 打球 / 3 不打球): Entropy(晴) ≈ 0.918
  6. 阴(2 打球 / 0 不打球): Entropy(阴) = 0
  7. 雨(3 打球 / 1 不打球): Entropy(雨) ≈ 0.811

  8. 计算信息增益:

  9. Gain(S, 天气) = 0.971 – (3/100.918 + 2/100 + 5/10*0.811) ≈ 0.246

  10. 计算分裂信息:

  11. SplitInfo(S, 天气) = -(3/10log2(3/10)+2/10log2(2/10)+5/10*log2(5/10)) ≈ 1.485

  12. 计算信息增益比:

  13. GainRatio(S, 天气) = 0.246 / 1.485 ≈ 0.166

Python 实现关键计算

import math

# 计算信息熵
def entropy(probabilities):
    return -sum(p * math.log2(p) for p in probabilities if p > 0)

# 示例计算
p_play = 6/10
p_not_play = 4/10
entropy_total = entropy([p_play, p_not_play])
print(f"总信息熵: {entropy_total:.3f}")

剪枝策略

C4.5 采用悲观剪枝 (Pessimistic Pruning) 作为后剪枝策略:

  1. 先构建完整的决策树
  2. 自底向上考察每个非叶节点
  3. 计算剪枝前后的预期错误率
  4. 如果剪枝后错误率不增加,则进行剪枝

预剪枝也可以在构建过程中通过设置最大深度、最小样本数等参数实现。

避坑指南

  1. 连续值处理不当
  2. 解决方案:使用二分法找到最佳分割点

  3. 忽略缺失值

  4. 解决方案:按照样本权重分配处理缺失值

  5. 过拟合问题

  6. 解决方案:合理设置剪枝参数

  7. 计算效率低

  8. 解决方案:对连续属性排序后计算

  9. 类别不平衡

  10. 解决方案:使用加权信息增益比

总结与思考

C4.5 决策树作为 ID3 的改进版,通过引入信息增益比和剪枝策略,解决了 ID3 的主要缺陷。它的优势在于:

  • 结果直观易解释
  • 支持多种数据类型
  • 对缺失值鲁棒

但同时也存在计算复杂度较高、对类别不平衡敏感等不足。在实际应用中,C4.5 适合需要模型可解释性的场景,但当数据维度很高时,可能需要考虑随机森林等集成方法。

对于初学者来说,通过手动计算一个小例子来理解 C4.5 的原理是非常有帮助的。当掌握了基本原理后,可以尝试使用 scikit-learn 等库来实现更复杂的应用。

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