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

决策树入门指南:从原理到实践

目录

1 决策树的基本原理与理论基础

1.1 基本原理与定义

1.2 决策边界特性

 2 特征选择与划分准则

2.1 信息增益与信息增益比

2.2 Gini指数

3 树的生成与剪枝优化

3.1 剪枝的理论基础

3.2 预剪枝策略

3.2.1基本原理

3.2.2 常用的停止准则

3.3 后剪枝策略

3.3.1 代表性算法

3.3.2 剪枝效果评估

4 连续值处理

4.1 理论基础

4.2 二分法处理策略

4.2.1 候选划分点选择

4.2.2 最优划分点确定

4.3 多区间离散化

4.3.1 Kettering-Ming方法

4.3.2 ChiMerge算法

连续值处理

5 缺失值处理

5.1 理论模型

5.1.1 EM框架

5.2 训练阶段策略

5.2.1 实例权重法

缺失值处理

6 主流决策树算法比较

6.1 核心算法对比

6.1.1 ID3 (Iterative Dichotomiser 3)

6.1.2 C4.5 (ID3的改进版本)

6.1.3 CART (Classification And Regression Tree)

6.2 算法性能对比

6.2.1 特性对比矩阵

7 实际应用建议

7.1 场景选择指南

7.2 改进方向比较

7.3  随机森林优化


1 决策树的基本原理与理论基础

1.1 基本原理与定义

决策树是一种非参数化的监督学习方法,它通过树形结构对特征空间进行划分,从而实现分类或回归。决策树是一种将特征空间划分为若干个单纯区域的分类器。从几何角度看,决策树通过一系列平行于坐标轴的超平面将特征空间递归划分,每个叶节点对应于一个单纯形区域。形式化地说,一棵决策树可以表示为:

f(x)=\sum _{m=1}^{M}c_{m}I(x\in R_{m})

Rm​表示第m个叶节点对应的区域,cm为该区域的预测值。这种分段常数的形式使得决策树具有很好的可解释性。

信息论的角度来看,决策树的构建过程本质上是一个信息增益的最大化过程。在每个节点,我们选择最优的特征及其分割点,使得子节点的纯度相比父节点有最大的提升

1.2 决策边界特性

从几何角度看,决策树生成的决策边界具有以下特点:

  1. 边界平行于坐标轴
  2. 分段线性
  3. 具有局部适应性,即不同区域可以有不同的复杂度

这些特性决定了决策树特别适合处理非线性但轴平行的决策边界,但对斜向的线性边界则需要很多次划分才能逼近

这些理论基础不仅帮助我们更深入地理解决策树的工作原理,也为实践中的参数选择和模型改进提供了重要指导。例如:

  • 信息论视角启发了各种基于熵的划分准则
  • 优化理论解释了为什么要使用贪心策略
  • PAC理论和VC维分析指导了剪枝策略的设计
  • 概率图模型的解释促进了决策树与其他模型的结合

 2 特征选择与划分准则

2.1 信息增益与信息增益比

对于分类问题,最常用的划分准则是信息增益和信息增益比。信息增益基于熵的概念:

Gain(D,a)=H(D)-\sum _{v=1}^{V}\frac{|D^{v}|}{|D|}H(D^{v})

其中,H(D) 表示数据集D的熵:

H(D)=-\sum _{k=1}^{K}\frac{|C_{k}|}{|D|}log_{2}\frac{|C_{k}|}{|D|}

为了克服信息增益偏向于选择取值较多的特征的缺点,引入了信息增益比:

Gain-Ratio(D,a)=\frac{Gain(D,a)}{H_{a}(D)}

2.2 Gini指数

CART树采用基尼指数作为划分准则:

Gini(D)=1-{k=1}\sum _{k=1}^{K}(\frac{|C_{k}|}{|D|})^{2}

3 树的生成与剪枝优化

3.1 剪枝的理论基础

剪枝是决策树学习中解决过拟合的关键技术从偏差-方差分解的角度看,剪枝通过增加模型偏差来降低方差,从而在两者之间寻找最优平衡点。我们可以将剪枝问题形式化为带约束的优化问题:

其中∣T∣为树的节点数,α为复杂度参数,Rt​为叶节点t对应的区域。

3.2 预剪枝策略

3.2.1基本原理

预剪枝在决策树生长过程中进行,通过及时停止某些分支的生长来防止过拟合。这种"前瞻性"的策略可以节省训练时间,但可能会过度保守。

预剪枝是在决策树生成过程中,对每个节点在划分前进行评估。如果当前节点的划分不能带来统计意义上的显著性提升,则停止划分并将当前节点标记为叶节点。预剪枝的主要优点是可以防止过拟合,缺点是可能会带来欠拟合。

3.2.2 常用的停止准则

基于纯度阈值 当节点的纯度指标(如基尼指数)小于阈值ϵ时停止划分:

Gini(D)=1-\sum_{k=1}^{|y|}p_{k}^{2}< \varepsilon

 基于样本数量 当节点样本数小于阈值时停止划分,避免统计不稳定性:

|D_{t}|< min\; samples\, split

基于信息增益 当最佳划分的信息增益小于阈值时停止:

Gain(D,A)< min-gain-threshold

基于验证集精度 通过验证集评估划分的必要性:

Accuracy(D_{val}^{split})\leq Accuracy(D_{val}^{split})+\delta

3.3 后剪枝策略

后剪枝是在决策树完全生成后,自底向上地对非叶节点进行评估。对于每个非叶节点,我们计算如果将该节点及其子树替换为叶节点后的性能变化。如果性能提升或损失在可接受范围内,则进行剪枝。后剪枝通常能得到更好的结果,但计算开销较大。

3.3.1 代表性算法

  • 错误率降低剪枝(Reduced Error Pruning, REP)
  • 自下而上遍历内部节点
  • 比较剪枝前后验证集错误率
  • 选择能降低错误率的剪枝操作

Error(T^{'})< Error(T) 

代价复杂度剪枝(Cost-Complexity Pruning)是一种典型的后剪枝方法,其优化目标为:

R_{\alpha }(T)=R(T)+\alpha |T|

其中R(T)为训练误差,α为复杂度参数。

  • 悲观剪枝(Pessimistic Error Pruning, PEP)
  • 使用统计置信上界估计泛化误差:

 R_{upper}(T)=R(T)+\sqrt{\frac{R(T)(1-T(T))}{N}}+\frac{|T|}{2N}

3.3.2 剪枝效果评估

为了科学评估剪枝效果,我们通常考虑以下指标:

  • 性能度量:
  • 准确率变化
  • AUC-ROC曲线变化
  • 交叉验证得分
  • 结构度量:
  • 树的深度减少比例
  • 节点数减少比例
  • 平均分支因子变化

4 连续值处理

4.1 理论基础

连续特征的处理本质上是将连续域离散化的过程。从信息论角度看,这是一个信息压缩的过程,目标是在保留关键信息的同时降低模型复杂度。形式化地,对于连续特征A,我们寻找最优划分点集合:

4.2 二分法处理策略

4.2.1 候选划分点选择

  1. 排序法

其中ai为特征A的第i个取值。

  1. 分位数法 使用等频或等宽的分位数作为候选划分点:

 

4.2.2 最优划分点确定

1.基于信息增益

 

2.基于基尼指数

4.3 多区间离散化

4.3.1 Kettering-Ming方法

  1. 初始化为二分类
  2. 递归划分子区间:

 其中N为样本数,)Δ(A)为编码长度增量。

4.3.2 ChiMerge算法

基于卡方检验的自底向上合并:

连续值处理

  1. 对于高基数连续特征,优先考虑分位数法以控制划分点数量
  2. 在计算资源允许的情况下,可以使用动态规划寻找全局最优划分
  3. 结合业务知识设定划分点,提高模型可解释性

5 缺失值处理

5.1 理论模型

5.1.1 EM框架

将缺失值处理建模为一个EM问题:

  • E步:估计缺失值的概率分布
  • M步:基于完整数据优化决策树参数

概率模型:

5.2 训练阶段策略

5.2.1 实例权重法

1.权重计算 对于特征A的取值a:

 2.信息增益计算 修正的信息增益公式:

其中ρ为无缺失值样本的比例。

缺失值处理

  1. 首先分析缺失机制,选择合适的处理策略
  2. 对于重要特征,建议使用多重填充或构建替代模型
  3. 在预测时,优先使用概率加权法处理缺失值,提高预测稳定性

6 主流决策树算法比较

6.1 核心算法对比

6.1.1 ID3 (Iterative Dichotomiser 3)

  • 特征选择
  • 使用信息增益作为划分准则:
Gain(D,A) = Ent(D) - \sum_{v=1}^{V}\frac{|D^v|}{|D|}Ent(D^v)
  • 主要特点
  • 仅支持离散型特征
  • 没有剪枝策略
  • 偏向取值较多的特征
  • 无法处理缺失值
  • 适用场景
  • 小规模数据集
  • 特征都是离散值
  • 对模型规模无严格要求

6.1.2 C4.5 (ID3的改进版本)

  • 改进特性
  • 引入增益率作为划分准则:
GainRatio(D,A) = \frac{Gain(D,A)}{SplitInfo(A)}

其中:

SplitInfo(A) = -\sum_{v=1}^{V}\frac{|D^v|}{|D|}\log_2\frac{|D^v|}{|D|}
  • 功能扩展
  • 支持连续特征处理
  • 实现了悲观剪枝
  • 能够处理缺失值
  • 支持属性权重
  • 优化策略
  • 对连续属性采用二分法
  • 使用MDL(Minimum Description Length)原理
  • 实现了多重填充处理缺失值

6.1.3 CART (Classification And Regression Tree)

  • 技术特点
  • 使用基尼指数:
Gini(D) = 1 - \sum_{k=1}^{|y|}p_k^2
  • 核心优势
  • 同时支持分类和回归
  • 生成二叉树结构
  • 实现代价复杂度剪枝
  • 处理异常值鲁棒性强
  • 特殊功能
  • 支持样本权重
  • 可处理重复变量
  • 提供变量重要性评估

6.2 算法性能对比

6.2.1 特性对比矩阵

特性ID3C4.5CART
连续值处理
离散值处理
缺失值处理
剪枝策略
支持回归
过拟合处理良好优秀
异常值敏感度

7 实际应用建议

7.1 场景选择指南

  • 选择ID3的情况
  • 数据集较小
  • 特征全为离散值
  • 对模型简单性要求高
  • 用于教学或演示
  • 选择C4.5的情况
  • 混合型特征数据
  • 存在缺失值
  • 需要可解释性强的模型
  • 计算资源充足
  • 选择CART的情况
  • 需要处理回归问题
  • 对预测精度要求高
  • 数据存在噪声和异常值
  • 需要稳定性好的模型

7.2 改进方向比较

  • ID3的改进空间
  • 增加连续值处理能力
  • 添加剪枝机制
  • 优化特征选择准则
  • C4.5的改进方向
  • 提高数值计算效率
  • 优化剪枝策略
  • 增强对高维特征的处理能力
  • CART的改进重点
  • 降低训练时间
  • 提高并行计算效率
  • 优化超参数选择

7.3  随机森林优化

基于单棵决策树的局限性,随机森林通过集成学习的方式提高模型性能:

  1. 样本采样:使用bootstrap采样生成不同的训练集
  2. 特征采样:在每个节点随机选择特征子集
  3. 多树投票:综合多棵树的预测结果

 代码详解:

def build_decision_tree(data, max_depth=None, min_samples_split=2):
    """
    构建决策树的递归实现
    """
    # 基础判断
    if (max_depth is not None and max_depth <= 0) or \
       len(data) < min_samples_split or \
       len(np.unique(data['target'])) == 1:
        return create_leaf(data)
    
    # 特征选择
    best_feature, best_threshold = find_best_split(data)
    
    # 数据划分
    left_data, right_data = split_data(data, best_feature, best_threshold)
    
    # 递归构建子树
    left_branch = build_decision_tree(
        left_data, 
        max_depth-1 if max_depth is not None else None,
        min_samples_split
    )
    right_branch = build_decision_tree(
        right_data,
        max_depth-1 if max_depth is not None else None,
        min_samples_split
    )
    
    return {'feature': best_feature,
            'threshold': best_threshold,
            'left': left_branch,
            'right': right_branch}


http://www.kler.cn/a/455364.html

相关文章:

  • snprintf的概念和使用案例
  • Redis--如何保障缓存数据库一致性?(面试高频问题)
  • 虚幻引擎反射机制
  • OCR实践-Table-Transformer
  • Flink CDC MySQL 同步数据到 Kafka实践中可能遇到的问题
  • C++:单例模式
  • CAN201 Introduction to Networking(计算机网络)Pt.3 网络层
  • mysql5.7.29迁移至DM8操作
  • 前端往后端传递参数的方式有哪些?
  • 01背包和完全背包
  • Spring boot处理跨域问题
  • linux攻防
  • LeetCode - Google 校招100题 第5天 双指针(Two Pointers) (11题)
  • EKF 自动匹配维度 MATLAB代码
  • 【模电刷题复习--选择】
  • 23. 贪吃蛇
  • 三维激光扫描及逆向工程-构建复杂工业产品模型
  • 删除拼排序链表中的重复元素(最优解)
  • [python SQLAlchemy数据库操作入门]-13.集成Pandas:强大的数据分析工具
  • Ubuntu20.04安装FastRTPS,报错没有fastrtps-config.cmake
  • Spring Boot 实战:构建一个简单的 Web 应用
  • PyTorch Lightning模块介绍
  • 在 Vue3 项目中安装和配置 Three.js
  • 磁盘 IO 报警,MySQL 读写哪个文件慢了?
  • C语言简单测试总结
  • 复习打卡大数据篇——Hadoop MapReduce