C4.5决策树算法公式解析:从数学原理到Python实现

1次阅读
没有评论

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

image.webp

决策树算法背景与 C4.5 特点

决策树是机器学习中经典的分类与回归方法,通过树形结构对数据进行分层划分。C4.5 算法由 Ross Quinlan 在 1993 年提出,是 ID3 算法的改进版本,核心改进在于使用 信息增益比 替代信息增益进行特征选择,有效缓解了 ID3 对多值属性的偏好问题。

C4.5 决策树算法公式解析:从数学原理到 Python 实现

  • 核心特点
  • 支持连续属性(通过二分法离散化)
  • 自动处理缺失值(通过概率权重分配)
  • 内置剪枝机制防止过拟合

信息增益比公式解析

1. 信息熵基础

信息熵 $H(D)$ 衡量数据集 $D$ 的不确定性:
$$H(D) = -\sum_{k=1}^K p_k \log_2 p_k$$
其中 $p_k$ 为类别 $k$ 在数据集中的比例。

2. 条件熵与信息增益

给定特征 $A$ 的条件熵 $H(D|A)$:
$$H(D|A) = \sum_{i=1}^n \frac{|D_i|}{|D|} H(D_i)$$
信息增益 $G(D,A) = H(D) – H(D|A)$

3. 信息增益比(核心公式)

为解决信息增益的偏差问题,引入特征固有值 $IV(A)$:
$$IV(A) = -\sum_{i=1}^n \frac{|D_i|}{|D|} \log_2 \frac{|D_i|}{|D|}$$
最终信息增益比定义为:
$$G_R(D,A) = \frac{G(D,A)}{IV(A)}$$


ID3 vs C4.5 算法对比

对比维度 ID3 算法 C4.5 算法
特征选择 使用信息增益 使用信息增益比
连续值处理 不支持 支持二分法离散化
缺失值处理 直接丢弃含缺失值样本 按概率分布分配到子节点
剪枝策略 后剪枝(悲观错误剪枝)
计算效率 较高(仅需计算信息增益) 较低(需计算固有值)

Python 实现(PEP8 规范)

import numpy as np
from collections import Counter

class C45DecisionTree:
    def __init__(self, min_samples_split=2, max_depth=None):
        self.min_samples_split = min_samples_split
        self.max_depth = max_depth

    def _entropy(self, y):
        """计算信息熵"""
        counts = np.bincount(y)
        ps = counts / len(y)
        return -np.sum([p * np.log2(p) for p in ps if p > 0])

    def _information_gain_ratio(self, X, y, feature_idx):
        """计算信息增益比"""
        # 原始熵
        parent_entropy = self._entropy(y)

        # 按特征值划分数据
        values, counts = np.unique(X[:, feature_idx], return_counts=True)

        # 计算条件熵
        child_entropy = 0
        for value, count in zip(values, counts):
            subset = y[X[:, feature_idx] == value]
            child_entropy += (count / len(X)) * self._entropy(subset)

        # 计算固有值
        iv = -np.sum([(count/len(X)) * np.log2(count/len(X)) 
                      for count in counts])

        # 避免除零错误
        return (parent_entropy - child_entropy) / iv if iv > 0 else 0

实际应用注意事项

  1. 连续值处理
  2. 对连续属性排序后,选择相邻值的中位数作为候选划分点
  3. 计算每个划分点的信息增益比,选择最优划分

  4. 缺失值处理

  5. 将含缺失值的样本按已知值的比例分配到各子节点
  6. 预测时,若遇到缺失特征,同时遍历所有可能路径并按概率加权

  7. 剪枝策略

  8. 预剪枝:通过 max_depth、min_samples_split 等参数控制
  9. 后剪枝:训练完整树后,自底向上替换子树为叶节点,验证准确率变化

示例数据集演示

以经典的天气数据集为例:

Outlook Temperature Humidity Windy Play
Sunny Hot High False No
Overcast Hot High True Yes

计算步骤:
1. 计算整体信息熵 $H(D) = -\frac{5}{14}\log\frac{5}{14} – \frac{9}{14}\log\frac{9}{14} \approx 0.940$
2. 计算 Outlook 特征的信息增益比:
– $G(D,Outlook) = 0.940 – 0.694 = 0.246$
– $IV(Outlook) = 1.577$
– $G_R = 0.246/1.577 \approx 0.156$
3. 同理计算其他特征,选择增益比最大的作为根节点


总结与思考

适用场景
– 特征同时包含离散值和连续值
– 需要可解释性强的模型
– 数据存在缺失值

局限性
– 对高维稀疏数据效果较差
– 容易生成复杂树结构(需配合剪枝)
– 信息增益比计算成本较高

改进方向
– 当特征间存在强相关性时,可考虑随机森林等集成方法
– 对于类别不平衡数据,需调整划分标准(如基尼指数)
– 在大数据场景下,可使用近似计算加速增益比评估

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