深入解析:《统计学习方法》第5章——决策树(下)【学习笔记】

前言

学习机器学习的过程中,我逐渐意识到:
如果只有代码,而没有理论,就很难真正理解模型在做什么
倘若只有概念,而缺少一个系统框架,又难以把知识串成体系

《统计学习办法》正好献出了这样一个结构清晰的入口——它把机器学习的核心思想和经典算法用统计学的语言表达出来,援助我们理解算法背后的原理。

在这里插入图片描述

因此,我决定开启这个专栏,用自己的方式整理学习笔记。主要目标是:

  • 用更直白的语言梳理书中的概念
  • 把知识点整理成便于查阅和复习的形式
  • 记录自己的理解和思考过程

这些笔记主要是我个人的学习记录,若是恰好对你也有帮助,那就更好了。希望利用这个过程,能让自己对机器学习的理论基础有更扎实的理解。


第5章——决策树(下)

本章先介绍决策树的基本概念,然后凭借 ID3 和 C4.5 介绍特征的选择、决策树的生成以及决策树的修剪,最后介绍 CART 算法。

5.4 决策树的剪枝

剪枝目标:解决过拟合问题,提升模型泛化能力。

在构建决策树的过程中,算法会不断递归划分材料,直到无法继续分裂为止。这样生成的模型通常能在训练集上达到很高的分类准确率,但在测试集上表现却未必理想,即可能出现“过拟合”:模型为了追求训练数据的完美分类,学到了过多细节和噪声,结构变得过于麻烦。

为减轻过拟合,必须在树生成后对其结构进行适当的简化,这个过程称为剪枝(pruning)

⭐️:就是剪枝的核心思想
从已经生长完成的决策树中去掉某些子树或叶结点,用它们的父结点直接作为新的叶结点,从而让模型更容易、更具泛化能力。

5.4.1 预剪枝

核心思想:在树生成过程中提前停止。

操作方式:在每个结点划分前进行评估,若当前划分不能提升泛化能力,则停止分裂,直接将当前结点标记为叶结点。

特点:预剪枝降低了过拟合风险,减少了训练时间和测试时间,但可能导致欠拟合,因为有些分支被提前截断。

常见的预剪枝途径:

  • 限定决策树的深度
  • 设定一个阈值
  • 设置某个指标,比较结点划分前后的泛化能力

5.4.2 后剪枝

核心思想:先生成完整树,再自底向上修剪。

操作方式:先生成一棵完整的决策树,接着从底部向上考察每个内部结点。若将内部结点替换为叶结点能提升泛化能力,则执行替换。

特点:后剪枝的泛化性能通常优于预剪枝,但训练时间开销较大,因为需要先生成完整的树。

常见的后剪枝办法:

  • 降低错误剪枝 Reduce Error Pruning
  • 悲观错误剪枝 Pessimistic Error Pruning
  • 最小误差剪枝 Minimum Error Pruning
  • 基于错误的剪枝 Error Based Pruning
  • 代价复杂度剪枝 Cost-Complexity Pruning

☘️剪枝算法

给每一棵树计算一个“就是决策树剪枝的核心思想,就综合 cost”,这个 cost 同时考虑两件事:

  1. 树对训练数据的拟合好不好
  2. 树复杂不复杂

这两部分一起构成下面的损失函数:

Cα(T)=∑t=1∣T∣NtHt(T)+α∣T∣ C_\alpha(T) = \sum_{t=1}^{|T|} N_t H_t(T) + \alpha|T|Cα(T)=t=1TNtHt(T)+αT

其中:

  • 第一项
    C(T)=∑t=1∣T∣NtHt(T) C(T)=\sum_{t=1}^{|T|} N_t H_t(T)C(T)=t=1TNtHt(T)
    衡量模型对训练数据的错误程度,越小越说明树拟合得越好。

  • 第二项
    α∣T∣ \alpha |T|αT
    用来惩罚树过于繁琐。叶子越多、模型越复杂,惩罚越大。

经验熵用来计算叶结点的纯度

Ht(T)=−∑kNtkNtlog⁡NtkNt H_t(T) = -\sum_k \frac{N_{tk}}{N_t} \log \frac{N_{tk}}{N_t}Ht(T)=kNtNtklogNtNtk

同时参数 α≥0\alpha \ge 0α0控制“拟合好”和“模型简单”之间的权衡:

  • α 小→ 更看重拟合 → 倾向选择更大、更复杂的树
  • α 大→ 更看重简化 → 倾向选择更小、更便捷的树
  • α = 0→ 完全不考虑复杂度,只追求把训练数据分得更准确

所以,:在给定 α 的情况下,找到使损失函数就是剪枝的目标就Cα(T)C_\alpha(T)Cα(T)最小的那棵子树。树越大,拟合通常更好但复杂度高;树越小,简单但可能拟合不足。损失函数正是用来在两者之间做平衡的。

☘️剪枝算法步骤

输入:由生成算法得到的完整决策树TTT ,以及参数 α\alphaα
输出:剪枝后的子树TαT_\alphaTα

(1) 计算每个结点的经验熵。
这是为了后续计算每个子树的损失函数做准备。

否需要剪枝。就是(2) 从底向上检查
也就是从叶结点开始往上回缩。

在这里插入图片描述

假设某一组叶结点在剪枝前的整棵树为TBT_BTB,剪枝后(父结点变成叶结点)的树为TAT_ATA
分别计算它们的损失函数:

  • Cα(TB)C_\alpha(T_B)Cα(TB):不剪枝的情况
  • Cα(TA)C_\alpha(T_A)Cα(TA):剪枝后的情况

若是满足条件:

Cα(TA)≤Cα(TB) C_\alpha(T_A) \le C_\alpha(T_B)Cα(TA)Cα(TB)

说明剪枝后更优(损失更小),那么就把父结点变成一个新的叶子,也就是执行剪枝。

(3) 重复上述过程,直到无法再剪。
最终得到损失函数最小的子树TαT_\alphaTα


5.5 CART算法

CART 是机器学习中的经典算法,全称为Classification and Regression Tree,即分类与回归树。它应用树状结构来处理两类任务:

  • 输出是离散值→ 这是一个分类问题
  • 输出是连续值→ 这是一个回归问题

CART 的整体流程可以理解为“三步走”:

  1. 选择特征
    根据材料挑选最能分裂样本的特征。

  2. 生成决策树
    按照特征不断分裂材料,长出一棵完整的树。

  3. 剪枝
    对生成的树进行简化,去掉不必要的分支,以防过拟合。

5.5.1 CART生成

决策树的生成就是递归地构建二叉决策树的过程。对回归树用平方误差最小化准则,对分类树用基尼指数(Gini index)最小化准则,进行特征选择,生成二叉树。

在这里插入图片描述

1. 回归树的生成

在这里插入图片描述

假设输入变量为XXX,输出变量为YYY,并且 YYY是连续变量。给定训练数据集:

D=(x1,y1),(x2,y2),…,(xN,yN) D = {(x_1,y_1),(x_2,y_2),\ldots,(x_N,y_N)}D=(x1,y1),(x2,y2),,(xN,yN)

我们的目标是根据信息生成一棵回归树,用于预测连续输出。可以把回归树理解为:

把输入空间划分成多个区域,每个区域对应一个固定的预测值。

假设输入空间被划成MMM个互不重叠的区域:

R1,R2,…,RM R_1, R_2,\ldots,R_MR1,R2,,RM

并且每个区域都有一个固定输出值cmc_mcm。那么回归树最终的模型就可以写成:

f(x)=∑m=1McmI(x∈Rm) f(x)=\sum_{m=1}^M c_m I(x\in R_m)f(x)=m=1McmI(xRm)

其中 I(⋅)I(\cdot)I()是指示函数:当xxx 落在区域 RmR_mRm中时取1,否则取0。

最优区域输出值的确定

区域划分已经确定的情况下,我们希望让预测误差最小。采用平方误差:

∑xi∈Rm(yi−f(xi))2 \sum_{x_i\in R_m}(y_i - f(x_i))^2xiRm(yif(xi))2

该区域内所有样本的平均值:就是这个式子等价于:每个区域的最优输出值就

c^m=ave⁡(yi∣xi∈Rm) \hat c_m = \operatorname{ave}(y_i \mid x_i\in R_m)c^m=ave(yixiRm)

也就是说:区域内的所有点输出一个平均值,就是最好的常数预测。

如何划分输入空间?(回归树的关键步骤)

回归树利用“二分法”划分输入空间。

做法如下:

对每一个输入变量x(j)x^{(j)}x(j)(即第 jjj个特征),以及它可能的取值sss,把输入空间分成两个区域:

R1(j,s)=x∣x(j)≤s,R2(j,s)=x∣x(j)>s R_1(j,s)={x \mid x^{(j)}\le s},\quad R_2(j,s)={x \mid x^{(j)}>s}R1(j,s)=xx(j)s,R2(j,s)=xx(j)>s

继而我们寻找“最好的”特征jjj 和切分点 sss。具体做法:

min⁡j,s[min⁡c1∑xi∈R1(j,s)(yi−c1)2+min⁡c2∑xi∈R2(j,s)(yi−c2)2] \min_{j,s}\left[ \min_{c_1}\sum_{x_i\in R_1(j,s)}(y_i - c_1)^2 + \min_{c_2}\sum_{x_i\in R_2(j,s)}(y_i - c_2)^2 \right]j,sminc1minxiR1(j,s)(yic1)2+c2minxiR2(j,s)(yic2)2

其中两个区域的最优输出仍然是平均值:

c1=ave⁡(yi∣xi∈R1(j,s)) c_1=\operatorname{ave}(y_i\mid x_i\in R_1(j,s))c1=ave(yixiR1(j,s))
c2=ave⁡(yi∣xi∈R2(j,s)) c_2=\operatorname{ave}(y_i\mid x_i\in R_2(j,s))c2=ave(yixiR2(j,s))

于是对于每个特征、每个可能的切分点,只要计算上述误差并取最小即可。最后得到那个让误差最小的j,sj, sj,s最优划分方式。就是,就

找到最优划分后,把输入空间分成两部分,并继续对两个子区域重复上述步骤:

  • 在每个子区域内继续寻找最佳特征与最佳切分点
  • 二分 → 再二分 → 再二分
  • 直到满足停止条件(区域足够纯、样本足够少、误差足够小……)

最终得到的结构就是一棵完整的回归树,也叫:最小二乘回归树

⭐️CART最小二乘回归树生成算法

输入: 训练数据集 DDD

输出: 回归树 f(x)f(x)f(x)

Step 1:在所有特征和所有可能切分点中寻找最优划分

求解:

min⁡j,s[min⁡c1∑xi∈R1(j,s)(yi−c1)2+min⁡c2∑xi∈R2(j,s)(yi−c2)2] \min_{j,s} \left[ \min_{c_1}\sum_{x_i\in R_1(j,s)}(y_i - c_1)^2 + \min_{c_2}\sum_{x_i\in R_2(j,s)}(y_i - c_2)^2 \right]j,sminc1minxiR1(j,s)(yic1)2+c2minxiR2(j,s)(yic2)2

根据固定特征jjj,遍历所有切分点sss,找到最优的组合(j,s)(j,s)(j,s)

Step 2:用最优的 (j,s) 划分区域,并求区域输出值

R1(j,s)=x∣x(j)≤s,R2(j,s)=x∣x(j)>s R_1(j,s)={x \mid x^{(j)}\le s},\qquad R_2(j,s)={x \mid x^{(j)}>s}R1(j,s)=xx(j)s,R2(j,s)=xx(j)>s

区域输出为:

c^m=1∣Rm∣∑xi∈Rmyi,m=1,2 \hat c_m = \frac{1}{|R_m|}\sum_{x_i \in R_m} y_i,\quad m=1,2c^m=Rm1xiRmyi,m=1,2

Step 3:对子区域重复执行步骤 (1)(2)

不断递归,直到满足预设停止条件(例如:样本太少或误差足够小)。

Step 4:最终将输入空间划分为多个区域

得到区域 R1,R2,…,RMR_1,R_2,\ldots,R_MR1,R2,,RM,并形成最终回归树:

f(x)=∑m=1Mc^mI(x∈Rm) f(x)=\sum_{m=1}^{M} \hat c_m I(x\in R_m)f(x)=m=1Mc^mI(xRm)


2. 分类树的生成

在这里插入图片描述

核心思想:CART算法启用基尼指数选择最优特征,同时决定该特征的最优二值切分点。

在生成一棵决策树时,第一步永远是:选特征
不同算法的选特征方式不同:

  • ID3:看谁的信息增益最大

  • C4.5:看谁的信息增益比最大

  • CART:看谁的基尼指数最小

基尼指数定义

在分类问题中,假设有K个类,样本点属于第k类的概率为pkp_kpk,则概率分布的基尼指数定义为:

Gini(p)=∑k=1Kpk(1−pk)=1−∑k=1Kpk2\text{Gini}(p) = \sum_{k=1}^{K} p_k(1-p_k) = 1 - \sum_{k=1}^{K} p_k^2Gini(p)=k=1Kpk(1pk)=1k=1Kpk2

二分类时更简单,若是第一类的概率为ppp,则:

Gini(p)=2p(1−p)\text{Gini}(p) = 2p(1-p)Gini(p)=2p(1p)

给定一个样本集合DDD,它的基尼指数为:

Gini(D)=1−∑k=1K(∣Ck∣∣D∣)2\text{Gini}(D) = 1 - \sum_{k=1}^{K} \left(\frac{|C_k|}{|D|}\right)^2Gini(D)=1k=1K(DCk)2

这里,CkC_kCk是D中属于第k类的样本子集,K是类的个数。

基尼指数越大,集合越“杂乱”;越小,集合越“纯净”。

特征条件下的基尼指数

当特征 AAA 取某个值 aaa 时,将集合 DDD划分成两部分:

D1={(x,y)∈D∣A(x)=a},D2=D−D1D_1 = \{(x,y) \in D | A(x) = a\}, \quad D_2 = D - D_1D1={(x,y)DA(x)=a},D2=DD1

分割后的不确定性为:

Gini(D,A)=∣D1∣∣D∣Gini(D1)+∣D2∣∣D∣Gini(D2)\text{Gini}(D, A) = \frac{|D_1|}{|D|}\text{Gini}(D_1) + \frac{|D_2|}{|D|}\text{Gini}(D_2)Gini(D,A)=DD1Gini(D1)+DD2Gini(D2)

CART 就是依据对所有特征、所有可能切分点计算这个量,选择最小的那个。基尼指数值越大,样本集合的不确定性也就越大,这一点与熵相似。

⭐️CART分类树生成算法

输入:数据集 DDD,特征集 AAA,停止条件阈值εεε

输出:CART分类决策树

Step 1 从根节点出发,构建二叉树

Step 2 选择最优特征 + 最优切分点(CART 的关键)

对于特征集 AAA中的每个特征

  1. 枚举其所有可能的取值
  2. 每取一个值 aaa,将数据集切分为D1D_1D1D2D_2D2
  3. 计算对应的 Gini(D,A)Gini(D,A)Gini(D,A)
  4. 找到该特征下的最优切分点(基尼指数最小)

最后,再从所有特征中选出

  • 最优特征 = 基尼指数最小的特征
  • 最优切分点 = 对应的最优二值划分

CART 的第一步——借助基尼指数做完特征选择。就是这就

Step 3 按最优切分点将资料集二分,生成左右子节点

数据更“干净”的那一边会更快变成叶结点。

Step 4 对子节点递归重复步骤 2–3

直到满足停止条件:

  • 基尼指数已经很小,样本几乎属于同一类
  • 或者没有可分的特征了

到这里,一棵完整的 CART 分类树就生成了。

5.5.2 CART剪枝

决策树容易过拟合,剪枝是解决这个挑战的关键技术。CART使用代价复杂度剪枝(Cost-Complexity Pruning),通过平衡模型复杂度和预测准确度来获得最优决策树。

1. 损失函数

CART剪枝的核心是损失函数,它用来衡量模型的整体性能:

Cα=C(T)+α∣T∣C_\alpha = C(T) + \alpha|T|Cα=C(T)+αT

这个公式包含两个部分:

  • C(T)C(T)C(T):反映模型的拟合能力,表示对训练数据的预测误差(比如基尼指数)
  • ∣T∣|T|T:反映模型的复杂度,表示树上叶子节点的个数。叶子结点越多,模型越困难

α\alphaα 的作用:

  • α=0\alpha = 0α=0时,模型仅由拟合决定,不考虑对未知数据的预测能力,得到的是一棵最完整的决策树,泛化能力弱
  • α=+∞\alpha = +\inftyα=+时,得到的是单结点树,对于任何资料的泛化能力很强,但拟合效果差

☘️原理:否剪枝。剪枝后,如果损失函数减小,则意味着可以剪枝。就是根据剪枝前后的损失函数来决定

2. 参数选择

如何选择合适的α\alphaα 呢?我们将 α\alphaα 从 0 到 +∞+\infty+划分成多个小区间:

0≤α0<α1<α2⋯<αn<αn+1<+∞0 \leq \alpha_0 < \alpha_1 < \alpha_2 \cdots < \alpha_n < \alpha_{n+1} < +\infty0α0<α1<α2<αn<αn+1<+

每一个 α\alphaα对应一棵决策树。然后把这些α\alphaα按照"左闭右开"的形式划分小区间:

[α1,α2),[α2,α3),⋯[αn,αn+1)[\alpha_1, \alpha_2), [\alpha_2, \alpha_3), \cdots [\alpha_n, \alpha_{n+1})[α1,α2),[α2,α3),[αn,αn+1)

总共有 nnn个区间,每个小区间都对应着一个决策树,我们可以记成:

T0,T1,T2,⋯TnT_0, T_1, T_2, \cdots T_nT0,T1,T2,Tn

这里 T0T_0T0 代表 α=0\alpha = 0α=0时的完整决策树,意味着没有剪枝。

核心思想:我们要从这些决策树里,找到最优的决策树。

假设现在我们有这么一棵子树TiT_iTi

剪枝前的损失函数可能写成:

Cα(Tt)=C(Tt)+α∣Tt∣C_\alpha(T_t) = C(T_t) + \alpha|T_t|Cα(Tt)=C(Tt)+αTt

剪枝后变成了一个叶子结点,此时∣T∣=1|T| = 1T=1通过,损失函数能够写成:

Cα(Tt)=C(t)+αC_\alpha(T_t) = C(t) + \alphaCα(Tt)=C(t)+α

随着 α\alphaα从 0 逐渐变大到+∞+\infty+,意味着从高度拟合到高度泛化的变化趋势。允许得出在高度拟合和高度泛化时,所对应的损失函数都是非常大的。

而在这变化过程中,意味着剪枝前和剪枝后的会有一个临界值α\alphaα,在这个临界值处,拟合泛化的损失函数为最小。

这个值能够联立两个方程求解:

α=Cα(Tt)−C(t)\alpha = C_\alpha(T_t) - C(t)α=Cα(Tt)C(t)
=C(Tt)+α∣Tt∣−C(t)= C(T_t) + \alpha|T_t| - C(t)=C(Tt)+αTtC(t)

移项后:

α=C(t)−C(Tt)∣Tt∣−1\alpha = \frac{C(t) - C(T_t)}{|T_t| - 1}α=Tt1C(t)C(Tt)

接着我们就来看看该值该怎么用。

3. 剪枝步骤

输入:CART算法生成的完整决策树
输出: 最优决策树 TαT_\alphaTα

Step1 设k=0,T=T0k = 0, T = T_0k=0,T=T0,也就是从完整的决策树出发

kkk完整的,从这里开始出发。就是代表的是迭代的次数,这里从 0 开始,也就意味着还没开始迭代,那么树也

Step2 设α=+∞\alpha = +\inftyα=+,因为后面我们要比较大小,当损失函数小的时候可以剪枝

相当于由大至小开始比较。

Step3 自下而上的对各内部结点ttt 计算 C(Tt),∣Tt∣C(T_t), |T_t|C(Tt),Tt,以及

g(t)=C(t)−C(Tt)∣Tt∣−1,α=min(α,g(t))g(t) = \frac{C(t) - C(T_t)}{|T_t| - 1}, \quad \alpha = min(\alpha, g(t))g(t)=Tt1C(t)C(Tt),α=min(α,g(t))

这里的 g(t)g(t)g(t)代表了在这个结点对应的α\alphaα 值。

  • C(t)C(t)C(t)代表了单结点时的预测误差
  • C(Tt)C(T_t)C(Tt)代表了子树时的预测误差

注意:通过此处的预测误差与我们之前所介绍的预测错误率不同,它还能够包括平方损失、基尼指数等。

Step4 自上而下访问内部结点ttt,如果有 g(t)=αg(t) = \alphag(t)=α,则进行剪枝,并对叶结点ttt以多数表决法决定类,得到树TTT

Step5 接着增加迭代次数,继续调用,最终采用交叉验证法在子树T0,T1,T2,⋯TnT_0, T_1, T_2, \cdots T_nT0,T1,T2,Tn中选取最优子树TαT_\alphaTα


本章概要

  1. 分类决策树是基于特征对实例进行分类的树形结构,可转换为if-then规则集合,表示特征空间划分上的类条件概率分布。

  2. 决策树学习旨在构建一个与训练数据拟合好且复杂度小的决策树。直接选取最优决策树是NP完全问题,现实采用启发式方法学习次优决策树。决策树学习包括三部分:特征选择决策树的生成决策树的剪枝。常用算法有ID3、C4.5和CART。

  3. 特征选择准则:

    (1) 信息增益 (ID3)

    g(D,A)=H(D)−H(D∣A)g(D, A) = H(D) - H(D|A)g(D,A)=H(D)H(DA)

    H(D)=−∑k=1K∣Ck∣∣D∣log⁡2∣Ck∣∣D∣H(D) = -\sum_{k=1}^{K} \frac{|C_k|}{|D|} \log_2 \frac{|C_k|}{|D|}H(D)=k=1KDCklog2DCk

    H(D∣A)=∑i=1n∣Di∣∣D∣H(Di)H(D|A) = \sum_{i=1}^{n} \frac{|D_i|}{|D|} H(D_i)H(DA)=i=1nDDiH(Di)

    (2) 信息增益比 (C4.5)

    gR(D,A)=g(D,A)HA(D)g_R(D, A) = \frac{g(D, A)}{H_A(D)}gR(D,A)=HA(D)g(D,A)

    (3) 基尼指数 (CART)

    Gini(D)=1−∑k=1K(∣Ck∣∣D∣)2\text{Gini}(D) = 1 - \sum_{k=1}^{K} \left(\frac{|C_k|}{|D|}\right)^2Gini(D)=1k=1K(DCk)2

    Gini(D,A)=∣D1∣∣D∣Gini(D1)+∣D2∣∣D∣Gini(D2)\text{Gini}(D, A) = \frac{|D_1|}{|D|}\text{Gini}(D_1) + \frac{|D_2|}{|D|}\text{Gini}(D_2)Gini(D,A)=DD1Gini(D1)+DD2Gini(D2)

  4. 决策树的生成。从根节点开始,经过计算信息增益等指标递归选择最优特征进行分裂,将训练集分割为能够基本正确分类的子集。

  5. 决策树的剪枝。生成的决策树存在过拟合难题,要求剪枝简化。从已生成的树上剪掉一些叶结点或叶结点以上的子树,将其父结点或根结点作为新的叶结点,从而简化决策树。

posted @ 2026-01-04 09:44  yangykaifa  阅读(11)  评论(0)    收藏  举报