0 基本流程
- 每个结点对应一个属性测试,结点包含的样本集合根据结果分到不同的子结点
- 决策树算法流程:
- 总结:每次选择其中一个特征对样本集进行分类,对分类后的子集重复前步骤
- 根据8中的划分方法,分为ID3、C4.5 、CART
- 决策树需要考虑的问题:连续数值离散化,缺失数值处理,过拟合处理
1 特征选择
1.1 ID3
- 熵的定义:
H
(
X
)
=
−
∑
i
=
1
n
p
i
log
p
i
H(X)=-\sum_{i=1}^{n} p_{i} \log p_{i}
H(X)=−i=1∑npilogpi 其中n代表X的n种不同的离散取值。而
p
i
p_i
pi代表了X取值为i的概率,log为以2或者e为底的对数。
条件熵:
H ( X ∣ Y ) = − ∑ i = 1 n p ( x i , y i ) log p ( x i ∣ y i ) = ∑ j = 1 n p ( y j ) H ( X ∣ y j ) H(X | Y)=-\sum_{i=1}^{n} p\left(x_{i}, y_{i}\right) \log p\left(x_{i} | y_{i}\right)=\sum_{j=1}^{n} p\left(y_{j}\right) H(X | y_{j}) H(X∣Y)=−i=1∑np(xi,yi)logp(xi∣yi)=j=1∑np(yj)H(X∣yj) - 令H(D)表示集合D的熵, H(D|A) 表示特征A给定条件下D的条件熵,则特征A对数据集D的信息增益可以表示为: g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D, A)=H(D)-H(D | A) g(D,A)=H(D)−H(D∣A)
- 停止条件:达到设定的信息增益阈值、没有更多特征
- 缺点:偏向于取值多的特征。
1.2 C4.5
- 引入特征熵和信息增益率: H A ( D ) = − ∑ i = 1 n ∣ D i ∣ ∣ D ∣ log ∣ D i ∣ ∣ D ∣ g R ( D , A ) = g ( D , A ) H A ( D ) \begin{array}{c}{H_{A}(D)=-\sum_{i=1}^{n} \frac{\left|D_{i}\right|}{|D|} \log \frac{\left|D_{i}\right|}{|D|}} \\ {g_{R}(D, A)=\frac{g(D, A)}{H_{A}(D)}}\end{array} HA(D)=−∑i=1n∣D∣∣Di∣log∣D∣∣Di∣gR(D,A)=HA(D)g(D,A)
- 特征熵 H A ( D ) H_A(D) HA(D):特征数越多的特征对应的特征熵越大,它作为分母,可以校正信息增益容易偏向于取值较多的特征的问题。
- 停止条件:达到设定的信息增益率阈值、没有更多特征
- 缺点:只能用于分类;大量的对数运算;使用多叉树模型
1.3 CART
- 基尼系数定义: Gini ( p ) = ∑ k = 1 K p k ( 1 − p k ) = 1 − ∑ k = 1 K p k 2 \operatorname{Gini}(p)=\sum_{k=1}^{K} p_{k}\left(1-p_{k}\right)=1-\sum_{k=1}^{K} p_{k}^{2} Gini(p)=k=1∑Kpk(1−pk)=1−k=1∑Kpk2基尼系数代表了模型的不纯度,基尼系数越小,则不纯度越低,特征越好。
- 对于个给定的样本D,假设有K个类别, 第k个类别的数量为Ck,则样本D的基尼系数表达式为: Gini ( D ) = 1 − ∑ k = 1 K ( ∣ C k ∣ ∣ D ∣ ) 2 \operatorname{Gini}(D)=1-\sum_{k=1}^{K}\left(\frac{\left|C_{k}\right|}{|D|}\right)^{2} Gini(D)=1−k=1∑K(∣D∣∣Ck∣)2选定特征A后,特征A下的基尼系数定义为: Gini ( D , A ) = ∑ i = 1 n p i Gini ( D i ) \operatorname{Gini}(D, A)=\sum_{i=1}^{n} p_{i} \operatorname{Gini}\left(D_{i}\right) Gini(D,A)=i=1∑npiGini(Di)在决策树选择特征时,应选择基尼指数增益值最大的特征(分裂后基尼指数最小),作为该节点分裂条件。
- 对于CART回归树,选取和方差作为度量方式。度量目标是,对于任意划分特征A,对应的任意划分点s两边划分成的数据集D1和D2,求出使D1和D2各自集合的均方差最小,同时D1和D2的均方差之和最小所对应的特征和特征值划分点,即: min ⎵ A , s [ min ⎵ c 1 ∑ x i ∈ D 1 ( A , s ) ( y i − c 1 ) 2 + min ⎵ c 2 ∑ x i ∈ D 2 ( A , s ) ( y i − c 2 ) 2 ] \underbrace{\min }_{A, s}\left[\underbrace{\min }_{c_{1}} \sum_{x_{i} \in D_{1}(A, s)}\left(y_{i}-c_{1}\right)^{2}+\underbrace{\min }_{c_{2}} \sum_{x_{i} \in D_{2}(A, s)}\left(y_{i}-c_{2}\right)^{2}\right] A,s min⎣⎡c1 minxi∈D1(A,s)∑(yi−c1)2+c2 minxi∈D2(A,s)∑(yi−c2)2⎦⎤
- 停止条件:结点样本数小于预定阈值、样本集的Gini系数小于预定阈值 、没有更多特征
- 总结:
算法 | 支持模型 | 树结构 | 特征选择 | 连续值处理 | 缺失值处理 | 剪枝 |
---|---|---|---|---|---|---|
ID3 | 分类 | 多叉树 | 信息增益 | 不支持 | 不支持 | 不支持 |
C4.5 | 分类 | 多叉树 | 信息增益比 | 支持 | 支持 | 支持 |
CART | 分类,回归 | 二叉树 | 基尼系数,均方差 | 支持 | 支持 | 支持 |
回忆下ID3或者C4.5,如果某个特征A被选取建立决策树节点,如果它有A1,A2,A3三种类别,我们会在决策树上一下建立一个三叉的节点。这样导致决策树是多叉树。但是CART分类树使用的方法不同,他采用的是不停的二分,还是这个例子,CART分类树会考虑把A分成{A1}和{A2,A3}, {A2}和{A1,A3}, {A3}和{A1,A2}三种情况,找到基尼系数最小的组合,比如{A2}和{A1,A3},然后建立二叉树节点,一个节点是A2对应的样本,另一个节点是{A1,A3}对应的节点。同时,由于这次没有把特征A的取值完全分开,后面我们还有机会在子节点继续选择到特征A来划分A1和A3。这和ID3或者C4.5不同,在ID3或者C4.5的一棵子树中,离散特征只会参与一次节点的建立。
2 优化
2.1 剪枝
- 预剪枝与后剪枝
2.1.1 预剪枝
- 决策树生成过程中剪枝。
(1) 一种最为简单的方法就是在决策树到达一定高度的情况下就停止树的生长。
(2) 到达此结点的实例具有相同的特征向量,而不必一定属于同一类, 也可停止生长。
(3) 到达此结点的实例个数小于某一个阈值也可停止树的生长。
(4) 还有一种更为普遍的做法是计算每次扩张对系统性能的增益,如果这个增益值小于某个阈值则不进行扩展。
2.1.2 后剪枝
- 后剪枝:从训练集中生成一棵完整的决策树,考察所有的剪枝策略
- Reduced-Error Pruning (REP,错误率降低剪枝):误判数量减小则剪枝(容易过拟合,很少用)
- Pessimistic Error Pruning (PEP,悲观剪枝):自上而下的修剪。不用单独找剪枝数据集。
- Minimum Error Pruning(MEP,最小误差剪枝):自底向上剪枝。
- Cost-Complexity Pruning(CCP,代价复杂剪枝): C α ( T t ) = C ( T t ) + α ∣ T t ∣ C_{\alpha}\left(T_{t}\right)=C\left(T_{t}\right)+\alpha\left|T_{t}\right| Cα(Tt)=C(Tt)+α∣Tt∣其中, α \alpha α 为正则化参数, C ( T t ) C(T_t) C(Tt)为训练数据的预测误差,分类树是用基尼系数度量,回归树是均方差度量。 ∣ T t ∣ |T_t| ∣Tt∣是子树T的叶子节点的数量。
算法过程如下:
1)初始化 α min = ∞ \alpha_{\min }=\infty αmin=∞, 最优子树集合 ω = { T } \omega=\{T\} ω={T}。
2)从叶子节点开始自下而上计算各内部节点t的训练误差损失函数 C α ( T t ) C_{\alpha}\left(T_{t}\right) Cα(Tt)(回归树为均方差,分类树为基尼系数), 叶子节点数 ∣ T t ∣ |T_t| ∣Tt∣,以及正则化阈值 α = min { C ( T ) − C ( T t ) ∣ T t ∣ − 1 , α min } \alpha=\min \left\{\frac{C(T)-C\left(T_{t}\right)}{\left|T_{t}\right|-1}, \alpha_{\min }\right\} α=min{∣Tt∣−1C(T)−C(Tt),αmin} 更新 α min = α \alpha_{\min }=\alpha αmin=α
3)得到所有节点的α值的集合M。
4)从M中选择最大的值 α k α_k αk,自上而下的访问子树t的内部节点,如果 C ( T ) − C ( T t ) ∣ T t ∣ − 1 ≤ α k \frac{C(T)-C\left(T_{t}\right)}{\left|T_{t}\right|-1} \leq \alpha_{k} ∣Tt∣−1C(T)−C(Tt)≤αk时,进行剪枝。并决定叶节点t的值。如果是分类树,则是概率最高的类别,如果是回归树,则是所有样本输出的均值。这样得到 α k α_k αk对应的最优子树 T k T_k Tk
5)最优子树集合 ω = ω ∪ T k , M = M − { α k } ω=ω∪T_k, M=M−\{α_k\} ω=ω∪Tk,M=M−{αk}。
6)如果M不为空,则回到步骤4。否则就已经得到了所有的可选最优子树集合ω.
7)采用交叉验证在ω选择最优子树 T α T_α Tα
- CART使用CCP, C4.5使用PEP
- 比较:后剪枝自底向上考察,训练时间更长;但一般情况下,后剪枝的泛化性能更好,欠拟合风险小。
2.2 其他
- 连续值处理:取相邻两样本值的平均数作为划分点
- 缺失值处理:计算加权重后的信息增益比or将缺失特征的样本同时划分入所有的子节点