大数据-201 决策树从分裂到剪枝:信息增益/增益率、连续变量与CART要点

TL;DR

  • 场景:用决策树做分类/回归,需要解释"贪心局部最优、分裂准则、剪枝、连续变量处理"。
  • 结论:核心矛盾是"训练集纯度提升"与"泛化能力"冲突;用增益率/基尼准则 +(预/后)剪枝 + 验证策略来平衡。
  • 产出:一套可复用的概念框架:分裂标准→二叉分裂→连续变量候选切分点→剪枝与验证集修正。

决策树

决策树是一种基于树状结构的监督学习模型,常用于分类和回归任务。它的基本思想是通过一系列问题的分层次判断,将数据分割成越来越小的子集,直到达到预期的目标(如纯度较高的叶子节点,或预测值的误差足够小)。决策树的节点表示判断条件,分支表示不同的条件结果,最终的叶子节点对应具体的分类结果或预测值。

局部最优

在构建决策树的机器学习过程中,通常采用贪心算法(Greedy Algorithm)作为核心的分割策略。这种方法的基本原理是:在每一步决策时,都选择当前条件下最优的分割方式,而不考虑这一选择对后续步骤可能产生的影响。

具体来说,决策树的构建过程会递归地进行以下操作:

  1. 在当前节点上,计算所有可能的特征和分割点的信息增益(或基尼不纯度等分裂标准)
  2. 选择使信息增益最大化的特征和分割点
  3. 根据选定的分割将数据集划分为若干子集
  4. 对每个子集递归地重复上述过程,直到满足停止条件(如达到最大深度、节点样本数低于阈值等)

这种方法被称为"局部最优"(Locally Optimal),因为它只关注当前步骤的最佳决策,而不考虑全局最优(Globally Optimal)的解决方案。虽然这种策略可能导致最终的决策树不是理论上最优的,但它具有以下显著优势:

  • 计算效率高:避免了穷举所有可能的树结构
  • 实现简单:算法逻辑清晰,易于理解和实现
  • 实际效果好:在大多数实际应用场景中仍能获得良好的预测性能

例如,在ID3、C4.5和CART等经典决策树算法中,都采用了这种贪心策略。虽然理论上存在可能找到更优树的算法(如动态规划),但由于决策树构建问题的组合爆炸特性,这些方法通常计算复杂度太高,不适合处理实际规模的数据集。

剪枝

剪枝是一种用于防止决策树过拟合的方法。在决策树的构建过程中,过度的分裂会导致模型对训练数据过度拟合,进而降低对新数据的泛化能力。剪枝的目的是通过去除一些不必要的分支,简化决策树结构,从而提升模型的泛化能力。常见的剪枝方法有预剪枝(pre-pruning)和后剪枝(post-pruning)。预剪枝在构建决策树时提前停止某些分裂,而后剪枝则是在树构建完成后再去掉一些不重要的分支。

分裂

分裂是决策树构建中的一个核心过程,指的是从根节点开始,根据某个特征的值,将数据划分到不同的子节点中。通过不断地分裂,决策树逐渐将数据集划分成更小的子集,使得每个子集内部的样本更具一致性。在分类任务中,分裂的目标是最大化信息增益或基尼系数的变化,在回归任务中则常采用均方误差或方差作为指标。分裂的过程直到达到设定的停止条件(如节点纯度、树的深度限制等)才会停止。

二叉分裂

二叉分裂是一种特定的分裂方式,每次只将节点分成两个子节点,形成一个二叉树结构。决策树可以通过二叉分裂的方式构建,其中每次分裂时,将样本数据分成两个互斥的子集。这种分裂方式的优点是结构简单,且在很多实现中效率较高。许多决策树算法(如CART算法)就是基于二叉分裂构建的。这种结构的决策树在每个节点上只能有两个分支,即「是」或「否」,从而确保树结构的简洁性。

修改局部最优条件

  • 以信息增益作为划分训练数据集的特征,存在偏向于选择取值较多的特征的问题。
  • 使用信息增益比(information gain ratio)可以对这一问题进行矫正

称为属性 a 的"固有值"(intrinsic value) 属性 a 的可能取值越多(即 V 越大),则 IV(a)的值通常会越大。 IV 值会随着叶节点上样本量的变小而逐渐变大,也就是说一个特征中如果标签分类太多,每个叶子上的 IV 值就会非常大。 值得注意的是,增益率准则对可取值数目较少的属性有所偏好,因此,C4.5 算法并不是直接选择增益率最大的候选划分属性,而是使用了一种启发式:先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的。

连续变量处理手段

在 C4.5 中,同样还增加了针对连续变量的处理手段。如果输入特征字段是连续型变量,则算法首先会对这一列数进行从小到大的排序,然后选取相邻的两个数的中间数作为切分数据集的备选点,若一个连续变量有 N 个值,则在 C4.5 的处理过程中将产生 N-1 个备选切分点,并且每个切分点都代表着一种二叉树的切分方案,例如: 这里需要注意的是,此时连续变量的处理并非是将其转换为一个拥有 N-1 个分类水平的分类变量,而是将其转换为了 N-1 个二分方案,而在进行了下一次的切分过程中,在 N-1 个方案都要单独带入考虑,其中每一个切分方案和一个离散变量的地位均相同(一个离散变量就是一个单独的多路切分方案)。 例如如下数据集,数据集中的只有两个字段,第一行代表年龄,是特征变量,第二行代表性别,是目标字段,则对年龄这一连续变量的切分方案如图所示: 从上述能够看出,在对于包含连续变量的数据集进行树模型构建的过程中要消耗更多的运算资源。但与此同时,我们也会发现,当连续变量的某中间点参与到决策的二分过程中,往往代表该点对于最终分类结果有较大影响,这也为我们连续变量的分箱压缩提供了指导性意见。

例如上述案例,若要对 Age 列进行压缩,则可考虑使用 36.5 对其进行分箱,则分箱结果对于性别这一目标字段仍然具有较好的分类效果,这也是决策树最常见的用途之一,也是最重要的模型指导分箱的方法。

决策树的拟合度优化

在实际操作中,我们判断模型的是否拟合往往是从模型训练误差和泛化误差,二者结合使用就能判断模型是否存在过拟合现象。虽然我们之前举例时并没有对数据集进行切分,但任何有监督学习算法建模过程中都需要进行训练集和测试集的划分,决策树也不例外,进而我们可用交叉验证计算训练误差和泛化误差,进而判断决策树是否存在过拟合。 这是一套通用的判断有监督学习算法是否过拟合的方法,同时通用的方法中还有更高级的方法。 但对于决策树而言,有一套决策树独有的防止过拟合的解决方案--剪枝。

决策树剪枝

所谓剪枝是指在决策树中去除部分叶节点,剪枝(Pruning)主要用来防止过拟合,对于一般的数据集如果总是追求纯的叶节点,或者观测数较小的叶节点,很容易使得树过于庞杂,尤其是存在可以反复使用的连续变量的时候,此时就需要主动去掉一些分支来降低过拟合的风险。

常见的剪枝策略有"预剪枝"(Pre-Pruning)和"后剪枝"(Post-Purning)

  • 预剪枝:在决策树生成的过程中,对每个节点在划分前先进行估计,如果当前的节点划分不能带来决策树泛化性能(预测性能)的提升,则停止划分并且当前节点标记为叶节点。
  • 后剪枝:先训练生成一颗完整的树,自底向上对非叶节点进行考察,如果该节点对应的子树替换为叶节点能带来决策树泛化能力的提升,则该子树替换为叶节点。

分裂准则

二叉递归划分:条件成立向左,反之向右

  • 对于连续变量:条件是属性小于等于最优分裂点
  • 对于分类变量:条件是属性属于若干类

二叉分裂优点

相比多路分裂导致数据碎片化的速度慢,允许在一个属性上重复分裂,即可以在一个属性上产生足够多的分裂。两路分裂带来的树预测性能提升足以弥补其相应的树易读性损失。

对于属性不同的被预测变量 Y 分裂准则不同:

  • 分类树:Gini 准则,与之前的信息增益很类似,Gini 系数度量一个节点的不纯度。
  • 回归树:一种常见的分割标准是偏差减少(Stand Deviation Reduction,SDR),类似于最小均方差 LS(Least Squares 预测错误的平方和)准则。

利用测试集进行剪枝

简单讨论 CART 算法剪枝过程,该过程也是测试集用于修正模型的最佳体现。例如,在如下训练集中训练得到的模型,黑色数字表示训练集上的分类情况,红色数字表示模型作用于验证集上的分类情况。

则 CART 算法利用验证集剪枝的过程如下:

  • 判断每个叶节点在验证集上的错误率
  • 节点 4 的错误率:e(4) = 1/3
  • 节点 5 的错误率 e(5) = 1
  • 节点 6 的错误率 e(6) = 1
  • 节点 7 的错误率为 e(7) = 4 / 9

计算节点总加权平均错误率并和父节点进行比较,加权方法就是乘以该节点样本数量占父节点样本总量的百分比(测试集):

如节点 2 的错误率为 e(2)=1/4,而节点 4 和节点 5 的加权平均错误率为 e(4) * 3/4 + e(5) * 1/4 = 2/4,因此子节点错误率更高,考虑剪枝。 节点 3 的错误率为 e(3) = 4/10,而 e(6)* 1/10 + e(7)*9/10 = 5/10,因此考虑剪枝。 节点 2 和节点 3 的加权平均错误率 e(2) * 4/14 + e(3) * 10/14 = 5/14,比父节点(节点 1)的错误率 e(1) = 7/14 要小,因此保留该节点,停止剪枝。

可以看出,CART 算法剪枝过程更易理解也更便于操作,同时我们也能看到对于建立模型的算法而言,测试集不仅能够对模型准确率进行评估,同时还能起到修正优化模型的作用。

测试集和验证集

对于大多数模型而言,测试集实际上的作用就是用来修正模型,为了提高修正的准确率,我们也可以采用交叉验证的方法,反复判别模型修改条件(如是否要剪枝),并设置模型修改出发条件(如多数验证情况需要修改则对其进行修改),从而提高模型优化的可靠性。

而除了训练集和测试集之外,我们还尝尝会划分一个验证集,验证集数据不参与建模叶不参与模型修改和优化,只用于模型最终优化后的模型效力。

而训练集、测试集和验证集的划分通常遵照 6:2:2 的比例进行划分,当然也可以根据实际需求适当调整划分比例,但无论如何,测试集和验证集数据量都不宜过多也不宜过少,该二者数据集数据均不参与建模,若占比太多,则会对模型的构建过程造成较大的影响(欠拟合),而若划分数据过少,训练集数据量较大,则又可能造成过拟合,数据集的划分也是影响拟合度的重要因素。

错误速查

症状 根因 定位 修复
训练集准确率高、线上/测试集差 树太深、叶子太纯导致过拟合 看深度、叶子样本数、训练-验证差距 预剪枝(max_depth/min_samples_*)、后剪枝、交叉验证选复杂度
总是选"取值很多"的特征先分裂 信息增益对多取值特征有偏好 统计候选特征取值数与被选频率 使用增益率/增益比;或改用基尼/正则化剪枝策略
连续变量分裂很慢、训练耗时暴涨 连续变量候选切分点多(N-1) 单列唯一值数量、排序与评估次数 先分箱/采样候选点/限制最大叶子数;减少高基数连续特征参与
多路分裂后数据碎片化严重 多路分裂稀释样本,子节点样本太少 查看每次分裂后的子节点样本占比 倾向二叉分裂;提高最小叶子样本阈值
树结构可解释但稳定性差 数据扰动导致分裂点变化(高方差模型) 不同随机种子/重采样下树结构差异 用剪枝/限制复杂度;需要稳定性则用集成(随机森林/GBDT)
剪枝后准确率反而下降 剪枝强度过大或验证集代表性差 对比剪枝前后训练/验证/测试指标 调整剪枝阈值;重做数据划分或用交叉验证稳定选择
验证集效果好、测试集崩 验证集参与过多调参导致"验证集过拟合" 观察调参次数与指标波动 使用嵌套交叉验证;保留最终独立测试集一次性评估
类别极不平衡时叶子预测偏向多数类 分裂准则未显式处理类别权重 混淆矩阵、少数类召回率异常低 类别权重/重采样;以召回/F1为主目标约束分裂与剪枝

其他系列

🚀 AI篇持续更新中(长期更新)

AI炼丹日志-29 - 字节跳动 DeerFlow 深度研究框斜体样式架 私有部署 测试上手 架构研究 ,持续打造实用AI工具指南! AI研究-132 Java 生态前沿 2025:Spring、Quarkus、GraalVM、CRaC 与云原生落地

💻 Java篇持续更新中(长期更新)

Java-207 RabbitMQ Direct 交换器路由:RoutingKey 精确匹配、队列多绑定与日志分流实战 MyBatis 已完结,Spring 已完结,Nginx已完结,Tomcat已完结,分布式服务已完结,Dubbo已完结,MySQL已完结,MongoDB已完结,Neo4j已完结,FastDFS 已完结,OSS已完结,GuavaCache已完结,EVCache已完结,RabbitMQ正在更新... 深入浅出助你打牢基础!

📊 大数据板块已完成多项干货更新(300篇):

包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈! 大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT案例 详解

相关推荐
应用市场2 小时前
# 内容平台推荐算法与创作者激励机制——从抖音/B站看流量分配的技术逻辑
算法·机器学习·推荐算法
老吴学AI2 小时前
第二篇:智能五层模型:定义你的AI应用战略高度
大数据·人工智能·aigc
、BeYourself2 小时前
Spring AI RAG 系统文档加载
java·后端·spring·springai
阿正的梦工坊2 小时前
VisualTrap:一种针对 GUI Agent 的隐蔽视觉后门攻击
人工智能·深度学习·机器学习·语言模型·自然语言处理
cike_y2 小时前
Spring:代理模式之静态代理&动态代理
java·后端·spring·代理模式
渡我白衣2 小时前
从直觉到公式——线性模型的原理、实现与解释
人工智能·深度学习·神经网络·机器学习·计算机视觉·自然语言处理·caffe
不一样的故事1262 小时前
1. 公司质量体系的维护与申办监管•
大数据·运维·人工智能
向量引擎小橙2 小时前
数字孪生进阶版:“全脑城市”如何改变我们的生活
大数据·人工智能·深度学习·生活·集成学习
大千AI助手2 小时前
DeepSeek V3.2 能不能真正跑 Agent?
人工智能·机器学习·agent·智能体·deepseek·deepseek-v3.2·大千ai助手