模式识别与机器学习课程笔记(9):决策树

模式识别与机器学习课程笔记(9):决策树

概述

决策树是一种可解释性极强的监督学习模型,其核心思想是“分而治之”——通过模拟人类决策过程,将复杂的分类/回归问题拆解为一系列简单的二元或多元判断,最终输出结果。它的结构类似一棵倒置的树,无需依赖特征标准化,既能处理离散型数据,也能适配连续型数据,是工业界(如风控、推荐系统)中常用的基础模型之一。

1.1 决策树的基本结构

决策树由三类节点和边组成,各部分功能明确:

  • 根节点:代表整个样本集,是决策树的起点,仅包含一条出边;
  • 内部节点:对应“特征判断”(如“年龄是否>30岁”“收入是否≥50k”),每个内部节点有多个出边,每条边代表一个判断结果;
  • 叶节点:代表最终的分类结果(分类树)或回归预测值(回归树),无出边;
  • :连接父节点与子节点,标注父节点特征的判断条件(如“是”“否”“[0,20)”)。

例如,“是否购买某商品”的决策树可表示为:根节点(所有用户)→ 内部节点1(收入≥50k?)→ 内部节点2(年龄≤35?)→ 叶节点(购买/不购买)。

1.2 决策树的核心优势

相比SVM、神经网络等“黑箱模型”,决策树的优势极为突出:

  1. 可解释性强:决策过程完全透明,能清晰输出“为什么做出该判断”(如“因收入≥50k且年龄≤35,判定为购买用户”);
  2. 数据要求低:无需对特征做标准化/归一化,可直接处理离散型和连续型混合数据;
  3. 训练效率高:基于贪心策略构建,不依赖复杂矩阵运算,适合中小规模数据集;
  4. 泛化能力基础好:通过剪枝或集成(如随机森林)可有效降低过拟合风险。

1.3 决策树的核心问题

构建决策树的关键在于解决两个核心问题:

  1. 特征选择:每次分裂时,选择哪个特征能让“数据纯度提升最大”(如分类树用信息熵、Gini系数,回归树用平方误差);
  2. 剪枝:避免决策树过度复杂(如深度过深)导致过拟合,分为“预剪枝”(提前停止分裂)和“后剪枝”(先构建完整树再删除冗余分支)。

一、ID3和C4.5算法

ID3(Iterative Dichotomiser 3)是最早的决策树算法之一,核心用信息增益选择特征;C4.5是ID3的改进版,通过信息增益比解决ID3偏向多值特征的问题,同时支持连续值、缺失值处理和剪枝,是更实用的分类决策树算法。

1.1 ID3算法:基于信息增益的特征选择

ID3仅适用于离散型特征的分类任务,其核心逻辑是“每次分裂时,选择信息增益最大的特征”——信息增益越大,分裂后数据的不确定性(熵)降低越多,数据纯度越高。

1.1.1 关键概念:信息熵与信息增益

要理解信息增益,需先掌握“信息熵”和“条件熵”:

  • 信息熵(Entropy):衡量数据的不确定性,熵越大,数据越混乱(纯度越低)。对样本集 D D D,若类别数为 K K K,第 k k k类样本占比为 p k = ∣ D k ∣ ∣ D ∣ p_k = \frac{|D_k|}{|D|} pk=DDk,则信息熵为:
    H ( D ) = − ∑ k = 1 K p k log ⁡ 2 p k H(D) = -\sum_{k=1}^K p_k \log_2 p_k H(D)=k=1Kpklog2pk
    特殊情况:若所有样本属于同一类( p 1 = 1 p_1=1 p1=1),则 H ( D ) = 0 H(D)=0 H(D)=0(完全确定);若两类样本各占50%( p 1 = p 2 = 0.5 p_1=p_2=0.5 p1=p2=0.5),则 H ( D ) = 1 H(D)=1 H(D)=1(最不确定)。

  • 条件熵(Conditional Entropy):已知某特征 A A A的取值后,样本集 D D D的不确定性。若特征 A A A V V V个取值 { a 1 , a 2 , . . . , a V } \{a_1,a_2,...,a_V\} {a1,a2,...,aV} D v D_v Dv D D D中特征 A A A a v a_v av的样本子集,则条件熵为:
    H ( D ∣ A ) = ∑ v = 1 V ∣ D v ∣ ∣ D ∣ H ( D v ) H(D|A) = \sum_{v=1}^V \frac{|D_v|}{|D|} H(D_v) H(DA)=v=1VDDvH(Dv)

  • 信息增益(Information Gain):特征 A A A分裂后,信息熵的减少量,即“不确定性降低的程度”:
    G ( D , A ) = H ( D ) − H ( D ∣ A ) G(D,A) = H(D) - H(D|A) G(D,A)=H(D)H(DA)
    信息增益 G ( D , A ) G(D,A) G(D,A)越大,说明特征 A A A对降低数据不确定性的贡献越大,越适合作为当前分裂特征。

1.1.2 ID3算法步骤(实例辅助)

以“天气与是否打球”的数据集(表1)为例,说明ID3的分裂过程:

样本序号天气(A1)温度(A2)是否打球(类别)
1
2
3
4
5
6
7

步骤1:计算根节点的信息熵 H ( D ) H(D) H(D)
样本集 D D D共7个样本,“是”(5个)占比 p 1 = 5 / 7 p_1=5/7 p1=5/7,“否”(2个)占比 p 2 = 2 / 7 p_2=2/7 p2=2/7
H ( D ) = − 5 7 log ⁡ 2 5 7 − 2 7 log ⁡ 2 2 7 ≈ 0.863 H(D) = -\frac{5}{7}\log_2\frac{5}{7} - \frac{2}{7}\log_2\frac{2}{7} \approx 0.863 H(D)=75log27572log2720.863

步骤2:计算各特征的信息增益

  • 特征A1(天气):取值为“晴”(2个样本,均为“否”)、“阴”(2个样本,均为“是”)、“雨”(3个样本,2个“是”1个“否”):
    H ( D ∣ A 1 ) = 2 7 H ( D 晴 ) + 2 7 H ( D 阴 ) + 3 7 H ( D 雨 ) H(D|A1) = \frac{2}{7}H(D_{晴}) + \frac{2}{7}H(D_{阴}) + \frac{3}{7}H(D_{雨}) H(DA1)=72H(D)+72H(D)+73H(D)
    其中 H ( D 晴 ) = 0 H(D_{晴})=0 H(D)=0(全“否”), H ( D 阴 ) = 0 H(D_{阴})=0 H(D)=0(全“是”), H ( D 雨 ) = − 2 3 log ⁡ 2 2 3 − 1 3 log ⁡ 2 1 3 ≈ 0.918 H(D_{雨})=-\frac{2}{3}\log_2\frac{2}{3} - \frac{1}{3}\log_2\frac{1}{3} \approx 0.918 H(D)=32log23231log2310.918,代入得:
    H ( D ∣ A 1 ) ≈ 2 7 × 0 + 2 7 × 0 + 3 7 × 0.918 ≈ 0.394 H(D|A1) \approx \frac{2}{7} \times 0 + \frac{2}{7} \times 0 + \frac{3}{7} \times 0.918 \approx 0.394 H(DA1)72×0+72×0+73×0.9180.394
    信息增益 G ( D , A 1 ) = 0.863 − 0.394 = 0.469 G(D,A1) = 0.863 - 0.394 = 0.469 G(D,A1)=0.8630.394=0.469

  • 同理计算特征A2(温度)的信息增益,最终会发现 G ( D , A 1 ) > G ( D , A 2 ) G(D,A1) > G(D,A2) G(D,A1)>G(D,A2),因此选择“天气”作为根节点的分裂特征。

步骤3:递归分裂子节点
对“天气=晴”“天气=阴”“天气=雨”三个子节点,重复步骤1-2:

  • “天气=晴”和“天气=阴”的子节点已纯(全“否”或全“是”),成为叶节点;
  • “天气=雨”的子节点仍有混合类别,继续选择下一个信息增益最大的特征(如“温度”)分裂,直到所有子节点纯或无特征可分。

步骤4:停止分裂
当满足以下任一条件时停止分裂:

  1. 当前节点的所有样本属于同一类别(纯度为1);
  2. 无剩余特征可用于分裂;
  3. 当前节点样本数过少(避免过拟合)。
1.1.3 ID3的局限性

ID3的缺陷明显,限制了其适用场景:

  1. 偏向多值特征:若存在“样本ID”这类多值特征(每个取值对应1个样本),其信息增益会最大(分裂后每个子节点均纯),但无实际意义;
  2. 不支持连续型特征:需手动将连续特征离散化(如将“年龄”分为“<20”“20-30”“>30”),过程繁琐且易丢失信息;
  3. 不支持缺失值:若样本某特征值缺失,需丢弃该样本或填充默认值,影响数据利用率;
  4. 易过拟合:不支持剪枝,构建的树易过深,对训练集以外的数据泛化能力差。

1.2 C4.5算法:ID3的改进与优化

C4.5针对ID3的局限性做了四大核心改进,使其成为更通用的分类决策树算法。

1.2.1 核心改进:用信息增益比替代信息增益

为解决“偏向多值特征”的问题,C4.5引入信息增益比(Gain Ratio),通过“特征固有值”惩罚多值特征:

  • 特征固有值(Intrinsic Value):衡量特征取值的分散程度,取值越多,固有值越大:
    I V ( A ) = − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ log ⁡ 2 ∣ D v ∣ ∣ D ∣ IV(A) = -\sum_{v=1}^V \frac{|D_v|}{|D|} \log_2 \frac{|D_v|}{|D|} IV(A)=v=1VDDvlog2DDv
  • 信息增益比:信息增益与特征固有值的比值:
    G R ( D , A ) = G ( D , A ) I V ( A ) GR(D,A) = \frac{G(D,A)}{IV(A)} GR(D,A)=IV(A)G(D,A)
    逻辑:多值特征的 I V ( A ) IV(A) IV(A)大,即使 G ( D , A ) G(D,A) G(D,A)大, G R ( D , A ) GR(D,A) GR(D,A)也可能较小,从而避免优先选择无意义的多值特征。
1.2.2 其他关键改进
  1. 支持连续型特征
    对连续特征 A A A,先将其取值排序,选择所有相邻值的中点作为候选分裂点(如“年龄”排序后候选点为“25.5”“30.5”等),计算每个候选点的信息增益比,选择最优分裂点(分裂后样本分为“≤分裂点”和“>分裂点”两类)。

  2. 支持缺失值处理

    • 计算特征增益比时,用“无缺失值样本的占比”加权(如某样本特征 A A A缺失,不参与 A A A的增益比计算,但参与其他特征的计算);
    • 分配缺失值样本时,按子节点样本占比将其“分配到所有子节点”(如“天气=雨”的子节点占3/7,缺失天气的样本有70%分配到该子节点)。
  3. 支持剪枝
    C4.5采用后剪枝(Pruning After Construction):

    • 先构建完整的决策树;
    • 从叶节点向上,对每个内部节点,计算“剪枝后子树的误差”与“不剪枝的误差”;
    • 若剪枝后误差更小或相等(泛化能力更强),则剪枝该节点(将其变为叶节点)。
1.2.3 C4.5的局限性

C4.5虽解决了ID3的核心问题,但仍有不足:

  1. 仅适用于分类任务:无法处理回归问题(如预测房价、销量);
  2. 计算复杂度高:信息增益比、连续值分裂点选择均需大量计算,不适合大规模数据集;
  3. 生成多叉树:内部节点可对应多个特征取值(如“天气=晴/阴/雨”),后续集成学习(如随机森林)需二叉树结构时需额外调整。

二、分类与回归树(CART)

CART(Classification and Regression Tree)是一种既能分类也能回归的二叉决策树,通过“二分分裂”(每个内部节点仅分为两个子节点)简化结构,分类用Gini系数选择特征,回归用平方误差选择特征,同时支持剪枝,是目前工业界应用最广的决策树算法之一。

2.1 CART的核心特点

与ID3/C4.5相比,CART的核心差异的在于:

  1. 结构:二叉树:无论特征是离散型还是连续型,每个内部节点均分裂为两个子节点(如“天气=晴”和“天气≠晴”,“年龄≤30”和“年龄>30”);
  2. 任务:分类+回归:分类树用Gini系数衡量纯度,回归树用平方误差衡量拟合程度;
  3. 剪枝:成本复杂度剪枝:通过“成本复杂度”平衡树的复杂度与误差,比C4.5的后剪枝更高效。

2.2 分类树CART:基于Gini系数的特征选择

分类树CART的目标是“选择Gini系数最小的特征分裂”——Gini系数衡量数据的“不纯度”,值越小,数据纯度越高(类比信息熵,计算更简单,无需对数运算)。

2.2.1 Gini系数的定义

对样本集 D D D(类别数 K K K),第 k k k类样本占比 p k p_k pk,则Gini系数为:
Gini ( D ) = 1 − ∑ k = 1 K p k 2 \text{Gini}(D) = 1 - \sum_{k=1}^K p_k^2 Gini(D)=1k=1Kpk2

  • 特殊情况:若所有样本属于同一类( p 1 = 1 p_1=1 p1=1),则 Gini ( D ) = 0 \text{Gini}(D)=0 Gini(D)=0(完全纯);若两类样本各占50%( p 1 = p 2 = 0.5 p_1=p_2=0.5 p1=p2=0.5),则 Gini ( D ) = 0.5 \text{Gini}(D)=0.5 Gini(D)=0.5(最不纯)。

对特征 A A A(分裂后分为 D 1 D_1 D1 D 2 D_2 D2两个子节点),则分裂后的Gini系数(加权平均)为:
Gini ( D , A ) = ∣ D 1 ∣ ∣ D ∣ Gini ( D 1 ) + ∣ D 2 ∣ ∣ D ∣ Gini ( D 2 ) \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分类树选择“分裂后Gini系数最小”的特征与分裂点。

2.2.2 分类树分裂实例

仍用“天气与是否打球”数据集,计算“天气”特征的Gini系数:

  • 分裂为“天气=晴”( D 1 D_1 D1:2个“否”)和“天气≠晴”( D 2 D_2 D2:2个“是”+3个样本(1“是”1“否”)):
    Gini ( D 1 ) = 1 − ( 1 2 + 0 2 ) = 0 \text{Gini}(D_1) = 1 - (1^2 + 0^2) = 0 Gini(D1)=1(12+02)=0
    Gini ( D 2 ) = 1 − ( 3 5 ) 2 − ( 2 5 ) 2 = 1 − 0.36 − 0.16 = 0.48 \text{Gini}(D_2) = 1 - (\frac{3}{5})^2 - (\frac{2}{5})^2 = 1 - 0.36 - 0.16 = 0.48 Gini(D2)=1(53)2(52)2=10.360.16=0.48
    Gini ( D , 天气 ) = 2 7 × 0 + 5 7 × 0.48 ≈ 0.343 \text{Gini}(D,天气) = \frac{2}{7} \times 0 + \frac{5}{7} \times 0.48 \approx 0.343 Gini(D,天气)=72×0+75×0.480.343
  • 对比其他特征(如“温度”)的Gini系数,选择最小的特征分裂。

2.3 回归树CART:基于平方误差的特征选择

回归树CART的目标是“选择平方误差最小的特征分裂”——平方误差衡量子节点样本的“拟合程度”,值越小,子节点样本的预测值越接近真实值。

2.3.1 平方误差的定义

对样本集 D D D(每个样本的真实值为 y i y_i yi),回归树的叶节点预测值为“子节点样本的均值”(如 D 1 D_1 D1的预测值 y ^ 1 = 1 ∣ D 1 ∣ ∑ i ∈ D 1 y i \hat{y}_1 = \frac{1}{|D_1|}\sum_{i \in D_1} y_i y^1=D11iD1yi)。

样本集 D D D的平方误差(SSE)为:
SSE ( D ) = ∑ i ∈ D ( y i − y ^ ) 2 \text{SSE}(D) = \sum_{i \in D} (y_i - \hat{y})^2 SSE(D)=iD(yiy^)2
其中 y ^ \hat{y} y^ D D D的预测值( D D D的样本均值)。

对特征 A A A(分裂后分为 D 1 D_1 D1 D 2 D_2 D2),分裂后的平方误差为:
SSE ( D , A ) = SSE ( D 1 ) + SSE ( D 2 ) \text{SSE}(D,A) = \text{SSE}(D_1) + \text{SSE}(D_2) SSE(D,A)=SSE(D1)+SSE(D2)
CART回归树选择“分裂后SSE最小”的特征与分裂点。

2.3.2 回归树分裂实例

以“房屋面积与房价”数据集(表2)为例,说明回归树的分裂:

样本序号面积(㎡)房价(万元)
15080
270120
390150
4110200
5130250

步骤1:计算根节点的SSE
根节点预测值 y ^ = 80 + 120 + 150 + 200 + 250 5 = 160 \hat{y} = \frac{80+120+150+200+250}{5} = 160 y^=580+120+150+200+250=160,SSE为:
SSE ( D ) = ( 80 − 160 ) 2 + ( 120 − 160 ) 2 + ( 150 − 160 ) 2 + ( 200 − 160 ) 2 + ( 250 − 160 ) 2 = 18600 \text{SSE}(D) = (80-160)^2 + (120-160)^2 + (150-160)^2 + (200-160)^2 + (250-160)^2 = 18600 SSE(D)=(80160)2+(120160)2+(150160)2+(200160)2+(250160)2=18600

步骤2:选择“面积”的分裂点
候选分裂点为“60、80、100、120”(相邻面积的中点),以分裂点“100”为例(分为 D 1 D_1 D1:面积≤100, D 2 D_2 D2:面积>100):

  • D 1 D_1 D1预测值 y ^ 1 = 80 + 120 + 150 3 = 116.67 \hat{y}_1 = \frac{80+120+150}{3} = 116.67 y^1=380+120+150=116.67 SSE ( D 1 ) = ( 80 − 116.67 ) 2 + ( 120 − 116.67 ) 2 + ( 150 − 116.67 ) 2 ≈ 2566.67 \text{SSE}(D_1) = (80-116.67)^2 + (120-116.67)^2 + (150-116.67)^2 \approx 2566.67 SSE(D1)=(80116.67)2+(120116.67)2+(150116.67)22566.67
  • D 2 D_2 D2预测值 y ^ 2 = 200 + 250 2 = 225 \hat{y}_2 = \frac{200+250}{2} = 225 y^2=2200+250=225 SSE ( D 2 ) = ( 200 − 225 ) 2 + ( 250 − 225 ) 2 = 1250 \text{SSE}(D_2) = (200-225)^2 + (250-225)^2 = 1250 SSE(D2)=(200225)2+(250225)2=1250
  • 分裂后SSE = 2566.67 + 1250 = 3816.67,远小于根节点的18600,因此“100”是优质分裂点。

2.4 CART的剪枝:成本复杂度剪枝

CART采用成本复杂度剪枝(Cost-Complexity Pruning),核心是在“树的误差”与“树的复杂度”之间找平衡,定义“成本复杂度函数”:
C α ( T ) = C ( T ) + α ⋅ ∣ T ∣ C_\alpha(T) = C(T) + \alpha \cdot |T| Cα(T)=C(T)+αT

  • C ( T ) C(T) C(T):树 T T T的训练误差(分类树用错分率,回归树用SSE);
  • ∣ T ∣ |T| T:树 T T T的叶节点数(衡量复杂度,叶节点越多,树越复杂);
  • α ≥ 0 \alpha \geq 0 α0:复杂度参数( α \alpha α越大,对复杂度的惩罚越重,树越简单)。

剪枝步骤:

  1. 构建完整的CART树 T 0 T_0 T0
  2. T 0 T_0 T0的每个内部节点,计算“剪枝后子树 T ′ T' T C α ( T ′ ) C_\alpha(T') Cα(T)”与“原子树 T T T C α ( T ) C_\alpha(T) Cα(T)”;
  3. 选择“ C α ( T ′ ) C_\alpha(T') Cα(T)最小且小于 C α ( T ) C_\alpha(T) Cα(T)”的节点剪枝,得到树 T 1 T_1 T1
  4. 重复步骤2-3,生成一系列剪枝树 T 0 , T 1 , . . . , T k T_0, T_1, ..., T_k T0,T1,...,Tk T k T_k Tk为根节点);
  5. 用验证集选择“泛化误差最小”的树作为最终模型。

三、随机森林

随机森林(Random Forest)是基于CART的集成学习模型,属于“Bagging( Bootstrap Aggregating)”方法,核心是“通过多棵决策树的投票/平均降低方差,提升泛化能力”。它继承了决策树的可解释性,同时解决了单棵决策树易过拟合的问题,是工业界常用的“基线模型”之一。

3.1 随机森林的核心思想

随机森林的“随机性”体现在两个层面,正是这种随机性保证了多棵树的“多样性”,从而降低过拟合:

  1. 样本随机(Bootstrap采样):对原始样本集 D D D N N N个样本),每棵树用“有放回抽样”(Bootstrap)抽取 N N N个样本,得到 N N N个Bootstrap样本集 D 1 , D 2 , . . . , D M D_1, D_2, ..., D_M D1,D2,...,DM M M M为树的数量);
  2. 特征随机(随机选择特征子集):每棵树分裂时,从所有 d d d个特征中随机选择 k k k个特征(通常 k = d k = \sqrt{d} k=d ),仅从这 k k k个特征中选择最优分裂特征。

最终预测规则:

  • 分类任务:所有树的预测结果投票,得票最多的类别为最终结果;
  • 回归任务:所有树的预测值取平均,作为最终结果。

3.2 随机森林的构建步骤

以分类任务为例,随机森林的详细构建步骤:

  1. 样本采样:对原始样本集 D D D N N N个样本),执行 M M M次Bootstrap采样,得到 M M M个样本集 D 1 , D 2 , . . . , D M D_1, D_2, ..., D_M D1,D2,...,DM(每个 D i D_i Di N N N个样本,约36.8%的样本未被采样,称为“OOB样本”);
  2. 构建单棵CART树:对每个 D i D_i Di,构建一棵未剪枝的CART分类树:
    • 分裂时,随机选择 k = d k = \sqrt{d} k=d 个特征( d d d为总特征数);
    • 用Gini系数选择最优分裂特征与分裂点,不剪枝(单棵树过拟合,但多棵树投票可抵消);
  3. 生成森林:重复步骤2,生成 M M M棵CART树,组成随机森林;
  4. 预测:对新样本 x x x,每棵树输出预测类别,最终结果为“多数投票”的类别。

3.3 随机森林的关键概念:OOB误差

由于Bootstrap采样是“有放回”的,每棵树都有约36.8%的样本未被采样(OOB样本,Out-of-Bag)。这些OOB样本可作为“天然的验证集”,用于评估随机森林的泛化误差(OOB误差):

  • 对每个OOB样本 x i x_i xi,收集“未采样 x i x_i xi的所有树”对 x i x_i xi的预测结果;
  • 用这些预测结果计算 x i x_i xi的预测误差(分类用错分率,回归用SSE);
  • 所有OOB样本的平均误差即为OOB误差,无需额外划分验证集。

3.4 随机森林的优势与参数选择

3.4.1 核心优势
  1. 泛化能力强:多棵树的多样性降低了单棵树的方差,过拟合风险低;
  2. 鲁棒性强:对异常值、缺失值不敏感(Bootstrap采样和特征随机可稀释异常值影响);
  3. 处理高维数据高效:特征随机选择避免了“维度灾难”,无需特征降维;
  4. 可解释性较好:可计算“特征重要性”(如某特征在所有树中降低Gini系数的总和),解释特征对预测的贡献。
3.4.2 关键参数选择

随机森林的性能主要依赖三个参数,实际应用中可通过网格搜索调优:

  • M M M(树的数量): M M M越大,泛化能力越强,但计算成本越高,通常取100-1000( M M M超过一定值后,性能趋于稳定);
  • k k k(每棵树的特征数):通常取 k = d k = \sqrt{d} k=d (分类任务)或 k = d / 3 k = d/3 k=d/3(回归任务);
  • 单棵树的参数:如最大深度、最小样本分裂数(避免树过深,进一步降低过拟合)。

四、提升法(Boosting)组合学习

提升法(Boosting)是另一类重要的集成学习方法,与Bagging的“并行构建多棵树”不同,Boosting的核心是“串行构建多棵弱学习器(如决策树),通过权重调整让后续学习器聚焦于前序学习器的错误样本”,最终通过加权投票/平均提升整体性能。

常用的Boosting算法有AdaBoost(适用于分类)、GBDT(Gradient Boosting Decision Tree,适用于分类与回归),以及基于GBDT改进的XGBoost、LightGBM等。

4.1 Boosting的核心思想

Boosting的本质是“将多个弱学习器(泛化能力略优于随机猜测的学习器,如深度为1的决策树——决策桩)集成为强学习器”,核心逻辑包括:

  1. 权重调整
    • 样本权重:每次迭代后,增加前序学习器错分样本的权重,减少正确样本的权重,让后续学习器更关注错分样本;
    • 学习器权重:泛化能力强的学习器(错分率低)赋予更高权重,泛化能力弱的学习器赋予更低权重;
  2. 串行构建:每棵学习器依赖前一棵学习器的结果,无法并行(区别于随机森林的并行);
  3. 加权集成:最终预测结果是所有学习器的加权投票(分类)或加权平均(回归)。

4.2 AdaBoost算法:基于指数损失的Boosting

AdaBoost(Adaptive Boosting)是最早的Boosting算法,适用于分类任务,核心用“指数损失函数”调整样本权重和学习器权重,弱学习器通常为决策桩(深度为1的CART树)。

4.2.1 AdaBoost的迭代步骤

设原始样本集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } D = \{(x_1,y_1), (x_2,y_2), ..., (x_N,y_N)\} D={(x1,y1),(x2,y2),...,(xN,yN)} y i ∈ { + 1 , − 1 } y_i \in \{+1,-1\} yi{+1,1}),弱学习器数量为 M M M,步骤如下:

步骤1:初始化样本权重
所有样本的初始权重相等:
w 1 , i = 1 N ( i = 1 , 2 , . . . , N ) w_{1,i} = \frac{1}{N} \quad (i=1,2,...,N) w1,i=N1(i=1,2,...,N)
其中 w m , i w_{m,i} wm,i表示第 m m m次迭代时第 i i i个样本的权重。

步骤2:迭代构建弱学习器( m = 1 m=1 m=1 M M M

  1. 基于权重 w m , i w_{m,i} wm,i的样本集,训练弱学习器 h m ( x ) h_m(x) hm(x)(决策桩);
  2. 计算 h m ( x ) h_m(x) hm(x)的加权错分率:
    ϵ m = ∑ i = 1 N w m , i ⋅ I ( h m ( x i ) ≠ y i ) \epsilon_m = \sum_{i=1}^N w_{m,i} \cdot I(h_m(x_i) \neq y_i) ϵm=i=1Nwm,iI(hm(xi)=yi)
    其中 I ( ⋅ ) I(\cdot) I()是指示函数(条件成立为1,否则为0);
  3. 计算 h m ( x ) h_m(x) hm(x)的权重(错分率越低,权重越高):
    α m = 1 2 ln ⁡ ( 1 − ϵ m ϵ m ) \alpha_m = \frac{1}{2} \ln \left( \frac{1 - \epsilon_m}{\epsilon_m} \right) αm=21ln(ϵm1ϵm)
    ϵ m > 0.5 \epsilon_m > 0.5 ϵm>0.5,则 α m < 0 \alpha_m < 0 αm<0,说明该学习器性能差,可丢弃;
  4. 更新样本权重(错分样本权重增加,正确样本权重减少):
    w m + 1 , i = w m , i ⋅ exp ⁡ ( − α m y i h m ( x i ) ) Z m w_{m+1,i} = \frac{w_{m,i} \cdot \exp(-\alpha_m y_i h_m(x_i))}{Z_m} wm+1,i=Zmwm,iexp(αmyihm(xi))
    其中 Z m = ∑ i = 1 N w m , i ⋅ exp ⁡ ( − α m y i h m ( x i ) ) Z_m = \sum_{i=1}^N w_{m,i} \cdot \exp(-\alpha_m y_i h_m(x_i)) Zm=i=1Nwm,iexp(αmyihm(xi))是归一化因子,确保 w m + 1 , i w_{m+1,i} wm+1,i之和为1。

步骤3:集成弱学习器
最终分类器为所有弱学习器的加权投票:
H ( x ) = sign ( ∑ m = 1 M α m h m ( x ) ) H(x) = \text{sign} \left( \sum_{m=1}^M \alpha_m h_m(x) \right) H(x)=sign(m=1Mαmhm(x))
其中 sign ( ⋅ ) \text{sign}(\cdot) sign()是符号函数(输入为正输出+1,负输出-1)。

4.2.2 AdaBoost的特点
  • 优点:实现简单,无需手动调参(仅需指定弱学习器数量 M M M),对噪声不敏感;
  • 缺点:仅适用于分类任务,对异常值敏感(异常值易被多次调整权重,影响后续学习器)。

4.3 GBDT算法:基于梯度下降的Boosting

GBDT(Gradient Boosting Decision Tree)是Boosting的进阶算法,适用于分类与回归任务,核心是“用梯度下降的思想,让每棵决策树拟合前序模型的‘残差’(或梯度)”,弱学习器为CART回归树(即使是分类任务,也用回归树拟合梯度)。

4.3.1 GBDT的核心思想

GBDT将“模型的损失函数”作为优化目标,每次迭代时,用一棵CART回归树拟合“当前模型损失函数的负梯度”(可理解为“残差的近似”),逐步降低损失函数值。

以回归任务(损失函数为平方误差)为例,GBDT的核心逻辑:

  • 初始模型 F 0 ( x ) F_0(x) F0(x):用所有样本的均值作为预测值( F 0 ( x ) = 1 N ∑ i = 1 N y i F_0(x) = \frac{1}{N}\sum_{i=1}^N y_i F0(x)=N1i=1Nyi);
  • m m m次迭代:
    1. 计算残差 r m , i = y i − F m − 1 ( x i ) r_{m,i} = y_i - F_{m-1}(x_i) rm,i=yiFm1(xi)(平方误差的负梯度即为残差);
    2. 用CART回归树拟合残差 r m , i r_{m,i} rm,i,得到弱学习器 h m ( x ) h_m(x) hm(x)
    3. 计算步长 γ m \gamma_m γm(学习率,控制 h m ( x ) h_m(x) hm(x)的贡献,通常取0.1-0.3);
    4. 更新模型 F m ( x ) = F m − 1 ( x ) + γ m h m ( x ) F_m(x) = F_{m-1}(x) + \gamma_m h_m(x) Fm(x)=Fm1(x)+γmhm(x)
  • 最终模型 F M ( x ) = F 0 ( x ) + ∑ m = 1 M γ m h m ( x ) F_M(x) = F_0(x) + \sum_{m=1}^M \gamma_m h_m(x) FM(x)=F0(x)+m=1Mγmhm(x)
4.3.2 GBDT的扩展:分类任务与损失函数

GBDT处理分类任务时,需将“类别标签转换为概率”,并选择适合分类的损失函数:

  • 二分类:用“对数损失函数”,负梯度为 r m , i = y i − P ( y i = 1 ∣ x i ) r_{m,i} = y_i - P(y_i=1|x_i) rm,i=yiP(yi=1∣xi)(真实标签与预测概率的差);
  • 多分类:用“交叉熵损失函数”,为每个类别构建一棵决策树,最终预测概率为各类别概率的归一化。

此外,GBDT可通过更换损失函数提升鲁棒性:

  • Huber损失:对异常值的惩罚小于平方误差,适合含异常值的回归任务;
  • 绝对损失:对异常值更鲁棒,但导数不连续,需特殊处理。
4.3.3 GBDT的优缺点
  • 优点:泛化能力强(比随机森林更适合复杂数据),可处理分类与回归任务,对特征尺度不敏感;
  • 缺点:训练速度慢(串行构建),对异常值敏感(残差易受异常值影响),参数调优复杂(需调学习率、树深度、树数量等)。

4.4 Boosting的改进:XGBoost与LightGBM

GBDT的核心问题是“训练速度慢”,工业界常用XGBoost(eXtreme Gradient Boosting)和LightGBM(Light Gradient Boosting Machine)解决这一问题:

  • XGBoost:通过“预排序特征”“并行计算分裂点”“正则化项(L1/L2)”提升速度与泛化能力;
  • LightGBM:通过“直方图优化”(将连续特征离散为直方图)“梯度-based单边采样”进一步降低计算复杂度,训练速度比XGBoost快10-100倍。

总结

本文围绕决策树展开,从单棵决策树到集成模型,形成完整的技术链条:

  1. 单棵决策树:ID3(信息增益,离散分类)→ C4.5(信息增益比,支持连续/缺失值)→ CART(Gini/平方误差,二叉分类/回归树),核心是“特征选择”与“剪枝”;
  2. 集成模型
    • 随机森林(Bagging):通过样本+特征随机,多棵CART树投票,降低方差,适合作为基线;
    • Boosting(AdaBoost/GBDT):通过串行权重调整,聚焦错分样本,提升泛化能力,适合复杂数据;
  3. 核心差异:单棵树易过拟合,集成模型通过“多样性”(随机森林)或“纠错”(Boosting)解决这一问题。

决策树及其集成模型的关键是“因地制宜”:若需可解释性和快速迭代,选单棵CART;若需平衡性能与速度,选随机森林;若需更高精度(如竞赛、复杂业务场景),选XGBoost/LightGBM。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BetterInsight

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值