决策树
一,决策树
决策树是一种基于树形结构的分类算法,包括一个根节点,若干个叶子结点和内部节点。其中
- 根节点包含所有的数据集
- 内部节点对应当前节点数据集,以及使节点划分后纯度提升最大的划分属性
- 叶子节点:最终的分类结果
决策树的生成过程:
首先从根节点开始,将所有数据放在根节点,选择一个最优特征,按照该特征将训练数据集分割成子集,使得该子集有一个在当前条件下最好的分类。如果该子集已经能够被基本正确分类,那么构造叶节点,将子集分到所对应的叶节点中;如果还有子集不能被正确分类,那么重复以上步骤,直至所有数据被基本正确分类或者没有可以选择的特征为止。
1. 节点划分属性选择依据
-
熵(entropy)表示随机变量不确定性度量。设 X X X是一个取有限个值得离散随机变量,其概率分布为
P ( X = x i ) = p i , i = 1 , 2 , ⋯ , n P(X=x_{i})=p_{i},i=1,2,\cdots,n P(X=xi)=pi,i=1,2,⋯,n
则随机变量的熵 H ( p ) H(p) H(p)为
H ( p ) = − ∑ i = 1 n p i l o g p i H(p)=-\sum_{i=1}^{n}p_{i}logp_{i} H(p)=−i=1∑npilogpi
熵越大,表明不确定性也就越大,当随机变量服从均匀分布是,熵最大 H ( p ) = l o g n H(p)=logn H(p)=logn -
条件熵:随机变量 X X X给定的条件下,随机变量 Y Y Y的条件熵 H ( Y ∣ X ) H(Y|X) H(Y∣X):
H ( Y ∣ X ) = ∑ i = 1 n p i H ( Y ∣ X = x i ) H(Y|X)=\sum_{i=1}^{n}p_{i}H(Y|X=x_{i}) H(Y∣X)=i=1∑npiH(Y∣X=xi)
在划分时期望能够使当前节点的不纯度下降最大,度量节点不纯度的依据有
设训练数据集为 D D D, ∣ D ∣ |D| ∣D∣表示其样本容量,即样本个数。设有 K K K个类 C k , k = 1 , 2 , ⋯ , K C_{k},k=1,2,\cdots, K Ck,k=1,2,⋯,K, ∣ C k ∣ |C_{k}| ∣Ck∣表示类 C k C_{k} Ck的样本个数。设特征 A A A有 n n n个不同的取值 { a 1 , a 2 , ⋯ , a n } \{a_{1},a_{2},\cdots,a_{n}\} {a1,a2,⋯,an},根据特征 A A A的取值将数据 D D D划分为 n n n个子集 D 1 , D 2 , ⋯ , D n D_{1},D_{2},\cdots,D_{n} D1,D2,⋯,Dn, ∣ D i ∣ |D_{i}| ∣Di∣为 D i D_{i} Di的样本个数, ∑ i = 1 n ∣ D i ∣ = ∣ D ∣ \sum_{i=1}^{n}|D_{i}|=|D| ∑i=1n∣Di∣=∣D∣。记子集 D i D_{i} Di中属于类 C k C_{k} Ck的样本集合为 D i k D_{ik} Dik。即 D i k = D i ∩ C k D_{ik}=D_{i}\cap C_{k} Dik=Di∩Ck, ∣ D i k ∣ |D_{ik}| ∣Dik∣为 D i k D_{ik} Dik的样本个数。
1.1 信息增益
输入:训练数据集
D
D
D 和特征
A
A
A
输出:特征
A
A
A对训练数据集
D
D
D的信息增益
g
(
D
,
A
)
g(D,A)
g(D,A)
(1)计算数据集
D
D
D的信息熵
H
(
D
)
H(D)
H(D)
H
(
D
)
=
−
∑
i
=
1
K
∣
C
k
∣
∣
D
∣
l
o
g
2
∣
C
k
∣
∣
D
∣
H(D)=-\sum_{i=1}^{K}\frac{|C_{k}|}{|D|}log_{2}\frac{|C_{k}|}{|D|}
H(D)=−i=1∑K∣D∣∣Ck∣log2∣D∣∣Ck∣
(2)计算特征
A
A
A对训练集
D
D
D的经验条件熵
H
(
D
∣
A
)
H(D|A)
H(D∣A)
H
(
D
∣
A
)
=
∑
k
=
1
n
∣
D
i
∣
∣
D
∣
H
(
D
i
)
=
−
∑
k
=
1
n
∣
D
i
∣
∣
D
∣
(
∑
i
=
1
K
∣
D
i
k
∣
∣
D
i
∣
l
o
g
2
∣
D
i
k
∣
∣
D
i
∣
)
H(D|A)=\sum_{k=1}^{n}\frac{|D_{i}|}{|D|}H(D_{i})=-\sum_{k=1}^{n}\frac{|D_{i}|}{|D|}(\sum_{i=1}^{K}\frac{|D_{ik}|}{|D_{i}|}log_{2}\frac{|D_{ik}|}{|D_{i}|})
H(D∣A)=k=1∑n∣D∣∣Di∣H(Di)=−k=1∑n∣D∣∣Di∣(i=1∑K∣Di∣∣Dik∣log2∣Di∣∣Dik∣)
(3)计算信息增益
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 信息增益率
基于特征
A
A
A的值的熵
H
A
(
D
)
H_{A}(D)
HA(D)为:
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=1∑n∣D∣∣Di∣log2∣D∣∣Di∣
因此特征
A
A
A对训练数据集的信息增益比
g
R
(
D
,
A
)
g_{R}(D,A)
gR(D,A)为:
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)
1.3 Gini指数
对于给定样本集合
D
D
D
G
i
n
i
(
D
)
=
1
−
∑
i
=
1
K
(
∣
C
i
∣
∣
D
∣
)
2
Gini(D)=1-\sum_{i=1}^{K}(\frac{|C_{i}|}{|D|})^{2}
Gini(D)=1−i=1∑K(∣D∣∣Ci∣)2
2.1 ID3算法
核心:在决策树各个节点上应用信息增益准则选择特征,递归地构建决策树
具体方法:从根节点开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征作为节点的特征,由该特征的不同取值建立子节点;再对子节点递归调用以上方法,构建决策树;直到所有特征的信息增益均很小或者没有特征可以选择为止,最后得到一颗决策树。
输入:训练数据集
D
D
D,特征集
A
A
A阈值
ε
\varepsilon
ε
输出:决策树
T
T
T
(1)若
D
D
D中所有实例属于同一类
C
k
C_{k}
Ck,则
T
T
T为单节点数
(2)若
A
=
∅
A=\varnothing
A=∅,则
T
T
T为单节点树,并将
D
D
D中实例数最大的类
C
k
C_{k}
Ck作为该节点的类标记,返回
T
T
T
(3)否则,计算
A
A
A中各特征对
D
D
D的信息增益,选择信息增益最大的特征
A
g
A_{g}
Ag
(4)如果
A
g
A_{g}
Ag的信息增益小于阈值
ε
\varepsilon
ε,则置
T
T
T为单节点树,并将
D
D
D中实例数最大的类
C
k
C_{k}
Ck作为该节点的类标记,返回
T
T
T
(5)否则,对
A
g
A_{g}
Ag的每一可能值
a
i
a_{i}
ai,依
A
g
=
a
i
A_{g}=a_{i}
Ag=ai将
D
D
D分割成若干非空子集
D
i
D_{i}
Di,将
D
i
D_{i}
Di中是隶属最大的类作为类标记,构建子结点,由结点及其子结点构成树
T
T
T,返回
T
T
T
(6)对第
i
i
i个子结点,以
D
i
D_{i}
Di为训练集,以
A
−
{
A
g
}
A-\{A_{g}\}
A−{Ag}为特征集,递归地调用步骤(1)-(5),得到子树
T
i
T_{i}
Ti,返回
T
i
T_{i}
Ti
2.2 C4.5算法
如上所示,选择信息增益比最大的特征进行分割
2.3 CART算法
递归构建二叉决策树的过程
选择基尼指数最小的特征进行分割
二、过拟合的处理方法
决策树的剪枝通过极小化决策树整体的损失函数或代价函数。设树的叶结点个数为
∣
T
∣
|T|
∣T∣,
t
t
t是树
T
T
T的叶结点,该叶结点有
N
t
N_{t}
Nt个样本,其中
k
k
k类的样本有
N
t
k
N_{tk}
Ntk个,
k
=
1
,
2
,
⋯
,
K
k=1,2,\cdots, K
k=1,2,⋯,K,
H
t
(
T
)
H_{t}(T)
Ht(T)为叶结点
t
t
t的经验熵,
α
≥
0
\alpha \ge 0
α≥0为参数,则决策树学习的损失函数可以定义为:
C
α
(
T
)
=
∑
t
=
1
∣
T
∣
N
t
H
t
(
T
)
+
α
∣
T
∣
=
C
(
T
)
+
α
∣
T
∣
C_{\alpha}(T)=\sum_{t=1}^{|T|}N_{t}H_{t}(T)+\alpha |T|=C(T)+\alpha |T|
Cα(T)=t=1∑∣T∣NtHt(T)+α∣T∣=C(T)+α∣T∣
其中,
H
t
(
T
)
=
−
∑
k
N
t
k
N
t
l
o
g
2
N
t
k
N
t
C
(
T
)
=
∑
t
=
1
∣
T
∣
N
t
H
t
(
T
)
=
−
∑
t
=
1
∣
T
∣
N
t
∑
k
K
N
t
k
N
t
l
o
g
N
t
k
N
t
=
−
∑
t
=
1
∣
T
∣
∑
k
K
N
t
k
l
o
g
N
t
k
N
t
H_{t}(T)=-\sum_{k}\frac{N_{tk}}{N_{t}}log_{2}\frac{N_{tk}}{N_{t}}\\ C(T)=\sum_{t=1}^{|T|}N_{t}H_{t}(T)=-\sum_{t=1}^{|T|}N_{t}\sum_{k}^{K}\frac{N_{tk}}{N_{t}}log\frac{N_{tk}}{N_{t}}=-\sum_{t=1}^{|T|}\sum_{k}^{K}N_{tk}log\frac{N_{tk}}{N_{t}}
Ht(T)=−k∑NtNtklog2NtNtkC(T)=t=1∑∣T∣NtHt(T)=−t=1∑∣T∣Ntk∑KNtNtklogNtNtk=−t=1∑∣T∣k∑KNtklogNtNtk
C
α
(
T
)
C_{\alpha}(T)
Cα(T)表示模型对训练数据的预测误差,即模型与训练数据的拟合程度,
∣
T
∣
|T|
∣T∣表示模型复杂度,参数
α
\alpha
α控制两者的影响
- 预剪枝
- 后剪枝
树的后剪枝算法:
(1)计算每个结点的经验熵
(2)递归从树的叶结点向上回缩
计算结点回缩前的树 T B T_{B} TB和回缩后的树 T A T_{A} TA,分别计算其损失函数 C α ( T B ) , C α ( T A ) C_{\alpha}(T_{B}),C_{\alpha}(T_{A}) Cα(TB),Cα(TA),如果 C α ( T B ) ≤ C α ( T A ) C_{\alpha}(T_{B})\le C_{\alpha}(T_{A}) Cα(TB)≤Cα(TA)
则进行剪枝,将父节点变为新的叶结点
(3)返回步骤(2),直至不能继续为止,得到损失函数最小的子树 T α T_{\alpha} Tα
三、连续属性处理
将连续属性在数据集中的取值分别取出为 a 1 , a 2 , ⋯ , a n a_{1},a_{2},\cdots,a_{n} a1,a2,⋯,an,然后取属性值分别为取值的中点值,即 t i = a i + a i + 1 2 t_{i}=\frac{a_{i}+a_{i+1}}{2} ti=2ai+ai+1,将 a ≤ t i a\le t_{i} a≤ti归为同一取值, a > t i a> t_{i} a>ti归为另一取值,然后分别计算结点依据 t i t_{i} ti划分后的子结点的不纯度,选择结点不纯度下降最大的 t i t_{i} ti值作为当前结点的划分属性
四、属性缺失值处理
以ID3为例
计算当前结点的信息增益时,忽略特征属性缺失的样本,然后分别计算各个属性对数据集的信息增益,选择信息增益最大的样本进行划分,同时将属性缺失的样本保留到子结点中。