机器学习之决策树

背景

决策树是数据挖掘中一种最基本的分类与回归方法,与其他算法相比,决策树的原理浅显易懂,计算复杂度较小,而且输出结果易于理解,因此在实际工作中有着广泛的应用

基本算法

决策树分类算法的流程如下:

  1. 初始化根结点,此时所有的观测样本均属于根结点
  2. 根据下文中介绍的划分选择,选择当前最优的划分属性。根据属性取值的不同对观测样本进行分割
  3. 对分割后得到的节点重复使用步骤2,直到
    • 分割得到的观测样本属于同一类
    • 属性用完或者达到预先设定的条件,如树的深度。以叶子节点中大多数样本的类别作为该叶子节点的类别

划分选择

从上述算法可以看出,决策树学习的关键是步骤2,即如何选择最优划分属性。一般而言,随着划分的不断进行,我们希望决策树的分支节点所包含的样本尽可能的属于同一个类别。即节点的纯度越高。于是特征选择问题就转化为了纯度的定义问题。目前有3种常见的决策树算法

  • ID3
  • C4.5
  • CART

ID3与信息增益

信息熵是度量样本集合纯度最常用的一种指标。假定当前样本集合D中第k类样本所占的比例为\(p_k\) \((k = 1, 2, 3, ...,|y|)\),则D的信息熵定义为

\[Ent(D) = - \sum_{k=1}^{|y|}p_k\log_{2}p_k \]

  • 信息熵越大,说明这个节点的纯度越低;当节点的类别均匀分布时,信息熵为1;当只包含一类时,信息熵为0

信息增益

信息增益的定义是分类前的节点信息熵减去分类后子节点熵的加权和。即不纯度的减少量,也即纯度的增加量。特征选择的规则是选择使该节点信息增益最大的属性分割该节点
假定离散属性a有v个可能的取值\((a_1,a_2,a_3,...,a_V)\),若使用a来对样本集进行划分,则会产生V个分支节点。其中第V个分支节点包含了样本集合D中在属性a上取值为\(a_V\)的样本\(D^V\)。我们可以根据信息熵的公式计算信息熵。考虑到不同分支节点包含的样本数不同,样本数越多的分支节点权重越大,给分支节点赋予权重\(\frac{D^v}{D}\)。可以计算出以属性a做为划分属性,最后得到的信息增益如下:

\[Gain(D,a) = Ent(D) - \sum_{v=1}^{V}\frac{D^v}{D}Ent(D^v) \]

我们来举个例子说明一下
假设我们的数据集如下

no age income student credit_rating buys_computer
1 <=30 high no fair no
2 <=30 high no excellent no
3 [30,40) high no fair yes
4 >40 medium no fair yes
5 >40 low yes fair yes
6 >40 low yes excellent no
7 [30,40) low yes excellent yes
8 <=30 medium no fair no
9 <=30 low yes fair yes
10 >40 medium yes fair yes
11 <=30 medium yes excellent yes
12 [30,40) high yes fair yes
13 [30,40) medium no excellent yes
14 >40 medium no excellent no
  • 特征x包括age, income, student, credit_rating, y变量buys_computer

我们根据信息增益来确定下一步要选择的划分特征

  • 划分前的信息增益
    共有9个正例,5个负例

\[Ent(D) = -\frac{1}{14}\log_2\frac{9}{14} - \frac{5}{14}\log_2\frac{5}{14}=0.940 \]

  • 按照age划分
    使用p表示正例的个数,n表示负例的个数,E(p,n)表示熵
    age共有3个取值

    • <=30的正例2个,负例3个,信息熵为E(2,3)=0.971
    • [31,40)的正例4个,负例0个,信息熵为E(4,0)=0
    • 40的正例3个,负例2个,信息熵为E(3,2)=0.971

\[\begin{eqnarray*} Gain(age) & = & Ent(D) - \frac{5}{14}*E(2,3) + \frac{4}{14}*E([4,0)) + \frac{5}{14}*E(3,2) \\ & = & 0.940 - \frac{5}{14}*0.971 + \frac{4}{14}*0 + \frac{5}{14}*0.971 \\ & = & 0.246 \end{eqnarray*}\]

  • 按照其他的属性分割
    • Gain(income) = 0.029
    • Gain(student) = 0.151
    • Gain(credit_rating) = 0.048

可以看出在当前选择age做为划分属性信息增益最大,所以我们的第一个属性选择age

C4.5

在上面的分析中,我们有意漏掉了no属性,它表示每个样本的编号。如果使用no做为划分属性,得到的信息增益为0.940,远大于其他候选划分属性。这很好理解,使用no将产生14个分支节点,每个分支节点仅包含一个样本。这些分支节点的纯度已达到最大,但是很显然这样的决策树不具有泛化能力。信息增益存在的问题是倾向于选择包含多取值的参数。为了避免这个问题,著名的C4.5算法不直接使用信息增益,而是使用增益率。增益率定义为:

\[Gain\_ratio(D,a) = \frac{Gain(D,a)}{IV(a)} \]

\[IV(a) = -\sum_{v=1}^{V}\frac{|D^v|}{|D|}\log_2\frac{|D^v|}{|D|} \]

\(IV(a)\)的定义可以看出,当a的取值只有一个时,取值为0;当a的取值有多个,且每个取值的观测数完全一样时,取值最大。a的取值数目越多,则IV(a)的值越大。增益率准则对可取值数目较少的属性有所偏好。为了克服这个问题,C4.5算法采用了一个启发式的算法:先从候选划分属性中找出信息增益高于平均水平的属性。再从中选择增益率最高的

CART

CART决策树使用基尼指数来选择划分属性,基尼值的定义如下:

\[\begin{eqnarray*} Gini(D) & = & \sum_{K=1}^{|y|}\sum_{{k}'\neq k}p_kp_{k'} \\ & = & 1 - \sum_{K=1}^{|y|}{p_k}^2 \end{eqnarray*}\]

直观来说,Gini(D)反映了从数据集D中随机抽取两个样本,其类别标记不一致的概率,因此Gini(D)越小,则数据集D纯度越高。基尼值在节点取值分布均匀时取最大值1-1/V,在只包含一个类别时取最小值0.
属性a的基尼指数定义为

\[Gini\_index(D,a) = \sum_{v=1}^{V}\frac{|D_v|}{|D|}Gini(D^v) \]

于是,我们在候选属性集合A中,选择那个使得划分后基尼指数最小的属性作为最优划分属性

\[a_* = \arg\min_{a\in A}Gini\_index(D,a) \]

剪枝

在决策树学习中为了尽可能的正确分类训练样本,节点划分过程将不断重复,有时会造成决策树分支过多,这时就可能因训练样本学的太好了,导致泛化能力较低。为了解决这个问题,有两种解决办法:预剪枝,后剪枝

预剪枝

常用的有三种方法

  1. 预先设定一个树的最大深度,如果分裂后树的深度达到阈值,则停止分裂
  2. 设定一个分裂阈值,若分裂得到的信息增益不大于这个阈值,则停止分裂
  3. 按照树的准确度,如果分裂后树的准确度提升,则分裂

优缺点

预剪枝使得决策树的很多分支都没有展开,这不仅降低了过拟合的风险,还显著减少了决策树训练和预测的时间开销。但是另一方面,有些分支的当前划分虽然不能带来泛化性能的提升,甚至可能导致泛化性能暂时下降,但在其基础上进行的后续划分却有可能导致泛化性能显著上升。所以基于贪心策略的预剪枝可能带来欠拟合的风险

后剪枝

首先生成与训练集完全拟合的决策树,然后自下而上地逐层剪枝,如果一个节点的子节点被删除后,决策树的准确度没有降低,那么就将该节点设置为叶节点(基于的原则是Occam剪刀:具有相似效果的两个模型选择较简单的那个)

优缺点

优点

  • 决策树易于理解和解释.人们在通过解释后都有能力去理解决策树所表达的意义。
  • 对于决策树,数据的准备往往是简单或者是不必要的.其他的技术往往要求先把数据一般化,比如去掉多余的或者空白的属性。
  • 同时接受离散和连续的数据,不需要做预处理和归一化

代码

随机森林

简介

随机森林(Random Forest RF)是一种新兴起的、高度灵活的机器学习算法。近年来,得益于其广泛适用、易于理解以及高准确率等方面的优势,它在各个领域的关注度与受欢迎程度都有着显著的提升。从市场营销到医疗保健保险,随机森林既可以用来做市场营销模拟的建模,统计客户的来源,保留和流失等情况,也可用来预测不同疾病的风险和病患者的易感性。

生成规则

通过上面决策树的介绍,我们已经掌握了生成树的方法,那么从一棵树到一片森林,其生成规则如下:

  1. 如果训练集大小为N,对于每棵树而言,随机且有放回地从训练集中的抽取N个训练样本(bootstrap抽样方法),作为该树的训练集;每棵树的训练集都是不同的,但里面包含重复的训练样本。
  2. 如果每个样本的特征维度为M,指定一个常数m,且\(m \ll M\),随机地从M个特征中选取m个特征子集,每次树进行分裂时,从这m个特征中选择最优的;
  3. 每棵树都尽最大程度的生长,并且没有剪枝过程。

在森林中,每棵树都是独立的,99.9%不相关的树做出的预测结果涵盖了所有的情况,这些预测结果将会彼此抵消。少数优秀的树的预测结果将会超脱于芸芸“噪音”,做出一个好的预测。将若干个弱分类器的分类结果进行投票选择,从而组成一个强分类器,这就是随机森林bagging的思想。
不过我们需要认识到:bagging不用单棵决策树来做预测,具体哪个变量起到重要作用变得未知,所以bagging改进了预测准确率但损失了解释性。
在生成随机森林时,为什么要有放回的抽样呢?这里引用博客[Machine Learning & Algorithm] 随机森林(Random Forest)的解释:
如果不是有放回的抽样,那么每棵树的训练样本都是不同的,都是没有交集的,这样每棵树都是"有偏的",都是绝对"片面的"(当然这样说可能不对),也就是说每棵树训练出来都是有很大的差异的;而随机森林最后分类取决于多棵树(弱分类器)的投票表决,这种表决应该是"求同",因此使用完全不同的训练集来训练每棵树这样对最终分类结果是没有帮助的,这样无异于是"盲人摸象"。
这样,我们对随机森林中的“随机”进行了详细的解释,它包含两个方面:随机抽取样本,随机抽取特征。这两个随机性的引入对随机森林的分类性能至关重要。由于它们的引入,使得随机森林不容易陷入过度拟合,并且具有很好得抗噪能力(比如:对缺省值不敏感)。

随机森林分类效果

  1. 森林中任意两棵树的相关性: 相关性越大,错误率越大
  2. 森林中每棵树的分类能力: 每棵树的分类能力越强,整棵森林的错误率越低

减小特征选择个数m,树的相关性和分类能力也会相应的降低;增大m,两者也会随之增大。所以关键问题是如何选择最优的m(或者是范围),这也是随机森林唯一的一个参数。

袋外错误率

上面我们提到,构建随机森林的关键问题就是如何选择最优的m,要解决这个问题主要依据计算袋外错误率oob error(out-of-bag error)。

随机森林有一个重要的优点就是,没有必要对它进行交叉验证或者用一个独立的测试集来获得误差的一个无偏估计。它可以在内部进行评估,也就是说在生成的过程中就可以对误差建立一个无偏估计。

我们知道,在构建每棵树时,我们对训练集使用了不同的bootstrap sample(随机且有放回地抽取)。所以对于每棵树而言(假设对于第k棵树),大约有1/3的训练实例没有参与第k棵树的生成,它们称为第k棵树的oob样本。

而这样的采样特点就允许我们进行oob估计,它的计算方式如下:

  1. 对每个样本,计算它作为oob样本的树对它的分类情况(约1/3的树);
  2. 然后以简单多数投票作为该样本的分类结果;
  3. 最后用误分个数占样本总数的比率作为随机森林的oob误分率。

信息熵的通俗解释

下面是引用自 通俗理解信息熵

信息量

信息的大小跟随机事件的概率有关。越小概率的事情发生了产生的信息量越大,如湖南产生的地震了;越大概率的事情发生了产生的信息量越小,如太阳从东边升起来了(肯定发生嘛,没什么信息量)。这很好理解!

例子

脑补一下我们日常的对话:
师兄走过来跟我说,立波啊,今天你们湖南发生大地震了。
我:啊,不可能吧,这么重量级的新闻!湖南多低的概率发生地震啊!师兄,你告诉我的这件事,信息量巨大,我马上打电话问问父母什么情况。
又来了一个师妹:立波师兄,我发现了一个重要情报额,原来德川师兄有女朋友额~德川比师妹早进一年实验室,全实验室同学都知道了这件事。我大笑一声:哈哈哈哈,这件事大家都知道了,一点含金量都没有,下次八卦一些其它有价值的新闻吧

因此一个具体事件的信息量应该是随着其发生概率而递减的,且不能为负。
但是这个表示信息量函数的形式怎么找呢?
随着概率增大而减少的函数形式太多了!不要着急,我们还有下面这条性质
如果我们有俩个不相关的事件x和y,那么我们观察到的俩个事件同时发生时获得的信息应该等于观察到的事件各自发生时获得的信息之和,即:
\(h(x,y) = h(x) + h(y)\)
由于x,y是俩个不相关的事件,那么满足\(p(x,y) = p(x)*p(y)\)

根据上面推导,我们很容易看出h(x)一定与p(x)的对数有关(因为只有对数形式的真数相乘之后,能够对应对数的相加形式,可以试试)。因此我们有信息量公式如下:
\(h(x)=-log_{2}p(x)\)

下面解决俩个疑问?

  1. 为什么有一个负号
    其中,负号是为了确保信息一定是正数或者是0,总不能为负数吧!
  2. 为什么底数为2
    这是因为,我们只需要信息量满足低概率事件x对应于高的信息量。那么对数的选择是任意的。我们只是遵循信息论的普遍传统,使用2作为对数的底!

信息熵

下面我们正式引出信息熵。
信息量度量的是一个具体事件发生了所带来的信息,而熵则是在结果出来之前对可能产生的信息量的期望——考虑该随机变量的所有可能取值,即所有可能发生事件所带来的信息量的期望。即
\(H(x)=-sum (p(x)log_{2}p(x) )\)
转换一下为:

\[Ent(D) = - \sum_{k=1}^{y}p_k\log_{2}p_k \]

参考文献

posted @ 2017-05-31 16:43  段星星  阅读(2300)  评论(0编辑  收藏  举报