homewritingsthoughts
EN

重读统计学习方法:决策树

Jan 29, 2025

·

5 min read

tl;dr:决策树,ID3和CART等。

跳过了MLP,KNN,从决策树再开始温习,也为了后面的XGBoost,LGBM和CATBoost打一下基础。

顺便一提,今天见证了DeepSeek刷榜Github,从没见过这么夸张的刷榜,TOP10有6个都是DS的项目。


决策树

单棵决策树很好理解,就是根据条件判断来得到预测的分类或数值。当条件变多时,就会通过加深层数的方式来提高模型蕴含的信息量。

决策树的核心思想还是通过特征划分数据,并最终递归的构建成一棵树。这需要达成互斥且完备,也就是每个路径都是唯一的。因此如何划分数据,就成了决策树中的关键问题,常说的ID3/C45/CART的区别就在此。

ID3:信息增益

首先有熵的定义:H(D)=−∑i=1kpilog⁡2piH(D) = -\sum_{i=1}^{k} p_i \log_2{p_i}H(D)=−∑i=1k​pi​log2​pi​,用于衡量数据集的不确定性,其中,pip_ipi​ 是类别iii的概率。熵在信息论中被定义为系统的混乱程度,熵越大,系统的不确定性越大。

信息增益衡量某个特征AAA在划分数据集DDD后,信息熵的减少量:IG(D,A)=H(D)−∑v∈A∣Dv∣∣D∣H(Dv)IG(D, A) = H(D) - \sum_{v \in A} \frac{|D_v|}{|D|} H(D_v)IG(D,A)=H(D)−∑v∈A​∣D∣∣Dv​∣​H(Dv​)。其中H(D)H(D)H(D)是原始数据集的熵,DvD_vDv​ 是按特征AAA取值vvv分割后的数据子集。熵减的越多,说明特征在数据中越重要。

在实际操作时,先以目标变量计算经验熵,随后递归的对不同特征进行信息增益的计算,并且每次取信息增益大的特征作为下一分割点。


C4.5:信息增益比

ID3里,某一特征的独立值越大,被任务它所蕴含的信息越大,因此会倾向于选择多值特征。为了解决这个问题,C4.5 使用信息增益比进行改进,从减改成比:GainRatio(D,A)=IG(D,A)IV(A)GainRatio(D, A) = \frac{IG(D, A)}{IV(A)}GainRatio(D,A)=IV(A)IG(D,A)​。其中,IV(A)(信息值) 是特征AAA的熵:IV(A)=−∑v∈A∣Dv∣∣D∣log⁡2∣Dv∣∣D∣IV(A) = -\sum_{v \in A} \frac{|D_v|}{|D|} \log_2 \frac{|D_v|}{|D|}IV(A)=−∑v∈A​∣D∣∣Dv​∣​log2​∣D∣∣Dv​∣​。

IV值同样在风控领域被广泛用到,两边公式有点类似:风控领域使用基于WOE(证据权重)的差距度量,计算公式为:IV=∑i=1n(WOEi×(pi−qi))IV = \sum_{i=1}^{n} (WOE_i \times (p_i - q_i))IV=∑i=1n​(WOEi​×(pi​−qi​))

其中, WOEi=log⁡piqiWOE_i = \log \frac{p_i}{q_i}WOEi​=logqi​pi​​,pip_ipi​ = 该分组中的 好用户占比(未违约用户数 / 总未违约用户数),qiq_iqi​ = 该分组中的 坏用户占比(违约用户数 / 总违约用户数)。

  • 其中的IV值里,pi−qip_i - q_ipi​−qi​衡量了该分组相对总体分布的不均衡性。
  • WOEiWOE_iWOEi​衡量了该分组对好/坏用户的区分能力。
  • 乘积 WOEi×(pi−qi)WOE_i \times (p_i - q_i)WOEi​×(pi​−qi​)体现了该分组在整体上的影响力,最终 IV 通过累加所有分组的影响力得到一个特征的重要性评分。

CART :基尼系数

CART树被改进后,支持分类和回归任务。它被设计为递归的生成二叉树,在分类任务上使用基尼系数最小化作为特征选择的准则,回归任务上使用MSE最小化作为特征选择的准则。

基尼指数(Gini Index) 衡量数据集的纯度:Gini(D)=1−∑i=1kpi2Gini(D) = 1 - \sum_{i=1}^{k} p_i^2Gini(D)=1−∑i=1k​pi2​

特征AAA的基尼指数:GiniIndex(D,A)=∑v∈A∣Dv∣∣D∣Gini(Dv)GiniIndex(D, A) = \sum_{v \in A} \frac{|D_v|}{|D|} Gini(D_v)GiniIndex(D,A)=∑v∈A​∣D∣∣Dv​∣​Gini(Dv​)

决策树的优缺点

优点缺点
直观易理解容易过拟合
训练速度快对噪声敏感
适用于分类和回归不擅长处理连续变量
适用于小数据集可能受特征选择影响

随着树深度的增长,决策树容易陷入过拟合,这时一般通过剪枝或Bagging/Boosting的方法提高鲁棒性。

此外,由于每次特征筛选时都要计算全量数据的对应特征熵,可想而知在大数据情况下,构建决策树将会非常慢。

回归树

决策树原本只能预测离散变量,后续的CART支持了连续变量的预测,其中的修改主要是两点:损失函数由交叉熵变为MSE/RMSE之类的传统连续变量损失函数,预测目标由分类变成子节点均值。

例如,根据某一特征进行分裂后,取这一特征下,所有目标变量的均值作为这一特征节点下的预测目标变量。

抄一下GPT给出的计算流程:


回归树的构造过程如下:

计算分裂前的目标变量均值

假设数据集DDD共有nnn个样本,目标变量的均值为:

yˉ=1n∑i=1nyi\bar{y} = \frac{1}{n} \sum_{i=1}^{n} y_iyˉ​=n1​∑i=1n​yi​

如果此时直接停止分裂,那么整个数据集的均值 yˉ\bar{y}yˉ​就是最终的预测值。


选择最优分裂点

回归树的目标是通过最小化均方误差(MSE, Mean Squared Error) 来选择分裂特征和分裂点:

MSE=∑i=1n(yi−yˉ)2MSE = \sum_{i=1}^{n} (y_i - \bar{y})^2MSE=∑i=1n​(yi​−yˉ​)2

如果选择特征AAA和分裂点sss进行划分,数据集被分成左子集D1D_1D1​和右子集 D2D_2D2​,均值分别为1∣D1∣∑yi:yi∈D1yi\frac{1}{|D_1|} \sum_{y_i: y_i \in D_1} y_i∣D1​∣1​∑yi​:yi​∈D1​​yi​和1∣D2∣∑yi:yi∈D2yi\frac{1}{|D_2|} \sum_{y_i: y_i \in D_2} y_i∣D2​∣1​∑yi​:yi​∈D2​​yi​

会选择能使Loss最小的A,sA,sA,s作为最优分裂点。


递归分裂,直到叶子节点

  • 如果满足停止条件(如样本数小于最小叶子样本数),则停止分裂。

  • 叶子节点的最终预测值 就是该叶子节点所有样本的目标变量均值

📌 示例: 假设一个回归树用于预测房价,数据集如下:

面积 (㎡)房价(万元)
50150
55160
70180
75190
90220
100250

构造回归树步骤:

  1. 计算整个数据集的目标变量均值: yˉ=150+160+180+190+220+2506=191.67\bar{y} = \frac{150 + 160 + 180 + 190 + 220 + 250}{6} = 191.67yˉ​=6150+160+180+190+220+250​=191.67
  2. 选择最佳分裂点(如面积 70 ㎡),划分数据集:
    • 左子树(面积 ≤ 70):yˉ1=150+160+1803=163.33\bar{y}_1 = \frac{150 + 160 + 180}{3} = 163.33yˉ​1​=3150+160+180​=163.33
    • 右子树(面积 > 70):yˉ2=190+220+2503=220.00\bar{y}_2 = \frac{190 + 220 + 250}{3} = 220.00yˉ​2​=3190+220+250​=220.00

预测房价:

  • 如果面积 ≤ 70,预测值是 163.33 万。
  • 如果面积 > 70,预测值是 220.00 万。

2025/2/3 于苏州