本文从互联网搬运,只用于本人学习记录。
决策树之基本决策树
决策树是一种基本的分类与回归方法,其模型就是用一棵树来表示我们的整个决策过程。
比较:
- 划分标准的差异:D3 使用信息增益偏向特征值多的特征,C4.5 使用信息增益率克服信息增益的缺点,偏向于特征值小的特征,CART 使用基尼指数克服 C4.5 需要求 log 的巨大计算量,偏向于特征值较多的特征。
- 使用场景的差异:ID3 和 C4.5 都只能用于分类问题,CART 可以用于分类和回归问题;ID3 和 C4.5 是多叉树,速度较慢,CART 是二叉树,计算速度很快;
- 样本数据的差异:ID3 只能处理离散数据且缺失值敏感,C4.5 和 CART 可以处理连续性数据且有多种方式处理缺失值;从样本量考虑的话,小样本建议 C4.5、大样本建议 CART。C4.5 处理过程中需对数据集进行多次扫描排序,处理成本耗时较高,而 CART 本身是一种大样本的统计方法,小样本处理下泛化误差较大 ;
- 样本特征的差异:ID3 和 C4.5 层级之间只使用一次特征,CART 可多次重复使用特征;
- 剪枝策略的差异:ID3 没有剪枝策略,C4.5 是通过悲观剪枝策略来修正树的准确性,而 CART 是通过代价复杂度剪枝。
ID3
ID3 算法是建立在奥卡姆剃刀(用较少的东西,同样可以做好事情)的基础上:越是小型的决策树越优于大的决策树。
1. 思想
- 以信息增益来度量特征选择,选择信息增益最大的特征进行分裂。
- 采用自顶向下的贪婪搜索遍历可能的决策树空间。
- 初始化特征集合和数据集合;
- 计算数据集合信息熵和所有特征的条件熵,选择信息增益最大的特征作为当前决策节点;
- 更新数据集合和特征集合(删除上一步使用的特征,并按照特征值来划分不同分支的数据集合);
- 重复 2,3 两步,若子集值包含单一特征,则为分支叶子节点。
2. 划分标准
ID3 使用的分类标准是信息增益,它表示得知特征 A 的信息而使得样本集合不确定性减少的程度。
信息熵:
H
(
D
)
=
−
∑
k
=
1
K
∣
C
k
∣
∣
D
∣
l
o
g
∣
C
k
∣
∣
D
∣
H(D) = - \sum^K_{k=1}\frac{|C_k|}{|D|}log\frac{|C_k|}{|D|}
H(D)=−k=1∑K∣D∣∣Ck∣log∣D∣∣Ck∣
其中
C
k
C_k
Ck表示集合
D
D
D中属于第
k
k
k类样本的样本子集。
条件熵:
H
(
D
∣
A
)
=
∑
i
=
1
n
∣
D
i
∣
∣
D
∣
H
(
D
i
)
=
−
∑
i
=
1
n
∣
D
i
∣
∣
D
∣
(
∑
k
=
1
K
∣
D
i
k
∣
∣
D
i
∣
l
o
g
∣
D
i
k
∣
∣
D
i
∣
)
\begin{aligned} H(D|A) &= \sum^n_{i=1}\frac{|D_i|}{|D|}H(D_i) \\ &= -\sum^n_{i=1}\frac{|D_i|}{|D|}(\sum^K_{k=1}\frac{|D_{ik}|}{|D_i|}log\frac{|D_{ik}|}{|D_i|}) \end{aligned}
H(D∣A)=i=1∑n∣D∣∣Di∣H(Di)=−i=1∑n∣D∣∣Di∣(k=1∑K∣Di∣∣Dik∣log∣Di∣∣Dik∣)
其中
D
i
D_i
Di表示
D
D
D中特征
A
A
A取第
i
i
i个值的样本子集,
D
i
k
D_{ik}
Dik表示
D
i
D_i
Di中属于第
k
k
k类的样本子集。
信息增益 = 信息熵 - 条件熵:
G
a
i
n
(
D
,
A
)
=
H
(
D
)
−
H
(
D
∣
A
)
Gain(D, A) = H(D) - H(D|A)
Gain(D,A)=H(D)−H(D∣A)
信息增益越大表示使用特征
A
A
A来划分所获得的“纯度提升越大”。
3. 缺点
- ID3 没有剪枝策略,容易过拟合;
- 信息增益准则对可取值数目较多的特征有所偏好,类似**“编号”**的特征其信息增益接近于 1;
- 只能用于处理离散分布的特征;
- 没有考虑缺失值。
C4.5
克服了 ID3 对特征数目的偏重这一缺点,引入信息增益率来作为分类标准。
1. 思想
C4.5相对对ID3的缺点对应有以下改进方式:
-
引入悲观剪枝策略进行后剪枝;
-
引入信息增益率作为划分标准;
-
将连续特征离散化,假设 n 个样本的连续特征 A 有 m 个取值,C4.5 将其排序并取相邻两样本值的平均数共 m-1 个划分点,分别计算以该划分点作为二元分类点时的信息增益,并选择信息增益最大的点作为该连续特征的二元离散分类点;
-
对于缺失值的处理可以分为两个子问题:
-
问题一:在特征值缺失的情况下进行划分特征的选择?(即如何计算特征的信息增益率)
-
针对问题一,C4.5 的做法是:对于具有缺失值特征,用没有缺失的样本子集所占比重来折算;
-
问题二:选定该划分特征,对于缺失该特征值的样本如何处理?(即到底把这个样本划分到哪个结点里)
-
针对问题二,C4.5 的做法是:将样本同时划分到所有子节点,不过要调整样本的权重值,其实也就是以不同概率划分到不同节点中。
2. 划分标准
信息增益率:
G
a
i
n
r
a
t
i
o
(
D
,
A
)
=
G
a
i
n
(
D
,
A
)
H
A
(
D
)
H
A
(
D
)
=
−
∑
i
=
1
n
∣
D
i
∣
∣
D
∣
l
o
g
∣
D
i
∣
∣
D
∣
\begin{aligned} Gain_{ratio}(D, A) &= \frac{Gain(D, A)}{H_A(D)} \\ H_A(D) &= -\sum^n_{i=1}\frac{|D_i|}{|D|}log\frac{|D_i|}{|D|} \end{aligned}
Gainratio(D,A)HA(D)=HA(D)Gain(D,A)=−i=1∑n∣D∣∣Di∣log∣D∣∣Di∣
H
A
(
D
)
H_A(D)
HA(D)成为特征
A
A
A的固有值。
信息增益率对可取值较少的特征有所偏好(分母越小,整体越大),因此 C4.5 并不是直接用增益率最大的特征进行划分,而是使用一个启发式方法:先从候选划分特征中找到信息增益高于平均值的特征,再从中选择增益率最高的。
3. 剪枝策略
剪枝**原因:**过拟合的树在泛化能力的表现非常差。
- 预剪枝
在节点划分前来确定是否继续增长,停止增长的主要方法:
- 节点内数据样本低于某一阈值;
- 所有节点都已分裂;
- 节点划分前准确率比划分后准确率高。
预剪枝不仅可以降低过拟合的风险而且还可以减少训练时间,但另一方面它是基于**“贪心”策略**,会带来欠拟合风险。
- 后剪枝
在已经生成的决策树上进行剪枝,从而得到简化版的剪枝决策树。
C4.5 采用的悲观剪枝方法。
用递归的方式从低往上针对每一个非叶子节点,评估用一个最佳叶子节点去代替这课子树是否有益。
剪枝后错误率保持或者下降,便进行替换。
后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树。但同时其训练时间会大的多。
4. 缺点
- 剪枝策略可以再优化;
- C4.5 用的是多叉树,用二叉树效率更高;
- C4.5 只能用于分类;
- C4.5 使用的熵模型拥有大量耗时的对数运算,连续值还有排序运算;
- C4.5 在构造树的过程中,对数值属性值需要按照其大小进行排序,从中选择一个分割点,所以只适合于能够驻留于内存的数据集,当训练集大得无法在内存容纳时,程序无法运行。
CART
CART 算法的二分法可以简化决策树的规模,提高生成决策树的效率。
1. 思想
CART 包含的基本过程有分裂、剪枝和树选择。
- 分裂:分裂过程是一个二叉递归划分过程,其输入和预测特征既可以是连续型的也可以是离散型的,CART 没有停止准则,会一直生长下去;
- 剪枝:采用代价复杂度剪枝,从最大树开始,每次选择训练数据熵对整体性能贡献最小的那个分裂节点作为下一个剪枝对象,直到只剩下根节点。CART 会产生一系列嵌套的剪枝树,需要从中选出一颗最优的决策树;
- 树选择:用单独的测试集评估每棵剪枝树的预测性能(也可以用交叉验证)。
CART 在 C4.5 的基础上进行了很多提升。
- C4.5 为多叉树,运算速度慢,CART 为二叉树,运算速度快;
- C4.5 只能分类,CART 既可以分类也可以回归;
- CART 使用** G i n i Gini Gini系数**作为变量的不纯度量,减少了大量的对数运算;
- CART 采用代理测试来估计缺失值,而 C4.5 以不同概率划分到不同节点中;
- CART 采用**“基于代价复杂度剪枝”**方法进行剪枝,而 C4.5 采用悲观剪枝方法。
2. 划分标准
基尼指数在简化模型的同时还保留了熵模型的优点。基尼指数代表了模型的不纯度,基尼系数越小,不纯度越低,特征越好。这和信息增益(率)正好相反。
G
i
n
i
(
D
)
=
∑
k
=
1
K
∣
C
k
∣
∣
D
∣
(
1
−
∣
C
k
∣
∣
D
∣
)
=
1
−
∑
k
=
1
K
(
∣
C
k
∣
∣
D
∣
)
2
G
i
n
i
(
D
∣
A
)
=
∑
i
=
1
n
D
i
D
G
i
n
i
(
D
i
)
\begin{aligned} Gini(D) &= \sum^K_{k = 1}\frac{|C_k|}{|D|}(1 - \frac{|C_k|}{|D|}) \\ &= 1 - \sum^K_{k = 1}(\frac{|C_k|}{|D|})^2 \\ Gini(D|A) &= \sum^n_{i = 1}\frac{D_i}{D}Gini(D_i) \end{aligned}
Gini(D)Gini(D∣A)=k=1∑K∣D∣∣Ck∣(1−∣D∣∣Ck∣)=1−k=1∑K(∣D∣∣Ck∣)2=i=1∑nDDiGini(Di)
其中
k
k
k代表类别。
基尼指数反映了从数据集中随机抽取两个样本,其类别标记不一致的概率。
基尼指数偏向于特征值较多的特征,类似信息增益。
当CART为二分类,表达式为:
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)=∣D∣∣D1∣Gini(D1)+∣D∣∣D2∣Gini(D2)
3. 缺失值处理
-
问题一:在特征值缺失的情况下进行划分特征的选择?(即如何计算特征的信息增益率)
-
CART 算法使用了一种惩罚机制来抑制提升值,从而反映出缺失值的影响(例如,如果一个特征在节点的 20% 的记录是缺失的,那么这个特征就会减少 20% 或者其他数值)。
-
问题二:选定该划分特征,对于缺失该特征值的样本如何处理?(即到底把这个样本划分到哪个结点里)
-
CART 算法的机制是为树的每个节点都找到代理分裂器,无论在训练数据上得到的树是否有缺失值都会这样做。在代理分裂器中,特征的分值必须超过默认规则的性能才有资格作为代理(即代理就是代替缺失值特征作为划分特征的特征),当 CART 树中遇到缺失值时,这个实例划分到左边还是右边是决定于其排名最高的代理,如果这个代理的值也缺失了,那么就使用排名第二的代理,以此类推,如果所有代理值都缺失,那么默认规则就是把样本划分到较大的那个子节点。
-
代理分裂器可以确保无缺失训练数据上得到的树可以用来处理包含确实值的新数据。
4. 剪枝策略
“基于代价复杂度的剪枝”,会生成一系列树,每个树都是通过将前面的树的某个或某些子树替换成一个叶节点而得到的,这一系列树中的最后一棵树仅含一个用来预测类别的叶节点。
定义了一个损失函数来达到这两个变量之间的平衡。损失函数定义如下:
C
α
(
T
)
=
C
(
T
)
+
α
∣
T
∣
C_\alpha(T) = C(T) + \alpha|T|
Cα(T)=C(T)+α∣T∣
T
T
T为任意子树,
C
(
T
)
C(T)
C(T)为预测误差,
∣
T
∣
|T|
∣T∣为子树
T
T
T的接子节点个数,
α
\alpha
α是参数,
C
(
T
)
C(T)
C(T)衡量训练数据的拟合程度,
∣
T
∣
|T|
∣T∣衡量树的复杂度,
α
\alpha
α权衡拟合程度与树的复杂度。
如何找到合适的 α \alpha α?
α \alpha α从0取到正无穷,对于每一个固定的 α \alpha α,都可以找到使得 C α ( T ) C_\alpha(T) Cα(T)最小的最优子树 T ( α ) T(\alpha) T(α)。当 α \alpha α很小的时候, T 0 T_0 T0是最优子树;当 α \alpha α最大时,单独的根节点就是最优子树。
B r e i m a n Breiman Breiman证明:将 α \alpha α从小增大, 0 = α 0 < α 1 < ⋯ < α n < ∞ 0 = \alpha_0 < \alpha_1 < \dots < \alpha_n < \infty 0=α0<α1<⋯<αn<∞,在每个区间 [ α i , α i + 1 [\alpha_i, \alpha_{i + 1} [αi,αi+1中,子树 T i T_i Ti时这个区间里最优的。
每次剪枝都是针对每个非叶节点,其他节点不变,只需要计算剪枝前和剪枝后的损失函数即可。
剪枝前损失函数:
C
α
(
T
)
=
C
(
T
t
)
+
α
∣
T
∣
C_\alpha(T) = C(T_t) + \alpha|T|
Cα(T)=C(Tt)+α∣T∣
剪枝后的损失函数:
C
α
(
T
)
=
C
(
t
)
+
α
C_\alpha(T) = C(t) + \alpha
Cα(T)=C(t)+α
通过
B
r
e
i
m
a
n
Breiman
Breiman证明可以得出一定存在一个
α
\alpha
α使得
C
α
(
T
)
=
C
α
(
t
)
C_\alpha(T) = C_\alpha(t)
Cα(T)=Cα(t),这个值为
α
=
C
(
t
)
−
C
(
T
t
)
∣
T
t
∣
−
1
\alpha = \frac{C(t) - C(T_t)}{|T_t| - 1}
α=∣Tt∣−1C(t)−C(Tt)
对
T
i
T_i
Ti中每个内部节点
t
t
t都计算:
g
(
t
)
=
C
(
t
)
−
C
(
T
t
)
∣
T
t
∣
−
1
g(t) = \frac{C(t) - C(T_t)}{|T_t| - 1}
g(t)=∣Tt∣−1C(t)−C(Tt)
g
(
t
)
g(t)
g(t)表示阈值,故每次都会减去最小的
T
i
T_i
Ti。
5. 类别不平衡
CART优势之一就是能够自己处理失衡数据,总是要计算每个节点关于根节点的类别频率的比值,相当于对数据自动重加权,对类别进行均衡。
对于二分类问题,节点node被分类为类别1当且仅当:
N
1
(
n
o
d
e
)
N
1
(
r
o
o
t
)
>
N
0
(
n
o
d
e
)
N
0
(
r
o
o
t
)
\frac{N_1(node)}{N_1(root)} > \frac{N_0(node)}{N_0(root)}
N1(root)N1(node)>N0(root)N0(node)
通过这种计算方式就无需管理数据真实的类别分布。假设有 K 个目标类别,就可以确保根节点中每个类别的概率都是 1/K。这种默认的模式被称为“先验相等”。
先验设置和加权不同之处在于先验不影响每个节点中的各类别样本的数量或者份额。先验影响的是每个节点的类别赋值和树生长过程中分裂的选择。
6. 回归树
CART既可用于分类,也可以用于回归,下面是应用在回归的不同之处。
-
连续值处理
CART 分类树采用基尼系数的大小来度量特征的各个划分点。
在回归模型中,我们使用常见的和方差度量方式,对于任意划分特征 A A A,对应的任意划分点 s s s两边划分成的数据集 D 1 D_1 D1和 D 2 D_2 D2,求出使 D 1 D_1 D1和 D 2 D_2 D2各自集合的均方差最小,同时 D 1 D_1 D1和 D 2 D_2 D2的均方差之和最小所对应的特征和特征值划分点。表达式为:
min a , s [ min c 1 ∑ x i ∈ D 1 ( y i − c 1 ) 2 + min c 2 ∑ x i ∈ D 2 ( y i − c 2 ) 2 ] \min_{a, s}[\min_{c_1}\sum_{x_i \in D_1}(y_i - c_1)^2 + \min_{c_2}\sum_{x_i \in D_2}(y_i - c_2)^2] a,smin[c1minxi∈D1∑(yi−c1)2+c2minxi∈D2∑(yi−c2)2]
其中, c 1 c_1 c1为 D 1 D_1 D1数据集的样本输出均值, c 2 c_2 c2为 D 2 D_2 D2数据集的样本输出均值。 -
预测方式
对于决策树建立后做预测的方式,上面讲到了 CART 分类树采用叶子节点里概率最大的类别作为当前节点的预测类别。而回归树输出不是类别,它采用的是用最终叶子的均值或者中位数来预测输出结果。