本文只关注决策树的生成算法,介绍决策树的实现步骤。
ID3算法
从根结点开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征作为结点的特征;由该特征的不同取值建立子结点;在对子结点递归调用以上方法,构建决策树;直到所有特征的信息增益均很小或没有特征可以选择为止。ID3相当于用极大似然法进行概率模型的选择。
算法步骤
输入:
训练集:
D
=
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
.
.
.
,
(
x
m
,
y
m
)
}
D = \left \{ (x_{1}, y_{1}),(x_{2}, y_{2}),...,(x_{m}, y_{m})\right \}
D={(x1,y1),(x2,y2),...,(xm,ym)}
特征集:
A
=
{
a
1
,
a
2
,
a
3
,
.
.
.
,
a
d
}
A = \left \{ a_{1},a_{2},a_{3},...,a_{d} \right \}
A={a1,a2,a3,...,ad}
阈值:
ε
\varepsilon
ε
输出: 决策树T
步骤:
若D中所有样本属于同一个类别
C
k
C_{k}
Ck,则T为单结点树,将类别
C
k
C_{k}
Ck作为该结点的类标记,返回T;
若A=Ø,则T为单节点树,并将D中样本数最大的类别
C
k
C_{k}
Ck作为该结点的类标记,返回T;
否则,计算A中各特征对D的信息增益,选择信息增益最大的特征
a
g
a_{g}
ag,暨从A中选取最优划分属性
a
g
a_{g}
ag;
如果
a
g
a_{g}
ag的信息增益小于阈值
ε
\varepsilon
ε,则置T为单结点树,并将D中样本数最大的类
C
k
C_{k}
Ck作为该结点的类标记,返回T;
否则,对
a
g
a_{g}
ag的每一个值
a
g
i
a_{g}^{i}
agi, 依
a
g
=
a
g
i
a_{g}=a_{g}^{i}
ag=agi将D分割为若干非空子集
D
i
D_{i}
Di,将
D
i
D_{i}
Di中的样本数最大的类作为标记,构建子结点,由结点及其子结点构成树T,返回T;
对第i个子结点,以 D i D_{i} Di为训练集,以A- a g a_{g} ag为特征集,递归调用上面的步骤,得到子树 T i T_{i} Ti,返回 T i T_{i} Ti。
说明:
有三种情形会导致递归返回:
- 当前结点包含的样本全属于同一种类别,无需划分;
- 当前特征集为空,或是样本所有特征上取值相同,无法划分;
- 当前结点包含的样本集为空,不能划分。
不纯性度量
一般而言,随着划分过程不断进行,我们希望决策树的分支结点所包含的样本尽可能属于同一类别,即结点的纯度越来越高。通常使用下面几种不纯性度量指标来选择决策树的结点。
1、信息增益
(1)信息熵,是度量样本集合纯度最常用的一种指标。假定当前样本集合D中第k类样本所占比例为
p
k
(
k
=
1
,
2
,
.
.
.
∣
y
∣
)
p_{k}(k=1,2,...|y|)
pk(k=1,2,...∣y∣),则D的信息熵定义为:
E
n
t
(
D
)
=
−
∑
k
=
1
∣
y
∣
p
k
l
o
g
2
(
p
k
)
Ent(D)=-\sum_{k=1}^{|y|} p_{k}log_{2}(p_{k})
Ent(D)=−k=1∑∣y∣pklog2(pk)
Ent(D)的值越小,则D的纯度越高。
(2)信息增益,假定离散特征a有V个可能的取值
{
a
1
,
a
2
,
a
3
,
.
.
.
,
a
V
}
\left \{ a^{1},a^{2},a^{3},...,a^{V} \right \}
{a1,a2,a3,...,aV},若使用a来对样本集D进行划分,则会产生V个分支结点。其中第v个分支结点包含了D中所有在特征a上取值为
a
v
a^{v}
av的样本,记为
D
v
D^{v}
Dv。计算出
D
v
D^{v}
Dv的信息熵,考虑到不同的分支结点所包含的样本数不同,给分支结点赋予权重
∣
D
v
∣
/
∣
D
∣
|D^{v}|/|D|
∣Dv∣/∣D∣,即样本数越多的分支结点的影响越大,于是可计算出用属性a对样本集D进行划分所获得的信息增益:
G
a
i
n
(
D
,
a
)
=
E
n
t
(
D
)
−
∑
v
=
1
V
∣
D
v
∣
∣
D
∣
E
n
t
(
D
v
)
Gain(D,a) = Ent(D) - \sum_{v=1}^{V}\frac{|D^{v}|}{|D|}Ent(D^{v})
Gain(D,a)=Ent(D)−v=1∑V∣D∣∣Dv∣Ent(Dv)
=
E
n
t
(
D
)
−
E
n
t
(
D
∣
a
)
=Ent(D)-Ent(D|a)
=Ent(D)−Ent(D∣a)
一般而言,信息增益越大,则意味着使用特征a来进行划分所获得的纯度提升越大。
2、信息增益比
信息增益比也称作信息增益率,信息增益准则对可取值数目较多的属性有所偏好,为了减少这种偏好可能带来的不利影响,使用增益率来选择最优划分属性。
G
a
i
n
r
a
t
i
o
(
D
,
a
)
=
G
a
i
n
(
D
,
a
)
I
V
(
a
)
=
G
a
i
n
(
D
,
a
)
E
n
v
(
D
)
Gain_ratio(D,a) = \frac{Gain(D,a)}{IV(a)}=\frac{Gain(D,a)}{Env(D)}
Gainratio(D,a)=IV(a)Gain(D,a)=Env(D)Gain(D,a)其中,
I
V
(
a
)
=
−
∑
v
=
1
V
∣
D
v
∣
∣
D
∣
l
o
g
2
∣
D
v
∣
∣
D
∣
IV(a)= - \sum_{v=1}^{V}\frac{|D^{v}|}{|D|}log_{2}\frac{|D^{v}|}{|D|}
IV(a)=−v=1∑V∣D∣∣Dv∣log2∣D∣∣Dv∣
IV(a)称为特征a的固有值,特征a的可能取值数目越多(即V越大),则IV(a)的值通常会越大。
增益率对可取值数目较少的属性有所偏好。C4.5算法先从候选划分属性中找到信息增益高于平均水平的属性,再从中选择增益率最高的。
3、基尼系数
假定当前样本集合D中第k类样本所占比例为
p
k
(
k
=
1
,
2
,
.
.
.
∣
y
∣
)
p_{k}(k=1,2,...|y|)
pk(k=1,2,...∣y∣),数据集D的纯度可用基尼值来度量:
G
i
n
i
(
D
)
=
∑
k
=
1
∣
y
∣
∑
k
‘
≠
k
p
k
p
k
‘
Gini(D) = \sum_{k=1}^{|y|} \sum_{k^{`}≠k} p_{k}p_{k^{`}}
Gini(D)=k=1∑∣y∣k‘=k∑pkpk‘
=
1
−
∑
k
=
1
∣
y
∣
p
k
2
=1-\sum_{k=1}^{|y|}p_{k}^{2}
=1−k=1∑∣y∣pk2
Gini(D)反映了从数据集D中随机抽取两个样本,其类别标记不一致的概率,Gini(D)越小,数据集D的纯度越高。
特征a的基尼系数定义为:
G
i
n
i
i
n
d
e
x
(
D
,
a
)
=
∑
v
=
1
V
∣
D
v
∣
∣
D
∣
G
i
n
i
(
D
v
)
Gini_index(D,a) = \sum_{v=1}^{V} \frac{|D^{v}|}{|D|} Gini(D^{v})
Giniindex(D,a)=v=1∑V∣D∣∣Dv∣Gini(Dv)
在选择候选特征集A中,选择使得划分后基尼系数最小的属性作为最优划分属性,即
arg min
a
∈
A
G
i
n
i
i
n
d
e
x
(
D
,
a
)
\argmin_{a\in A} Gini_index(D,a)
argmina∈AGiniindex(D,a)
C4.5算法
C4.5算法与ID3算法相似,在生成的过程中C4.5算法使用信息增益比选择特征。
算法步骤
输入:
训练集:
D
=
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
.
.
.
,
(
x
m
,
y
m
)
}
D = \left \{ (x_{1}, y_{1}),(x_{2}, y_{2}),...,(x_{m}, y_{m})\right \}
D={(x1,y1),(x2,y2),...,(xm,ym)}
特征集:
A
=
{
a
1
,
a
2
,
a
3
,
.
.
.
,
a
d
}
A = \left \{ a_{1},a_{2},a_{3},...,a_{d} \right \}
A={a1,a2,a3,...,ad}
阈值:
ε
\varepsilon
ε
输出: 决策树T
步骤:
如果训练集D中所有样本属于同一类别
C
k
C_{k}
Ck,则T为单结点树,将类别
C
k
C_{k}
Ck作为该结点的类标记,返回T;
若A=Ø,则T为单节点树,并将D中样本数最大的类别
C
k
C_{k}
Ck作为该结点的类标记,返回T;
否则,计算A中各特征对D的信息增益,从中找出信息增益高于平均水平的特征并计算其各特征对D的信息增益比,选择信息增益比最大的特征
a
g
a_{g}
ag,暨从A中选取最优划分属性
a
g
a_{g}
ag;
如果
a
g
a_{g}
ag的信息增益比小于阈值
ε
\varepsilon
ε,则置T为单结点树,并将D中样本数最大的类
C
k
C_{k}
Ck作为该结点的类标记,返回T;
否则,对
a
g
a_{g}
ag的每一个值
a
g
i
a_{g}^{i}
agi, 依
a
g
=
a
g
i
a_{g}=a_{g}^{i}
ag=agi将D分割为若干非空子集
D
i
D_{i}
Di,将
D
i
D_{i}
Di中的样本数最大的类作为标记,构建子结点,由结点及其子结点构成树T,返回T;
对第i个子结点,以 D i D_{i} Di为训练集,以A- a g a_{g} ag为特征集,递归调用上面的步骤,得到子树 T i T_{i} Ti,返回 T i T_{i} Ti。
CART算法
CART(calssification and regression tree)由特征选择、树的生成及剪枝组成,既可用于分类也可用于回归。
最小二乘回归树
输入:
训练集:
D
=
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
.
.
.
,
(
x
m
,
y
m
)
}
D = \left \{ (x_{1}, y_{1}),(x_{2}, y_{2}),...,(x_{m}, y_{m})\right \}
D={(x1,y1),(x2,y2),...,(xm,ym)}其中Y是连续变量
输出: 回归树
f
(
x
)
f(x)
f(x)
步骤:
假设已将输入空间划分为M个单元
R
1
,
R
2
,
.
.
.
,
R
M
,
R_{1},R_{2},...,R_{M},
R1,R2,...,RM,并且在每个单元
R
M
R_{M}
RM上有一个固定的输出值
c
m
c_{m}
cm。在训练数据集所在的输入空间中,递归地将每个区域划分成两个子区域并决定每个子区域上的输出值,构建二叉决策树:
(1)选择最优切分变量
j
j
j与切分点s,求解
min
j
,
s
[
min
c
1
∑
x
i
∈
R
1
(
j
,
s
)
(
y
i
−
c
1
)
2
+
min
c
2
∑
x
i
∈
R
2
(
j
,
s
)
(
y
i
−
c
2
)
2
]
\min_{j,s} \left [ \min_{c_{1}}\sum_{x_{i}\in R_{1}(j,s)}^{}(y_{i}-c_{1})^{2} + \min_{c_{2}}\sum_{x_{i}\in R_{2}(j,s)}^{}(y_{i}-c_{2})^{2}\right ]
j,smin
c1minxi∈R1(j,s)∑(yi−c1)2+c2minxi∈R2(j,s)∑(yi−c2)2
遍历变量j,对固定的切分变量j扫描切分点s,选择是上面的式子达到最小值的对(j,s)
(2)用选定的对(j,s)划分区域并决定相应的输出值:
R
1
(
j
,
s
)
=
{
x
∣
x
(
j
)
≤
s
}
,
R
2
(
j
,
s
)
=
{
x
∣
x
(
j
)
>
s
}
R_{1}(j,s)=\left \{ x|x^{(j)}\le s\right \}, R_{2}(j,s)=\left \{ x|x^{(j)}> s\right \}
R1(j,s)={x∣x(j)≤s},R2(j,s)={x∣x(j)>s}
c
m
^
=
1
N
m
∑
x
i
∈
R
m
(
j
,
s
)
y
i
,
x
∈
R
m
,
m
=
1
,
2
\hat{c_{m}} = \frac{1}{N_{m}} \sum_{x_{i}\in R_{m}(j,s)}^{}y_{i}, x\in R_{m}, m=1,2
cm^=Nm1xi∈Rm(j,s)∑yi,x∈Rm,m=1,2
(3)继续对两个子区域调用步骤(1)(2),直到满足停止条件。
(4)将输入空间划分为M个区域
R
1
,
R
2
,
.
.
.
,
R
M
,
R_{1},R_{2},...,R_{M},
R1,R2,...,RM,生成决策树:
f
(
x
)
=
∑
m
=
1
M
c
m
^
I
(
x
∈
R
m
)
f(x)=\sum_{m=1}^{M}\hat{c_{m}} I(x\in R_{m})
f(x)=m=1∑Mcm^I(x∈Rm)
CART决策树
输入:
训练集:
D
=
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
.
.
.
,
(
x
m
,
y
m
)
}
D = \left \{ (x_{1}, y_{1}),(x_{2}, y_{2}),...,(x_{m}, y_{m})\right \}
D={(x1,y1),(x2,y2),...,(xm,ym)}
停止计算的条件
输出: CART决策树
步骤:
根据训练数据集,从根节点开始,递归地对每个结点进行以下操作,构建二叉决策树:
(1)设结点的训练数据集为D,计算现有特征对该数据集的基尼系数。此时对每一个特征A,对其可能取的每个值a,根据样本点对A=a的测试为“是”或“否”将D分割为
D
1
D_{1}
D1和
D
2
D_{2}
D2两部分,计算A=a时的基尼系数。
(2)在所有可能的特征A以及它们所有可能的切分点a中,选择基尼系数最小的特征及其对应的切分点作为最优特征与最优切分点。依最优特征与最优切分点,从现结点生成两个子结点,将训练数据集依据特征分配到两个子结点中去。
(3)对两个子结点递归地调用(1)(2),直到满足停止条件。
(4)生成CART决策树。
算法的停止计算的条件是结点中的样本个数小于预定阈值,或样本集的基尼系数小于预定阈值(样本基本同属于同一类),或者没有更多特征。
Reference
1.《统计学习方法》,李航著
2.《机器学习》,周志华著