决策树算法(原理篇)
决策树算法
一、ID3(多叉树)
1、特征划分依据:信息增益
S
S
S 是训练样本集合,
∣
S
∣
|S|
∣S∣ 是训练样本数,样本划分为
m
m
m 个不同的类
C
1
,
C
2
,
.
.
.
,
C
m
C_1,C_2,...,C_m
C1,C2,...,Cm ,其样本数量分别为
∣
C
1
∣
,
∣
C
2
∣
,
.
.
.
,
∣
C
m
∣
|C_1|,|C_2|,...,|C_m|
∣C1∣,∣C2∣,...,∣Cm∣ ,则
G
a
i
n
(
S
,
A
)
Gain(S,A)
Gain(S,A) 是属性
A
A
A 在集合
S
S
S 上的信息增益:
G
a
i
n
(
S
,
A
)
=
E
n
t
r
o
p
y
(
S
)
−
E
n
t
r
o
p
y
(
S
,
A
)
Gain(S,A)=Entropy(S)-Entropy(S,A)
Gain(S,A)=Entropy(S)−Entropy(S,A)
E
n
t
r
o
p
y
(
S
)
Entropy(S)
Entropy(S) 是训练样本的信息熵,
E
n
t
r
o
p
y
(
S
,
A
)
Entropy(S,A)
Entropy(S,A) 是训练样本中属性
A
A
A 的信息熵,且有:
E
n
t
r
o
p
y
(
S
,
A
)
=
∑
v
∣
S
v
∣
S
E
n
t
r
o
p
y
(
S
v
)
Entropy(S,A)=\sum_v\frac{|S_v|}{S}Entropy(S_v)
Entropy(S,A)=v∑S∣Sv∣Entropy(Sv)
∑
\sum
∑ 是属性
A
A
A 的所有可能的值
v
v
v ,
S
v
S_v
Sv 是属性
A
A
A 有
v
v
v 值的
S
S
S 子集,
∣
S
v
∣
|S_v|
∣Sv∣ 是其样本数,
E
n
t
r
o
p
y
(
S
v
)
Entropy(S_v)
Entropy(Sv) 是其信息熵,设
∣
C
j
v
∣
|C_j^v|
∣Cjv∣ 是
S
v
S_v
Sv 中属于
j
j
j 类样本的数量,则有信息熵的计算公式:
E
n
t
r
o
p
y
(
S
)
=
−
∑
i
=
1
m
∣
C
i
∣
∣
S
∣
l
o
g
2
∣
C
i
∣
∣
S
∣
Entropy(S)=-\sum_{i=1}^{m}\frac{|C_i|}{|S|}log_2\frac{|C_i|}{|S|}
Entropy(S)=−i=1∑m∣S∣∣Ci∣log2∣S∣∣Ci∣
E
n
t
r
o
p
y
(
S
v
)
=
−
∑
i
=
1
m
∣
C
j
v
∣
∣
S
v
∣
l
o
g
2
∣
C
j
v
∣
∣
S
v
∣
Entropy(S_v)=-\sum_{i=1}^{m}\frac{|C_j^v|}{|S_v|}log_2\frac{|C_j^v|}{|S_v|}
Entropy(Sv)=−i=1∑m∣Sv∣∣Cjv∣log2∣Sv∣∣Cjv∣
2、步骤
- 从根节点开始,计算所有可能的特征的信息增益,选择信息增益最大的特征作为节点的划分特征;
- 由该特征的不同取值建立子节点;
- 再对子节点递归1-2步,构建决策树;
- 直到没有特征可以选择或类别完全相同为止,得到最终的决策树。
3、局限性
- 只能用于分类任务;
- 属性必须是离散值;
- 属性不能有缺失值;
- 容易过拟合(没有剪枝);
- 采用信息增益作为选择最优划分特征的标准,然而信息增益会偏向那些取值较多的特征。
- 在选择分裂属性时没有考虑到条件属性间的相关性,只计算数据集中每一个条件属性与决策属性之间的期望信息,有可能影响到属性选择的正确性。
二、C4.5(多叉树)
1、特征划分依据:信息增益率
G
a
i
n
R
a
t
i
o
(
S
,
A
)
=
G
a
i
n
(
S
,
A
)
S
p
l
i
t
I
n
f
o
r
m
a
t
i
o
n
(
S
,
A
)
GainRatio(S,A)=\frac{Gain(S,A)}{SplitInformation(S,A)}
GainRatio(S,A)=SplitInformation(S,A)Gain(S,A)
G
a
i
n
R
a
t
i
o
(
S
,
A
)
GainRatio(S,A)
GainRatio(S,A) 是属性
A
A
A 在集合
S
S
S 上的信息增益率,
G
a
i
n
(
S
,
A
)
Gain(S,A)
Gain(S,A) 是属性
A
A
A 在集合
S
S
S 上的信息增益,
S
p
l
i
t
I
n
f
o
r
m
a
t
i
o
n
(
S
,
A
)
SplitInformation(S,A)
SplitInformation(S,A) 是分裂信息,用于衡量属性分裂数据的广度和均匀性,且有:
S
p
l
i
t
I
n
f
o
r
m
a
t
i
o
n
(
S
,
A
)
=
∑
v
∣
S
v
∣
∣
S
∣
l
o
g
2
∣
S
v
∣
∣
S
∣
SplitInformation(S,A)=\sum_v\frac{|S_v|}{|S|}log_2\frac{|S_v|}{|S|}
SplitInformation(S,A)=v∑∣S∣∣Sv∣log2∣S∣∣Sv∣
2、步骤
- 用信息增益率作为度量选取测试属性;
- 按照 ID3 递归算法生成树;
- 算法停止条件:如果某一节点的分支所覆盖的样本都属于同一类的时候,那么递归就可以终止,该分支就会产生一个叶子节点;如果某一分支覆盖的样本的个数如果小于一个阈值,那么也可产生叶子节点,该叶子节点所覆盖的样本哪个类占大多数,那么该叶子节点的类别就是那个占大多数的类。
3、相对于ID3算法的改进
- 能处理数据类型为连续型的属性;
- 能处理缺失值;
- 增加了剪枝,可防止过拟合;
- 增益率准则对可取值数目较少的属性有所偏好,因此,C4.5算法并不是直接选择增益率最大的候选划分属性,而是使用了一个启发式:先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的。
4、局限性
- 只能用于分类任务;
- 在构造树的过程中,需要对数据集进行多次的顺序扫描和排序(尤其是对连续特征),因而导致算法的低效;
- 在选择分裂属性时没有考虑到条件属性间的相关性,只计算数据集中每一个条件属性与决策属性之间的期望信息,有可能影响到属性选择的正确性。
三、CART(二叉树)
(一) CART分类树
1、特征划分依据:基尼指数
数据集
D
D
D 的纯度可用基尼值来度量,基尼系数越小,不纯度越低,特征越好。
G
i
n
i
(
D
)
=
∑
i
=
1
n
p
(
x
i
)
×
(
1
−
p
(
x
i
)
)
=
1
−
∑
i
=
1
n
p
2
(
x
i
)
\begin{aligned} Gini(D) &=\sum_{i=1}^{n}p(x_i)\times (1-p(x_i))\\ &= 1-\sum_{i=1}^{n}p^2(x_i) \end{aligned}
Gini(D)=i=1∑np(xi)×(1−p(xi))=1−i=1∑np2(xi)
其中, p ( x i ) p(x_i) p(xi) 是分类 x i x_i xi 出现的概率, n n n 是分类的数目。 G i n i ( D ) Gini(D) Gini(D) 反映了从数据集 D D D 中随机抽取两个样本,其类别标记不一致的概率。因此, G i n i ( D ) Gini(D) Gini(D) 越小,则数据集 D D D 的纯度越高。
在属性
A
A
A 的条件下,样本
D
D
D 的基尼指数定义为:
G
i
n
i
I
n
d
e
x
(
D
∣
A
=
a
)
=
∣
D
1
∣
∣
D
∣
G
i
n
i
(
D
1
)
+
∣
D
2
∣
∣
D
∣
G
i
n
i
(
D
2
)
GiniIndex(D|A=a)=\frac{|D_1|}{|D|}Gini(D_1)+\frac{|D_2|}{|D|}Gini(D_2)
GiniIndex(D∣A=a)=∣D∣∣D1∣Gini(D1)+∣D∣∣D2∣Gini(D2)
对于样本
D
D
D,个数为
∣
D
∣
|D|
∣D∣,根据特征
A
A
A 是否取某一可能值
a
a
a,把样本
D
D
D 分成两部分
D
1
D_1
D1 和
D
2
D_2
D2。所以 CART 分类树算法建立起来的是二叉树,而不是多叉树。
2、步骤
- 用基尼指数作为度量选取测试属性;
- 按照 C4.5 递归算法生成树,不同地方在于 CART 生成的是二叉树;
- CART 分类树采用叶子节点里概率最大的类别作为当前节点的预测类别。
3、相对于 C4.5 的改进
- C4.5 为多叉树,运算速度慢,CART 为二叉树,运算速度快;
- CART 使用 Gini 指数作为变量的不纯度量,减少了大量的对数运算。
(二) CART回归树
1、分类树与回归树的区别在样本的输出,如果样本输出是离散值,这是分类树;样本输出是连续值,这是回归树。分类树的输出是样本的类别,回归树的输出是一个实数。
2、特征划分依据:误差平方和最小
计算各个特征各个值划分的两部分
D
1
D_1
D1 和
D
2
D_2
D2 的误差平方和,选择误差平方和最小的作为最优特征和最优切分点:
m
i
n
A
,
a
[
m
i
n
c
1
∑
x
i
∈
D
1
(
A
,
a
)
(
y
i
−
c
1
)
2
+
m
i
n
c
2
∑
x
i
∈
D
2
(
A
,
a
)
(
y
i
−
c
2
)
2
]
\mathop{min}\limits_{A,a} [\mathop{min}\limits_{c_1}\sum_{x_i\in D_1(A,a)}(y_i-c_1)^2+\mathop{min}\limits_{c_2}\sum_{x_i\in D_2(A,a)}(y_i-c_2)^2]
A,amin[c1minxi∈D1(A,a)∑(yi−c1)2+c2minxi∈D2(A,a)∑(yi−c2)2]
其中,
c
1
c_1
c1 为
D
1
D_1
D1 的样本标签均值,
c
2
c_2
c2 为
D
2
D_2
D2 的样本标签均值。根据最优特征
A
A
A 和最优切分点
a
a
a,将本节点的数据集划分成两部分
D
1
D_1
D1 和
D
2
D_2
D2 ,并给出相应的输出值:
D
1
(
A
,
a
)
=
(
x
,
y
)
∈
D
∣
A
(
x
)
<
=
a
D_1(A,a)=(x,y)\in D|A(x)<=a
D1(A,a)=(x,y)∈D∣A(x)<=a
D
2
(
A
,
a
)
=
(
x
,
y
)
∈
D
∣
A
(
x
)
>
a
D_2(A,a)=(x,y)\in D|A(x)>a
D2(A,a)=(x,y)∈D∣A(x)>a
c
1
=
a
c
e
r
a
g
e
(
y
i
∣
x
i
∈
D
1
(
A
,
a
)
)
c_1=acerage(y_i|x_i\in D_1(A,a))
c1=acerage(yi∣xi∈D1(A,a))
c
2
=
a
c
e
r
a
g
e
(
y
i
∣
x
i
∈
D
2
(
A
,
a
)
)
c_2=acerage(y_i|x_i\in D_2(A,a))
c2=acerage(yi∣xi∈D2(A,a))
3、步骤
- 用误差平方和最小作为度量选取测试属性;
- 按照 CART 分类树递归算法生成树,不同地方在于对 CART 回归树做预测时,用叶子节点的均值来作为预测的输出结果。
四、对连续特征的处理
- ID3 不支持数据类型为连续型的特征
- 当属性类型为离散型,无须对数据进行离散化处理;
- 当属性类型为连续型,则需要对数据进行离散化处理。具体思路如下:
m
m
m 个样本的连续特征
A
A
A 有
m
m
m 个值,从小到大排列,取相邻两样本值的平均数做划分点,一共有
m
−
1
m-1
m−1 个,其中第
i
i
i 个划分点
T
i
T_i
Ti 表示为
T
i
=
(
a
i
+
a
i
+
1
/
2
)
T_i=(a_i+a_{i+1}/2)
Ti=(ai+ai+1/2) ,分别计算以这
m
−
1
m-1
m−1 个点作为二元切分点时的信息增益率(C4.5算法) / 基尼指数(CART分类树) / 均方误差和(CART回归树)。选择信息增益率最大 / 基尼指数最小 / 误差平方和最小的点为该连续特征的最佳切分点。比如取到的信息增益率最大的点为
a
t
a_t
at,则小于等于
a
t
a_t
at 的值为类别1,大于
a
t
a_t
at 的值为类别2,这样就做到了连续特征的离散化。
五、对缺失值的处理
1、ID3 不支持对缺失值的处理
2、对于缺失值的处理可以分为两个子问题:
- 问题一:在特征值缺失的情况下进行划分特征的选择?(即如何计算特征的信息增益率)
- 问题二:选定该划分特征,对于缺失该特征值的样本如何处理?(即到底把这个样本划分到哪个结点里)
3、针对问题一
- C4.5 的做法是:对于具有缺失值特征,用没有缺失的样本子集所占比重来折算;
- CART的做法是:一开始严格要求分裂特征评估时只能使用在该特征上没有缺失值的那部分数据,在后续版本中,CART 算法使用了一种惩罚机制来抑制提升值,从而反映出缺失值的影响(例如,如果一个特征在节点的 20% 的记录是缺失的,那么这个特征就会减少 20% 或者其他数值)。
4、针对问题二
- C4.5 的做法是:将样本同时划分到所有子节点,不过要调整样本的权重值,其实也就是以不同概率划分到不同节点中。
- CART 的做法是:为树的每个节点都找到代理分裂器,无论在训练数据上得到的树是否有缺失值都会这样做。在代理分裂器中,特征的分值必须超过默认规则的性能才有资格作为代理(即代理就是代替缺失值特征作为划分特征的特征),当 CART 树中遇到缺失值时,这个实例划分到左边还是右边是决定于其排名最高的代理,如果这个代理的值也缺失了,那么就使用排名第二的代理,以此类推,如果所有代理值都缺失,那么默认规则就是把样本划分到较大的那个子节点。代理分裂器可以确保无缺失训练数据上得到的树可以用来处理包含确实值的新数据。
六、剪枝
(一)预剪枝
1、定义:预剪枝是指在决策树生成过程中,对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶结点。
2、及早停止增长的主要方法有:
- 限定决策树的深度
- 节点内数据样本低于某一阈值
- 设置某个指标,比较结点划分前后的泛化能力
3、预剪枝不仅可以降低过拟合的风险而且还可以减少训练时间,但另一方面它是基于 “贪心” 策略,会带来欠拟合风险。
(二)后剪枝
1、定义:后剪枝则是先从训练集生成一棵完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化性能提升,则将该子树替换为叶结点。
2、后剪枝主要方法:
- 错误率降低剪枝(Reduced-Error Pruning, REP)
- 悲观剪枝(Pessimistic Error Pruning, PEP)
- 代价复杂度的剪枝(Cost-Complexity Pruning, CPP)
七、总结
算法 | 树结构 | 支持模型 | 特征选择 | 连续值处理 | 缺失值处理 | 剪枝 |
---|---|---|---|---|---|---|
ID3 | 多叉树 | 分类 | 信息增益 | 不支持 | 不支持 | 不支持 |
C4.5 | 多叉树 | 分类 | 信息增益率 | 支持 | 支持 | 支持 |
CART | 二叉树 | 分类、回归 | 基尼指数、最小误差平方和 | 支持 | 支持 | 支持 |
-
划分标准的差异:ID3 使用信息增益偏向特征值多的特征,C4.5 使用信息增益率克服信息增益的缺点,偏向于特征值少的特征,CART 使用基尼指数克服 C4.5 需要求对数的巨大计算量,偏向于特征值较多的特征。
-
速度的差异:ID3 和 C4.5 是多叉树,速度较慢,CART 是二叉树,计算速度很快。
-
样本数据的差异:ID3 只能处理离散数据且对缺失值敏感,C4.5 和 CART 可以处理连续性数据且有多种方式处理缺失值;从样本量考虑的话,小样本建议 C4.5、大样本建议 CART。C4.5 处理过程中需对数据集进行多次扫描排序,处理成本耗时较高,而 CART 本身是一种大样本的统计方法,小样本处理下泛化误差较大 。
-
样本特征的差异:ID3 和 C4.5(处理离散特征) 层级之间只使用一次特征,CART 和 C4.5(处理连续特征) 可多次重复使用特征。
参考文献
周志华 著.机器学习,北京:清华大学出版社,2016. (ISBN 978-7-302-42328-7)
决策树算法–ID3算法 - 知乎 (zhihu.com)
决策树算法–C4.5算法 - 知乎 (zhihu.com)
决策树算法–CART分类树算法 - 知乎 (zhihu.com)
决策树算法–CART回归树算法 - 知乎 (zhihu.com)
【机器学习】决策树(上)——ID3、C4.5、CART(非常详细) - 知乎 (zhihu.com)
决策树(decision tree)(三)——连续值处理_天泽28的博客-CSDN博客_决策树连续值处理
决策树(decision tree)(四)——缺失值处理_天泽28的博客-CSDN博客_决策树缺失值的处理