最近自己会把自己个人博客中的文章陆陆续续的复制到CSDN上来,欢迎大家关注我的 个人博客,以及我的github。
本文将讲解决策树和随机森林的基本思想,以及信息增益、信息增益率(比)、Gini系数等理论部分的内容,此外还有决策树的剪枝等内容。该部分内容主要是定义比较多,算法思想并不是很难。
本文主要是依据李航老师的《统计学习方法》和邹博老师的机器学习教学视频总结编写的。文中所用到的有关机器学习的基本概念和方法可以参考本人博客中该系列之前的文章,或者直接上网搜索相关的内容。以下文章所列出的公式以及公式的推导读者们最好是在草稿本上自己推导一遍。由于本人水平所限,文章中难免有错误和不当之处,欢迎大家多多批评指正!
一、决策树的基本思想
决策树(decision tree)是一种树形的分类回归方法,本文中只讨论用于分类的决策树。在决策树中的每个内部节点表示在一个特征上的测试,每个分支代表一个测试输出,每个叶节点表示一种类别。决策树采用自顶向下的递归方法,其基本思想是:从根节点开始,每次选择一个最优特征对当前样本进行划分,并生成相应的子节点,递归的进行这一过程,直到叶节点中包含的样本都是同一类别或没有合适的特征为止。所谓的最优特征就是按该特征将样本进行划分后得到的分类与其真实分类最接近的特征。下图可以看作是一个女生选择是否要与相亲对象见面的决策树模型:
决策树算法流程:
(1) 首先构建包含所有训练数据的根节点,并根据信息增益/信息增益率/Gini系数选择当前训练集的最优特征,据此对训练集进行划分,并生成相应的子节点;
(2) 当子节点中的样本均属于同一分类时,则该节点为叶节点,不再对其进行划分;
(3) 反之选择新的最优特征对当前样本进行划分,构建新的子节点;
(4) 递归的进行(2)、(3)两步,直到所有样本均分类正确或没有合适特征为止;
(5) 得到一棵决策树。
二、主要标记和基本概念
以下所谈到的主要标记和基本概念当前只需粗略的读一遍,有个印象即可,等后面用到的时候再回来查也不迟。其中有很多知识后面用不到,但是可以帮助我们理解,所以也就一并列在下面了。
1.主要标记
设训练数据集为D,|D|表示训练集样本个数。
设有K个类别,分别为: C k , k = 1 , 2 , … , K C_k, k=1,2,…,K Ck,k=1,2,…,K,| C k C_k Ck|为该类别下的样本个数。
设特征A有n个不同的取值,分别为: { a 1 , a 2 , … , a n } \{a_1,a_2,…,a_n\} {a1,a2,…,an},根据特征A的取值将D划分为n个子集 D 1 , D 2 , … , D n D_1,D_2,…,D_n D1,D2,…,Dn, ∣ D i ∣ |D_i| ∣Di∣为该子集的样本个数。
记子集 D i D_i Di中属于类别 C k C_k Ck的样本集合为 D i k D_{ik} Dik, ∣ D i k ∣ |D_{ik}| ∣Dik∣为 D i k D_{ik} Dik的样本个数。
2.基本概念
(1) 信息量
信息量就是一个事件包含的信息的数量,若设随机变量X的概率分布为 p(X),则其信息量为:
h
(
X
)
=
−
ln
p
(
X
)
h(X)=-\ln p(X)
h(X)=−lnp(X)
事件发生的概率越小,其信息量越大。比如太阳从西边升起是小概率事件,其信息量非常大。由定义可知信息量还满足两个事件同时发生的信息量为两者信息量之和,即:
h
(
X
Y
)
=
h
(
X
)
+
h
(
Y
)
h(XY)=h(X)+h(Y)
h(XY)=h(X)+h(Y)
(2) 熵
中学学过,熵(entropy)表示系统的混乱程度。在这里熵的含义类似,表示随机变量的不确定性程度。我们定义信息量的期望为熵:
H
(
X
)
=
−
∑
x
∈
X
p
(
x
)
ln
p
(
x
)
H(X)=-\sum_{x\in X}{p(x)\ln p(x)}
H(X)=−x∈X∑p(x)lnp(x)
当熵和条件熵中的概率由数据估计(比如极大似然估计)得到时,所对应的熵和条件熵分别被成为经验熵和经验条件熵。
训练集D的经验熵为:
H
(
D
)
=
−
∑
k
=
1
K
∣
C
k
∣
∣
D
∣
ln
∣
C
k
∣
∣
D
∣
H(D)=-\sum_{k=1}^{K}{\frac{|C_k|}{|D|}\ln{\frac{|C_k|}{|D|}}}
H(D)=−k=1∑K∣D∣∣Ck∣ln∣D∣∣Ck∣
(3) 联合熵
事件X、Y的联合熵就是两者同时发生时的熵,即:
H
(
X
,
Y
)
=
−
∑
x
,
y
p
(
x
,
y
)
ln
p
(
x
,
y
)
H(X,Y)=-\sum_{x,y}{p(x,y)\ln p(x,y)}
H(X,Y)=−x,y∑p(x,y)lnp(x,y)
(4) 条件熵
条件熵定义为X给定条件下Y的条件概率分布的熵对X的数学期望:
H
(
Y
∣
X
)
=
−
∑
x
,
y
p
(
x
,
y
)
ln
p
(
y
∣
x
)
=
H
(
X
,
Y
)
−
H
(
X
)
H(Y|X)=-\sum_{x,y}{p(x,y)\ln p{(y|x)}}=H(X,Y)-H(X)
H(Y∣X)=−x,y∑p(x,y)lnp(y∣x)=H(X,Y)−H(X)
条件熵H(Y|X)表示在已知X的条件下,随机变量Y的不确定性。
训练集D的条件经验熵为:
H
(
D
∣
A
)
=
−
∑
i
=
1
n
∣
D
i
∣
∣
D
∣
∑
k
=
1
K
∣
D
i
k
∣
∣
D
i
∣
ln
∣
D
i
k
∣
D
i
H(D|A)=-\sum_{i=1}^{n}{\frac{|D_i|}{|D|}}\sum_{k=1}^{K}{\frac{|D_{ik}|}{|D_i|}}\ln{\frac{|D_{ik}|}{D_i}}
H(D∣A)=−i=1∑n∣D∣∣Di∣k=1∑K∣Di∣∣Dik∣lnDi∣Dik∣
(5) 互信息
随机变量的X、Y的互信息定义为:
I
(
X
,
Y
)
=
H
(
X
)
+
H
(
Y
)
−
H
(
X
,
Y
)
I(X,Y)=H(X)+H(Y)-H(X,Y)
I(X,Y)=H(X)+H(Y)−H(X,Y)
下图是熵、联合熵、条件熵和互信息四者的关系图。
从图中还可以得出以下等式:
I
(
X
,
Y
)
=
H
(
X
)
−
H
(
X
∣
Y
)
=
H
(
Y
)
−
H
(
Y
∣
X
)
I(X,Y)=H(X)-H(X|Y)=H(Y)-H(Y|X)
I(X,Y)=H(X)−H(X∣Y)=H(Y)−H(Y∣X)
(6) 信息增益
特征A对训练数据集D的信息增益g(D,A)定义为集合D的经验熵H(D)与特征A给定条件下D的经验条件熵H(D|A)之差,即:
g
(
D
,
A
)
=
H
(
D
)
−
H
(
D
∣
A
)
g(D,A)=H(D)-H(D|A)
g(D,A)=H(D)−H(D∣A)
仔细观察可以发现,以上D和A的信息增益就是两者的互信息。上式中H(D)表示对数据集D进行分类的不确定姓。H(D|A)表示在特征A给定的条件下对数据集D进行分类的不确定性。信息增益表示得知特征A而使得对数据集D的分类的不确定性减少的程度。
(7) 信息增益率(比)
特征A对训练数据集D的信息增益率
g
R
(
D
,
A
)
g_R(D,A)
gR(D,A)定义为信息增益g(D,A)与训练数据集D关于数据A的值的熵
H
A
(
D
)
H_A(D)
HA(D)之比,即:
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)
信息增益率的提出是为了解决在以信息增益作为划分训练数据集的特征时,存在偏向于选择取值较多的特征作为最优特征的问题。
(8) Gini(基尼)系(指)数
假设有K个类别,样本点属于第k类的概率为
p
k
p_k
pk,则概率分布的基尼系数为:
G
i
n
i
(
p
)
=
∑
k
=
1
K
p
k
(
1
−
p
k
)
=
1
−
∑
k
=
1
K
p
k
2
=
1
−
∑
k
=
1
K
(
∣
C
k
∣
∣
D
∣
)
2
Gini(p)=\sum_{k=1}^{K}{p_k(1-p_k)}=1-\sum_{k=1}^{K}{p_k^2}=1-\sum_{k=1}^{K}(\frac{|C_k|}{|D|})^2
Gini(p)=k=1∑Kpk(1−pk)=1−k=1∑Kpk2=1−k=1∑K(∣D∣∣Ck∣)2
一个特征的信息增益/信息增益率/Gini系数越大,表明该特征对样本的熵的减少能力越强,换句话说,该特征使得数据由不确定性变为确定性的能力越强。
三、三种决策树算法
当前比较流行的有三种决策树算法,分别是ID3、C4.5和CART算法,三种算法均采用在第一部分提到的“决策树算法流程”。其中ID3算法采用信息增益来进行特征选择;C4.5算法采用信息增益率来进行特征选择;CART算法是Classification and Regression Tree的缩写,也就是分类与回归树,它采用Gini系数来进行特征选择。此外,CART树一定是一棵二叉树,而其他两种也可以是多叉树。
四、剪枝算法
生成的决策树往往会存在过拟合的问题,为了避免这一问题需要对其进行剪枝操作。对决策树进行简化的过程被称为剪枝(pruning),它又可以分为预剪枝和后剪枝两种。预剪枝就是在决策树生成的过程中根据某些条件(如节点所含的样本数)判断是否继续划分当前节点。而后剪枝是指在决策树生成后,由完全树 T 0 T_0 T0开始,剪枝部分节点得到 T 1 T_1 T1,再次剪枝部分节点得到 T 2 T_2 T2,直到仅剩下树根的树 T K T_K TK,并在验证集数据上对这K个决策树进行评价,选择损失函数最小的数 T α T_\alpha Tα作为最终的决策树。
剪枝时所用的损失函数为:
C
α
(
T
)
=
C
(
T
)
+
α
∣
T
l
e
a
f
∣
C_\alpha(T)=C(T)+\alpha |T_{leaf}|
Cα(T)=C(T)+α∣Tleaf∣
其中
α
\alpha
α被称为剪枝系数,满足
α
≥
0
\alpha \geq 0
α≥0,
∣
T
l
e
a
f
∣
|T_{leaf}|
∣Tleaf∣是叶节点的个数,C(T)是所有叶节点的熵的加权和,其表达式如下所示。之所以加权是因为每个叶节点包含的样本个数不同。当
α
\alpha
α小时,最优子树偏大(节点多);当
α
\alpha
α大时,最优子树偏小。
C
(
T
)
=
∑
t
∈
l
e
a
f
N
t
H
(
t
)
C(T)=\sum_{t\in{leaf}}{N_tH(t)}
C(T)=t∈leaf∑NtH(t)
上式中
N
t
N_t
Nt是叶节点的样本个数。
对一个内部节点进行剪枝,剪枝完毕后其子节点全部被去除,而生成一个新的节点来代替原节点。故对内部节点t剪枝前的损失函数为以节点t为根的子树
T
i
T_i
Ti的损失函数
C
α
(
T
t
)
C_\alpha(T_t)
Cα(Tt):
C
α
(
T
t
)
=
C
(
T
t
)
+
α
∣
T
t
∣
C_\alpha(T_t)=C(T_t)+\alpha|T_t|
Cα(Tt)=C(Tt)+α∣Tt∣
而对内部节点t剪枝后的损失函数为以节点t为单节点树的损失函数
C
α
(
t
)
C_\alpha (t)
Cα(t):
C
α
(
t
)
=
C
(
t
)
+
α
C_\alpha(t)=C(t)+\alpha
Cα(t)=C(t)+α
如果在对节点t进行剪枝后,损失函数相同,但是决策树模型变简单了,则说明该剪枝是可行的。故可以让
C
α
(
t
)
=
C
α
(
T
t
)
C_\alpha(t)=C_\alpha(T_t)
Cα(t)=Cα(Tt),联立以上两个方程式,求解
α
\alpha
α的值:
α
=
C
(
t
)
−
C
(
T
t
)
∣
T
t
∣
−
1
\alpha=\frac{C(t)-C(T_t)}{|T_t|-1}
α=∣Tt∣−1C(t)−C(Tt)
上式表示剪枝后整体损失函数减少的程度。所以在剪枝时,需要计算每一个内部节点t 的剪枝系数
α
t
\alpha_t
αt的值,并对
α
t
\alpha_t
αt最小的节点进行剪枝,不断剪枝下去,直到只剩下根节点。
五、随机森林
一棵树是树,多棵树就是森林了。随机森林(random forest)的基本思想是建立多棵决策树,让所有的决策树投票表决待分类样本所属的分类,票数最多的类别就是最终的预测结果。
1.Bootstrap采样
bootstrap采样就是从样本集(样本数为N)中随机的重采样出N个样本形成一个训练集。所谓重采样就是有放回的采样,这样可以使训练集中的某个样本出现多次。
2.Bagging(装袋)
bagging的策略如下:
(1) 从样本集(样本数为N)中使用bootstrap采样出N个样本形成一个训练集;
(2) 对于该训练集来说,在所有属性上对其建立一个分类器;
(3) 重复以上两步K次,形成K个分类器;
(4) 根据K个分类器的投票结果,觉得样本属于那一类。
3.随机森林
随机森林在bagging策略的基础上进行了修改,其算法流程如下:
(1) 从样本集(样本数为N)中使用bootstrap采样出N个样本形成一个训练集;
(2) 对于该训练集来说,先从所有(M个)属性上随机选择m个属性,并对这m个属性构建一棵决策树。其中m<<M,<<是远小于的意思;
(3) 重复以上两步K次,形成K棵决策树;
(4) 根据K棵决策树的投票结果,觉得样本属于那一类。
决策树中所谓的随机就是指随机抽取n个样本作为训练集,随机选择m个属性构建决策树。值得注意的是,在随机森林算法中生成决策树的过程中是不需要对其进行剪枝操作的。