C4.5决策树算法手算详解:从数学推导到实际应用

1次阅读
没有评论

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

image.webp

决策树算法概述

决策树是一种常用的机器学习算法,主要用于分类和回归任务。它通过一系列的判断规则来对数据进行分类,这些规则形成的结构就像一棵倒置的树。决策树的构建过程就是一个递归地选择最优特征进行分裂的过程。

C4.5 决策树算法手算详解:从数学推导到实际应用

ID3 与 C4.5 算法的区别

  1. ID3 算法 :使用信息增益作为特征选择标准,倾向于选择取值较多的特征,容易导致过拟合。
  2. C4.5 算法 :改进 ID3 算法,使用信息增益率作为特征选择标准,能够有效减少对取值较多特征的偏好,同时支持连续值特征和缺失值处理。

C4.5 算法核心原理

信息增益率的计算

信息增益率是 C4.5 算法的核心,它通过引入分裂信息来惩罚取值较多的特征。计算步骤如下:

  1. 计算熵(Entropy):衡量数据的不确定性。
    $$
    Entropy(S) = -\sum_{i=1}^{c} p_i \log_2 p_i
    $$

  2. 计算条件熵(Conditional Entropy):给定特征 A 后,数据的不确定性。
    $$
    Entropy(S|A) = \sum_{v \in Values(A)} \frac{|S_v|}{|S|} Entropy(S_v)
    $$

  3. 计算信息增益(Information Gain)
    $$
    Gain(S, A) = Entropy(S) – Entropy(S|A)
    $$

  4. 计算分裂信息(Split Information)
    $$
    SplitInfo(S, A) = -\sum_{v \in Values(A)} \frac{|S_v|}{|S|} \log_2 \frac{|S_v|}{|S|}
    $$

  5. 计算信息增益率(Gain Ratio)
    $$
    GainRatio(S, A) = \frac{Gain(S, A)}{SplitInfo(S, A)}
    $$

手算示例演示

假设我们有一个简单的数据集,包含天气、温度、湿度和是否打篮球四个特征。我们以天气为例,演示信息增益率的计算过程。

  1. 计算初始熵
  2. 打篮球的样本数:9
  3. 不打篮球的样本数:5
  4. 总样本数:14
  5. 熵:$Entropy(S) = -\left(\frac{9}{14} \log_2 \frac{9}{14} + \frac{5}{14} \log_2 \frac{5}{14}\right) \approx 0.940$

  6. 计算条件熵

  7. 天气有晴天、阴天、雨天三种取值。
  8. 晴天:打篮球 3,不打篮球 2,熵:$Entropy(S_{sunny}) = -\left(\frac{3}{5} \log_2 \frac{3}{5} + \frac{2}{5} \log_2 \frac{2}{5}\right) \approx 0.971$
  9. 阴天:打篮球 4,不打篮球 0,熵:$Entropy(S_{overcast}) = 0$
  10. 雨天:打篮球 2,不打篮球 3,熵:$Entropy(S_{rainy}) \approx 0.971$
  11. 条件熵:$Entropy(S|weather) = \frac{5}{14} \times 0.971 + \frac{4}{14} \times 0 + \frac{5}{14} \times 0.971 \approx 0.693$

  12. 计算信息增益

  13. $Gain(S, weather) = 0.940 – 0.693 = 0.247$

  14. 计算分裂信息

  15. $SplitInfo(S, weather) = -\left(\frac{5}{14} \log_2 \frac{5}{14} + \frac{4}{14} \log_2 \frac{4}{14} + \frac{5}{14} \log_2 \frac{5}{14}\right) \approx 1.577$

  16. 计算信息增益率

  17. $GainRatio(S, weather) = \frac{0.247}{1.577} \approx 0.157$

Python 代码实现

import math

def entropy(data):
    total = len(data)
    if total == 0:
        return 0
    positives = sum(data)
    negatives = total - positives
    p_pos = positives / total
    p_neg = negatives / total
    if p_pos == 0 or p_neg == 0:
        return 0
    return - (p_pos * math.log2(p_pos) + p_neg * math.log2(p_neg))

def gain_ratio(data, feature_values, target_values):
    total_entropy = entropy(target_values)
    split_info = 0
    conditional_entropy = 0
    for value in set(feature_values):
        subset = [target_values[i] for i in range(len(target_values)) if feature_values[i] == value]
        weight = len(subset) / len(target_values)
        conditional_entropy += weight * entropy(subset)
        split_info -= weight * math.log2(weight) if weight > 0 else 0
    gain = total_entropy - conditional_entropy
    return gain / split_info if split_info > 0 else 0

# 示例数据
weather = ['sunny', 'sunny', 'overcast', 'rainy', 'rainy', 'rainy', 'overcast', 'sunny', 'sunny', 'rainy', 'sunny', 'overcast', 'overcast', 'rainy']
play = [1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0]

print("Gain Ratio for weather:", gain_ratio(play, weather, play))

算法优缺点分析

优点

  1. 使用信息增益率,减少对取值较多特征的偏好。
  2. 支持连续值特征和缺失值处理。
  3. 生成的树结构易于理解和解释。

缺点

  1. 计算复杂度较高,尤其是处理大型数据集时。
  2. 对噪声数据敏感,容易过拟合。
  3. 需要剪枝来优化模型性能。

实际应用建议

  1. 数据预处理:确保数据质量,处理缺失值和异常值。
  2. 特征选择:优先选择信息增益率高的特征。
  3. 剪枝:使用预剪枝或后剪枝来避免过拟合。
  4. 模型评估:使用交叉验证来评估模型性能。

练习题

  1. 给定以下数据集,计算 ” 湿度 ” 特征的信息增益率。
  2. 湿度:[高, 高, 高, 中, 低, 低, 低, 中, 低, 中, 中, 高, 中, 低]
  3. 是否打篮球:[1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0]

  4. 尝试用 Python 实现一个完整的 C4.5 决策树算法,包括特征选择、树构建和预测功能。

  5. 思考如何优化 C4.5 算法,使其更适合处理高维数据。

通过以上内容,相信你对 C4.5 决策树算法的手算过程和实现有了更深入的理解。希望你能在实际应用中灵活运用这些知识,构建高效的决策树模型。

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