机器学习:决策树与集成学习 1
决策树
决策树是一类常见的机器学习算法,也可以指学习得到的树模型。
决策树是基于树结构来进行决策的,一棵决策树包括一个根节点,若干内部节点和若干叶子节点。每个部分对应的功能:
- 根节点:样本全集
- 叶节点:决策结果
- 内部节点:属性测试
决策树的生成(划分选择)
决策树的生成是一个递归的过程。决策树的内部节点划分选择是一个属性测试的过程,节点的划分选择主要有三种方法:ID3、C4.5、CART
ID3
ID:Dterative Dichotomiser 迭代二分类器
介绍ID3之前,先回顾奥卡姆剃刀原理:相同性能的模型,优先选择更简单的模型。由此,我们总结:同等条件下,越是小型的决策树,越是优于大的决策树。
在信息论中,信息熵越大,样本纯度越低。
ID3的节点划分思想就是:以信息增益来进行特征选择,选择信息增益最大的特征来进行分裂。ID3决策树的生成过程就是使数据集D纯度提升的过程。
算法特点:自顶向下,贪婪搜索。
算法步骤:
- 初始化特征集合和数据集
- 数据集沿着信息熵逐渐减小的方向划分,对应特征沿着条件熵逐渐减小的方向进行属性选择。具体操作方法为:选择信息增益最大的特征作为当前的决策节点。
- 更新数据集和特征集。删除上一步使用的特征,并按照特征属性值来划分不同分治的数据子集。
- 重复步骤1、2、3,直到数据子集只包含一个特征属性,则将对应的分支节点设置为叶子节点。
划分标准:信息增益
数据集的信息熵计算:
数据集D,类别子集
C
k
C_k
Ck,信息熵:
H
(
D
)
=
−
∑
k
=
1
K
(
∣
C
k
∣
∣
D
∣
∗
l
o
g
2
∣
C
k
∣
∣
D
∣
)
H(D)=-\sum_{k=1}^{K}(\frac{|C_k|}{|D|}*log_2\frac{|C_k|}{|D|})
H(D)=−∑k=1K(∣D∣∣Ck∣∗log2∣D∣∣Ck∣)
数据集某一特征属性的信息熵的计算:
数据集中含有特征A的样本子集
D
A
D_A
DA,特征A对应数据集D的条件熵:
H
(
D
∣
A
)
=
∑
i
=
1
n
D
i
D
∗
H
(
D
i
)
=
−
∑
i
=
1
n
(
∑
k
=
1
K
(
∣
D
i
k
∣
∣
D
i
∣
∗
l
o
g
2
∣
D
i
k
∣
∣
D
i
∣
)
)
H(D|A) = \sum_{i=1}^n\frac{D_i}{D}*H(D_i)=-\sum_{i=1}^n(\sum_{k=1}^K(\frac{|D_{ik}|}{|D_i|}*log_2\frac{|D_{ik}|}{|D_i|}))
H(D∣A)=∑i=1nDDi∗H(Di)=−∑i=1n(∑k=1K(∣Di∣∣Dik∣∗log2∣Di∣∣Dik∣))
其中
D
i
D_i
Di表示特征A第
i
i
i个取值的样本子集,特征A有
n
n
n个取值。
则特征A在数据集D中的信息增益为:
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进行节点分裂使数据集获得的“纯度提升越大”,这也是为什么ID3在进行分支节点划分时选择信息增益最大的特征作为决策属性。
ID3的缺点
- ID3没有剪枝策略,容易过拟合---->模型泛化能力差。
- 对能够取值较多的特征属性有所偏好。
- 只能用于处理离散分布的特征。
- 没有考虑缺失值处理。
C4.5
C4.5特点
克服了ID3对能够取值较多的特征的偏重的缺点,引入信息增益率进行节点划分。
C4.5思想
C4.5 相较于ID3的改进:
- 引入悲观剪枝的策略进行后剪枝。
- 引入信息增益率作为分支节点的划分标准。
- 连续特征离散化,例如特征A连续取值为1,2,3,4,5,共5个取值,则有划分点1.5,2.5,3.5,4.5,共4=5-1个划分点,然后计算每种划分方式能够获得的信息增益大小,选择信息增益最大的点作为该连续特征的二元离散分类点。注意:连续值需要先进行排序操作,会消耗时间和内存。
- 对缺失值的处理:
(1)特征值缺失的情况下,进行划分特征的选择,即如何计算信息增益率:
–> 对于具有缺失特征,用没有缺失的样本子集的所占比重来折算。
(2)计算完信息增益率后,需要进行决策树的生成,那么对于缺失该特征的样本该如何处理?即到底该将该样本划分到哪个子节点?
–> 将样本同时划分到所有子节点,不过要调整样本的权重,即以不同的概率划分到不同的子节点中。
C4.5划分标准
核心思想:利用信息增益率来克服信息熵增益的缺点。信息增益率的计算:
G
a
i
n
r
a
t
i
o
(
D
∣
A
)
=
G
a
i
n
(
D
,
A
)
H
A
(
D
)
Gain_{ratio}(D|A)=\frac{Gain(D,A)}{H_A(D)}
Gainratio(D∣A)=HA(D)Gain(D,A),其中
H
A
(
D
)
=
−
∑
i
=
1
n
(
∣
D
i
∣
∣
D
∣
∗
l
o
g
2
∣
D
i
∣
∣
D
∣
)
H_A(D)=-\sum_{i=1}^n(\frac{|D_i|}{|D|}*log_2\frac{|D_i|}{|D|})
HA(D)=−∑i=1n(∣D∣∣Di∣∗log2∣D∣∣Di∣) 表示特征A的信息熵。
需要说明的是,信息增益率对于可取值数目较少的特征有所偏好。
解决该问题的一个启发式方法:(1)选择信息增益高于均值的属性,信息增益偏好取值多的特征,(2)再选择信息增益率高的属性,因为信息增益率偏好取值少的特征,(3)再将前面两步选择出来的特征进行中和。
剪枝策略
为什么要剪枝呢?因为生成的决策树容易过拟合,导致模型的泛化能力较差。
常见的剪枝策略包括预剪枝和后剪枝。
预剪枝
预剪枝是在节点划分前确定节点是否继续增长,早停增长的主要方法有:
- 节点内数据样本数量低于某一阈值
- 所有节点特征都已经分裂
- 节点划分前准确率比划分后准确率要高
预剪枝的优点主要有:降低过拟合,减少训练时间,缺点是可能会导致欠拟合。
后剪枝
后剪枝是在决策树生成之后,再用递归的方式对每一个非叶子节点,比较将其设置成叶子节点后,依据准确率的变化决定是否进行剪枝处理。
决策树后剪枝的优点是欠拟合风险小,泛化性能优于预剪枝。缺点是训练时间久。
C4.5的缺点
- C4.5是多叉树,没有二叉树的效率高
- C4.5和ID3只能用于分类问题,不能用于回归问题
- C4.5和ID3都是熵模型,熵中含有对数运算,连续值的处理还需要进行排序,以上操作会增大时间和内存开销。
- 需要整个数据集都在内存上驻留。
CART
Classification and Regression Tree 分类回归树
前面介绍的ID3和C4.5都是多叉树,分支多,规模大。
CART树采用二分法,是二叉树。
CART早在1993年就已经形成了很完备的知识体系。
CART思想
CART决策树的生成包括分裂、剪枝和树的选择。
分裂过程是一个二叉递归划分的过程,其输入和预测的特征可以是连续的,也可以是离散的,CART没有停止准则,会一直分裂下去。
剪枝是采用代价复杂度进行剪枝处理的。
树的选择是通过单独的测试集进行树的选择。
CART与C4.5 的区别
- C4.5是多叉树,运算速度慢,CART是二叉树,运算速度快。
- C4.5只能用于分类问题,CART可用于分类和回归问题。
- CART中的Gini系数减少了log运算
- CART用代理测试集来估计缺失值,C4.5则是以不同概率将样本(有缺失值的样本)划分到不同子节点。
- CART是基于代价复杂度进行剪枝处理的,C4.5采用的是悲观剪枝策略。
CART节点划分标准
在熵模型中,有大量的对数运算,CART采用基尼系数进行节点属性的选择,在简化模型(没有对数运算)的同时,还保留了熵模型的优点。
在熵模型中,一个特征的信息增益(率)越大,模型纯度提升越大,而基尼指数刚好相反,一个特征的基尼指数越小,模型的不纯度越小,也就是纯度越好,则该特征越适合用于节点分裂。(这里会有一些绕)
基尼指数理解:数据集中随机两个样本,类别标记不一致的概率。
基尼值:
G
i
n
i
(
D
)
=
∑
k
=
1
K
(
∣
C
k
∣
∣
D
∣
(
1
−
∣
C
k
∣
∣
D
∣
)
)
=
1
−
∑
k
=
1
K
(
∣
C
k
∣
∣
D
∣
)
2
Gini(D)=\sum_{k=1}^{K}(\frac{|C_k|}{|D|}(1-\frac{|C_k|}{|D|}))=1-\sum_{k=1}^{K}(\frac{|C_k|}{|D|})^2
Gini(D)=∑k=1K(∣D∣∣Ck∣(1−∣D∣∣Ck∣))=1−∑k=1K(∣D∣∣Ck∣)2
D
D
D表示数据集,
C
k
C_k
Ck表示样本子集
基尼系数:
G
i
n
i
(
D
∣
A
)
=
∑
i
=
1
n
∣
D
i
∣
∣
D
∣
G
i
n
i
(
D
i
)
Gini(D|A)=\sum_{i=1}^{n}\frac{|D_i|}{|D|}Gini(D_i)
Gini(D∣A)=∑i=1n∣D∣∣Di∣Gini(Di)
二分类时:
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)
有上面公式可以看到,在平方运算和二分类情况下,基尼系数模型的运算更加简单,性能也和熵模型非常接近。那么,基尼系数模型和熵模型的性能差距有多大呢?
我们知道对数运算的一阶泰勒展开为:
l
n
(
x
)
=
−
1
+
x
+
o
(
x
)
ln(x)=-1+x+o(x)
ln(x)=−1+x+o(x), 所以信息熵的计算公式可以写为:
H
(
x
)
=
−
∑
k
=
1
K
(
p
k
∗
l
n
p
k
)
≈
∑
k
=
1
K
p
k
(
1
−
p
k
)
H(x) = -\sum_{k=1}^{K}(p_k*ln p_k)\approx\sum_{k=1}^{K}p_k(1-p_k)
H(x)=−∑k=1K(pk∗lnpk)≈∑k=1Kpk(1−pk)
因此,基尼指数可以理解为熵模型的一阶泰勒展开。
CART缺失值处理
使用代理测试来处理缺失值
CART剪枝策略
基于代价复杂度的剪枝策略,进行后剪枝
CART处理类别不平衡
不管数据集失衡多么严重,CART树都能够自动消除类别不平衡。
CART回归树
处理回归问题与分类问题的一些不同:
- 连续值处理
CRAT采用基尼系数的大小来度量特征的各个划分点。 - 预测方式
在分类问题时,预测的类别是叶子节点中概率最大的节点对应的类别,而在处理回归问题时,预测的输出值是所有叶子节点的均值或者中位数。