2.1简介

决策树算法经典的机器学习算法,也是使用的很普遍的一类算法,集成学习中的随机森林就是以决策树算法为基础的。决策树是Quinlan(昆兰)在1986年提出来的,最开始的版本是ID3算法,之后他又提出来C4.5算法。后来,有人在昆兰的基础上提出了CART算法,本文主要介绍这三种算法的主要思想。

2.2 信息论基础

可以把决策树当成一系列if-else的集合。比如我们在写程序时总会连用多个if-else,但是哪个特征做if的条件最合适呢?也就是哪个特征最具有区分度?这就是决策树要做的事情。一个叫昆兰的大佬1978年在Standford访问期间选修了图灵的助手D.Michie的课,在完成大作业时,昆兰提出使用信息熵的思路解决,这就是决策树的前身。

我们先介绍信息论中的信息熵,奠基人是另一个大牛香农。在信息论中,熵(entropy)是用来度量事物的不确定性的。所谓不确定性与概率有关,如果一个事情发生的概率pip_i越小,不确定性就越大。举个简单的例子:天气预报说明天的降水概率是10%,那就是说明天可能为雨天、晴天、多云…等各种天气,留给人想象的空间很多,但如果天气预报说明天降水概率99%,那基本上可以确定明天会下雨,也就不用多想,带伞就好了。这个例子就是说小概率事件所含的信息量多。信息量可以用负对数logpi-\log p_i来描述,其图像如下:
机器学习笔记2——决策树
对于一个离散的分布,随机变量XX的取值可能为多个值,信息熵就表示每个取值所含信息量的加权平均,以下表达式表示量化信息熵:
H(X)=i=1npilogpiH(X) = -\sum_{i=1}^n p_i \log p_i
由于信息熵与X的取值无关,只与不同取值的概率有关,因此上式可以写为:
H(p)=i=1npilogpiH(p) = -\sum_{i=1}^n p_i \log p_i
其中XX表示随机事件,pip_i为X的第ii个取值发生的概率,若p=0p=0,则定义0log0=00\log 0=0。对于一个随机变量来说,如果每个取值发生的概率相等的话,则此时的信息熵最大。如对于只有两个取值的伯努利分布:

X 0 1
pip_i pp 1p1-p

则信息熵为:
H(p)=plogp(1p)log(1p)H(p) = -p\log p-(1-p)\log (1-p)
这个就是我们熟悉的交叉熵(cross-entropy)啦,其图像如下所示:
机器学习笔记2——决策树
也就是说当p=0.5时熵最大,为log2\log2。这个结论可以推广到对于X取多个离散值的情况,因此有:
0H(p)logn0 \leqslant H(p) \leqslant \log n
对于多个随机变量X,YX,Y,有联合熵,
H(X,Y)=i=1np(xi,yi)logp(xi,yi)H(X,Y) = -\sum_{i=1}^n p(x_i,y_i) \log p(x_i,y_i)
在此基础上又条件熵,注意,用到的概率是联合概率:
H(XY)=i=1np(xi,yi)logp(xiyi)=j=1np(yj)H(Xyi)H(X|Y) =-\sum_{i=1}^n p(x_i,y_i) \log p(x_i|y_i) = \sum_{j=1}^np(y_j)H(X|y_i)
如果概率用到是数据的频率,则得到的熵和条件熵称为经验熵和经验条件熵。把信息增益(information gain)定义为,经验熵与经验条件熵的差:
g(X,Y)=H(X)H(XY)g(X,Y) =H(X)-H(X|Y)
也就是,原来随机变量X的不确定度为H(X)H(X),这时Y发生,在这个条件下,X发生的不确定度减小为H(XY)H(X|Y),不确定度的减少程度就是信息增益,也就是增加了多少信息。计算公式如下:
机器学习笔记2——决策树

2.3 特征选择

我们绕回决策树,把训练集的划分看成随机变量DD,特征看成随机变量AAH(D)H(D)表示分类的不确定度,H(DA)H(D|A)表示加入某个特征A后对D进行新的分类的不确定度,他们的差就是信息增益,也就是特征A使得D不确定度减小的程度,很显然,如果某个特征让不确定度减小的程度多,那就说明这是个好特征。
一个简单的例子如下(来自李航《统计学习方法》):
数据如图:
机器学习笔记2——决策树
特征选择的过程如下:

人们在实测中发现,相同条件下,取值比较多的特征比取值少的特征信息增益大。为了解决这个问题,大佬昆兰又提出信息增益率的概念:
gR(D,A)=g(D,A)H(D)g_R(D,A) = \frac{g(D,A)}{H(D)}
机器学习笔记2——决策树
机器学习笔记2——决策树

2.4 ID3与C4.5

ID3算法的基本思路就是:从根节点开始选择信息增益最大的特征,根据该特征的不同取值建立不同的子节点,每个子节点递归地选择特征,直到没有特征或者信息增益小于某个阈值为止。
算法过程为:
输入:信息增益的阈值ϵ\epsilon,训练的数据集D={(x(1),y(1)),(x(2),y(2)),...,(x(m),y(m))}D=\{ (x^{(1)},y^{(1)}),(x^{(2)},y^{(2)}),...,(x^{(m)},y^{(m)})\},特征集A={A1,A2,...,An}A=\{ A_1,A_2,...,A_n\}, 每个特征的取值有ii
输出:决策树T

  1. 判断DD中的所有样本是否为同一类,即所有训练数据的标签是否为同一个。如果是,则T为单结点树,这时返回T
  2. 判断特征是否为空,如果是则返回单节点树T,把训练集DD中实例树最大的类作为该结点的类标记。否则计算AA中每个特征的信息增益,选择信息增益最大的特征AgA_g
  3. 判断刚刚计算的最大信息增益g(D,Ag)g(D,A_g)是否小于阈值ϵ\epsilon,如果是,则把T作为单结点树,把DD中实例数最多的类别作为该结点的类标记
  4. 否则,按照AgA_g的不同取值把DD划分为不同的子集DiD_i,把DiD_i中实例数最多的类别作为该结点的类标记,返回T
  5. 对于所有子节点,令D=DiD=D_iA=AAgA=A-{A_g}地洞调用1-4

C4.5方法与ID3方法相同,在生成树的过程中用信息增益比代替信息增益。

2.5 决策树的剪枝

如果决策树的分支过多,分类过细则会造成过拟合现象,模型在训练数据上表现很好,但在测试时则表现很差。这时需要主动把分支结点合并到父结点中,达到裁剪决策树的目的,从而降低过拟合。剪枝分为“预剪枝”和“后剪枝”。

预剪枝
所谓“预剪枝”,就是在生成决策树时就用一定的方法控制子树的生成,一种可行的方法,就是用验证集数据,当划分的子树在验证集上仍能保持较好的准确率,则按照特征的不同取值进行划分,否则停止划分。
后剪枝
对于后剪枝,就是先生成一个完整的决策树,接着定义损失函数,按照使得损失函数最小的方法合并叶结点到父结点。

下边介绍一种可行的后剪枝方法:
我们知道,一颗理想的决策树中,所有同一类的训练样本都落入到同一个叶子节点中,但现实 中每个叶子节点中总有错误的分类,假设树TT中有T|T|个子叶子节点,其中第tt个结点中有NtN_t个训练样本,由于存在错误的分类,这些样本点中第kk类有NtkN_{tk}个,k=1,2,3,...Kk=1,2,3,...K,可以用经验熵来衡量这种分类损失,即:
Ht(T)=k=1KNtkNtlogNtkNtH_t(T) = - \sum _{k=1}^{K} \frac{N_{tk}}{N_t} \log \frac{N_{tk}}{N_t}
因为前边介绍过,经验熵的取值范围为:
0Ht(T)logK0 \leqslant H_t(T) \leqslant \log K
如果叶子节点没有分类错误,则Ht(T)=0H_t(T) =0

这是每个叶子节点的损失,而对于整个树的损失则可以表示为叶子节点损失的加权平均,权重就是叶子节点中训练样本(样本点)的个数,所以有:
Ca(T)=t=1TNtHt(T)C_a(T) = \sum_{t=1}^{|T|} N_t H_t(T)
在之前LR中讲正则项时有提到,权重过大会造成过拟合,而在决策树中,子节点的个数太多同样会造成过拟合,因此我们需要加一个正则项来约束子节点的个数T|T|,因此损失函数如下:
Ca(T)=t=1TNtHt(T)+αTC_a(T) = \sum_{t=1}^{|T|} N_t H_t(T) + \alpha |T|
假设一个叶结点回缩到父结点之前与之后整体树的损失为Ca(TB)C_a(T_B)Ca(TA)C_a(T_A),如果Ca(TB)Ca(TA)C_a(T_B) \leqslant C_a(T_A),则进行剪枝

相关文章: