【机器学习模型详细推导4】-决策树

决策树

  • 一. 决策树介绍
  • 二. ID3/C4.5
  • 三. CART算法
    • 1、最小二乘回归树生成算法
    • 2、CART分类树
    • 3、CART剪枝

一. 决策树介绍

模型: 一个树形的判断结构,内部结点表示特征或属性,叶子节点表示一个分类
【机器学习模型详细推导4】-决策树_第1张图片
如何学习一个决策树:

  1. 特征选择
  2. 树的生成
  3. 决策树剪枝

实现算法: ID3、C4.5、CART

二. ID3/C4.5

0)熵:描述数据集合不确定性的方法
熵 : H ( D ) = − ∑ i = 1 n p i l o g p i 其 中 , n 为 类 别 数 熵:H(D) = -\sum _{i=1}^n p_ilogp_i \\ 其中,n为类别数 H(D)=i=1npilogpin1)特征选择:

对每一个特征进行计算,优先选择信息增益/信息增益率大的特征。

  • 信息增益(ID3算法采用)
    特征A对训练数据集D的信息增益:
    g ( D , A ) = H ( D ) − H ( D ∣ A ) = − ∑ k = 1 K ∣ C k ∣ ∣ D ∣ l o g 2 ∣ C k ∣ ∣ D ∣ − ∑ i = 1 n ∣ D i ∣ ∣ D ∣ H ( D i ) = − ∑ k = 1 K ∣ C k ∣ ∣ D ∣ l o g 2 ∣ C k ∣ ∣ D ∣ − ( − ∑ i = 1 n ∣ D i ∣ ∣ D ∣ ∑ k = 1 K ∣ D i k ∣ ∣ D i ∣ l o g 2 ∣ D i k ∣ ∣ D i ∣ ) \begin{aligned} g(D,A) &=H(D)-H(D|A)\\ &=-\sum_{k=1}^K \frac{|C_k|}{|D|}log_2{\frac{|C_k|}{|D|}}-\sum_{i=1}^n \frac{|D_i|}{|D|}H(D_i)\\ &=-\sum_{k=1}^K \frac{|C_k|}{|D|}log_2{\frac{|C_k|}{|D|}}-(-\sum_{i=1}^n \frac{|D_i|}{|D|}\sum_{k=1}^K \frac{|D_{ik}|}{|D_i|}log_2{\frac{|D_{ik}|}{|D_i|}}) \end{aligned} g(D,A)=H(D)H(DA)=k=1KDCklog2DCki=1nDDiH(Di)=k=1KDCklog2DCk(i=1nDDik=1KDiDiklog2DiDik)其中,k代表标签类别,n表示D被A划分的类别。

  • 信息增益率(C4.5采用)
    g R ( D , A ) = g ( D , A ) H A ( D ) g_R(D,A)=\frac{g(D,A)}{H_A(D)} gR(D,A)=HA(D)g(D,A)其中, H A ( D ) H_A(D) HA(D)表示特征变量本身的复杂程度,代表数据集D被A特征划分的熵,而不是按照标签类别划分的熵

Q1:信息增益率对比信息增益的好处?
因为信息增益偏向于选择取值较多的特征(例如编号、日期这种特征取值很多但没意义),容易过拟合。需要一个对特征变量本身复杂度的惩罚项,所以就有了信息增益率。

2)决策树生成

【1】选择信息增益/信息增益率最大的特征作为数节点的判断特征
【2】由选定特征的不同取值建立子结点
【3】子结点递归选择特征,构建决策树
【4】直到所有特征的 g ( D , A ) g(D,A) g(D,A)都很小或没有特征

3)决策树剪枝

在决策树生成之后,利用树整体的损失函数进行剪枝
树T的损失函数:
C α ( T ) = C ( T ) + α ∣ T ∣ C_\alpha(T) = C(T) + \alpha|T| Cα(T)=C(T)+αT其中, C ( T ) C(T) C(T)表示预测误差,用经验熵来计算; ∣ T ∣ |T| T表示叶子节点数,即模型复杂度;参数 α \alpha α控制两者之间的影响,剪枝的核心也就在 α \alpha α了, α \alpha α可以控制树的大小。

叶子节点t上的经验熵:
H t ( T ) = − ∑ k N t k N t l o g N t k N t H_t(T)=-\sum_k\frac{N_{tk}}{N_t}log\frac{N_{tk}}{N_t} Ht(T)=kNtNtklogNtNtk
整个树的预测误差:
(也就是所有叶子节点的 “ 样本个数 X 经验熵 ” 相加)
C ( T ) = − ∑ t = 1 ∣ T ∣ N t H t ( T ) C(T)=-\sum_{t=1}^{|T|}N_tH_t(T) C(T)=t=1TNtHt(T)其中, N t N_t Nt为叶子节点 t t t 的样本个数, H t ( T ) H_t(T) Ht(T) t t t 的经验熵

剪枝算法:
【1】递归从每个叶结点向上回缩
【2】计算回缩前后的损失函数 C α ( T A ) C_\alpha(T_A) Cα(TA) C α ( T B ) C_\alpha(T_B) Cα(TB),若 C α ( T A ) C_\alpha(T_A) Cα(TA) > C α ( T B ) C_\alpha(T_B) Cα(TB),则剪枝。
【3】一直回缩,直到不能继续为止,便得到损失函数最小的子树 T α T_\alpha Tα

总结:“决策树生成”学习局部的模型,而“决策树生成”学习整体的模型。
决策树剪枝的过程,极小化 C α ( T ) = C ( T ) + α ∣ T ∣ C_\alpha(T) = C(T) + \alpha|T| Cα(T)=C(T)+αT 等价于正则化的极大似然估计法。

三. CART算法

CART(分类和回归决策树)是选定特征做最优二值划分,生成的决策树是二叉树。
之前的ID3和C4.5都是选定特征,特征中有多少取值就划分出多少个子结点,而CART是选定 最优特征和最优化分值 做二分类。
按照特征连续离散分为 回归树 和 分类树

1、最小二乘回归树生成算法

核心:利用平方误差寻找切分特征 j ,然后扫描切分点 s。不断寻找切分对 ( s , j ) (s,j) (s,j)从而构建一个二叉树,也就是回归树模型了。

【1】遍历每一个特征 j ,扫描 j 的所有取值,寻找切分点 s,得到切分对 ( j , s ) (j, s) j,s
针对每个切分对 ( j , s ) (j, s) j,s,得到划分的2个子结点,也就是 R1(j,s) 和 R2(j,s) 空间:
R 1 ( j , s ) = { x ∣ x j ⩽ s } R 2 ( j , s ) = { x ∣ x j > s } R_1(j,s) = \{x|x_j\leqslant s\}\\ R_2(j,s) = \{x|x_j>s\} R1(j,s)={xxjs}R2(j,s)={xxj>s}针对每个切分对 ( j , s ) (j, s) j,s,计算平方误差:
∑ x i ∈ R 1 ( j , s ) ( y i − c 1 ) 2 + ∑ x i ∈ R 2 ( j , s ) ( y i − c 2 ) 2 \sum_{x_i\in R_1(j,s)}(y_i-c_1)^2 + \sum_{x_i\in R_2(j,s)}(y_i-c_2)^2 xiR1(j,s)(yic1)2+xiR2(j,s)(yic2)2其中,C1 和 C2 分别是 R1 和 R2 空间内所有 x 对应 y 值的均值
C 1 = a v e ( y i ∣ x i ∈ R 1 ( j , s ) ) C 2 = a v e ( y i ∣ x i ∈ R 2 ( j , s ) ) C_1=ave(y_i|x_i\in R_1(j,s))\\ C_2=ave(y_i|x_i\in R_2(j,s)) C1=ave(yixiR1(j,s))C2=ave(yixiR2(j,s))【2】寻找最优划分特征和最优切分点,也就是平方误差对应最小的 ( j , s ) (j,s) (j,s)
m i n [ ∑ x i ∈ R 1 ( j , s ) ( y i − c 1 ) 2 + ∑ x i ∈ R 2 ( j , s ) ( y i − c 2 ) 2 ] min[\sum_{x_i\in R_1(j,s)}(y_i-c_1)^2 + \sum_{x_i\in R_2(j,s)}(y_i-c_2)^2] min[xiR1(j,s)(yic1)2+xiR2(j,s)(yic2)2]
【3】递归对两个子区域进行划分,不断寻找最优划分对 ( j , s ) (j,s) (j,s)
直到满足停止条件

【4】最后划分得到区域 R1,R2,R3…Rm,也就是叶子节点。
模型输出为每个叶子区域 y 的平均值:
c m = a v e ( y i ∣ x i ∈ R m ) c_m = ave(y_i|x_i\in R_m) cm=ave(yixiRm)
所以回归树模型为:
f ( x ) = ∑ m = 1 M c m I f(x) = \sum_{m=1}^M c_mI f(x)=m=1McmI其中, I I I 用于选择决策树的路径,也就是选择哪个 R 空间。

2、CART分类树

利用基尼指数不断寻找最有特征和最优划分,得到决策树模型

【1】对每一个特征 A 的每一个取值 a,根据样本 A=a 与否,将样本集 D 划分为 D1 和 D2。
计算Gini指数:
G i n i ( D , A ) = ∣ D 1 ∣ ∣ D ∣ G i n i ( D 1 ) + ∣ D 2 ∣ ∣ D ∣ G i n i ( D 2 ) Gini(D,A) = \frac{|D_1|}{|D|}Gini(D_1) + \frac{|D_2|}{|D|}Gini(D_2) Gini(D,A)=DD1Gini(D1)+DD2Gini(D2)其中,对于样本集 D1 和 D2:
G i n i ( D 1 ) = ∑ k = 1 K p k ( 1 − p k ) = 1 − ∑ k = 1 K p k 2 Gini(D1) = \sum_{k=1}^Kp_k(1-p_k) = 1-\sum_{k=1}^Kp_k^2 Gini(D1)=k=1Kpk(1pk)=1k=1Kpk2其中,K为类别数

【2】选择基尼指数最小的特征和划分点,作为最优特征和最优划分点,生成两个子结点,对数据集划分
【3】对两个子结点递归划分,直到满足停止条件。
(停止条件例如 结点中样本数小于阈值,基尼指数小于阈值,特征没有了)

3、CART剪枝

思想:CART剪枝算法是从“完全生长”的决策树的底端剪去一些子树,使决策树变小,从而对未知数据有更准确的预测。
主要由2步:首先从底端不断剪枝直到根节点 T 0 T_0 T0,过程中会形成多个子树${T_0,T_1,…,T_n};然后通过交叉验证法在独立的验证数据集上利用损失函数对子树序列进行测试,从中选择最优子树。

【1】自下而上的对树的内部结点(也就是非叶子节点)计算
g ( t ) = C ( t ) − C ( T t ) ∣ T t ∣ − 1 g(t) = \frac{C(t)-C(T_t)}{|T_t|-1} g(t)=Tt1C(t)C(Tt)表示 t 结点划分造成的损失函数减小的程度(t 代表节点不划分, T t T_t Tt 代表 t 结点划分成了树)。
其中, C ( t ) C(t) C(t) 表示预测误差(如平方误差或基尼指数), ∣ T ∣ |T| T表示子树的叶结点个数。
【2】寻找最小的 g ( t ) g(t) g(t) T t T_t Tt ,剪去,之后 T 0 → T 1 T_0 \rightarrow T_1 T0T1,设 g(t) 为 α 1 \alpha_1 α1,则 T 1 T_1 T1 为区间 [ α 1 , α 2 ) [\alpha_1,\alpha_2) [α1,α2) 的最优子树
【3】不断循环,得到子树序列: T 0 , T 1 , … , T n {T_0,T_1,…,T_n} T0,T1,,Tn
【4】交叉验证法:计算每一颗子树的平方误差或基尼指数,最小的即为最优决策树 T α T_\alpha Tα


参考:
《统计学习方法》李航

你可能感兴趣的:(机器学习,机器学习模型详细推导)