机器学习算法(二):决策树算法

决策树算法

首先我们来看一个例子,这个例子能很好地反映出整个算法的具体流程。

一个例子

某位母亲给自己闺女物色了个男朋友,于有了下面这段对话:

女儿:多大年纪了?
母亲:26。
女儿:长得帅不帅?
母亲:挺帅的。
女儿:收入高不?
母亲:不算特别高,中等情况吧。
女儿:是不是公务员?
母亲:是,在税务局上班
女儿:那好,见个面吧。

这个女孩的决策过程就是典型的分类决策过程。相当于通过年龄,长相,收入和是否是公务员将男人分成两类:见和不见。假设这个女孩对男人的要求是:30岁以下,长相中等,高收入或者中等收入的公务员,那么可以用下图来表示女孩的决策逻辑:

相亲

算法描述

从上面的例子可以看出,决策树是基于树结构来进行决策的,这恰好是人类在进行决策时一种很自然的处理机制。决策树由结点和有向边组成。结点有两种类型:内部结点和叶结点。叶结点对应于决策的结果(数据的分类结果),内部结点对应于一个属性测试。

用决策树分类,从根节点开始,其包含了样本全集,对实例的某一属性进行测试,根据测试结果,将实例分配到其子结点。每一个子结点对应这该属性的一个取值。如此递归地对数据进行测试并分配,直至叶结点,将实例分配到叶结点所属的类中。这样从根节点到每个叶结点的路径对应了一个属性测试序列。因此,它可以被认为是if-then规则的集合,这就带来了一个重要的性质:互斥且完备。每一个实例都被一条路径(规则)所覆盖,而且只被一条路径(规则)所覆盖。

决策树的学习本质是从训练数据集中归纳一组分类规则。与训练集不相矛盾的决策树可能有多个,也有可能一个也没有。我们需要的是一个与训练集矛盾较小的决策树,同时也具有良好的泛化能力。因为从所有可能的决策树中选取最优的决策树是NPC问题,所以在实际中使用的决策树算法通常采用启发式算法,近似求解这一最优化问题。下面给出决策树学习的伪代码:

输入:训练集 D = {$(x_1, y_1),(x_2, y_2),...,(x_m, y_m)$}
      属性集 A = {$a_1, a_2,..., a_d$}
过程:函数TreeGenerate(D,A)
1. 生成结点node;
2. if D 中样本全属于同一类别 C then
3.     将node标记为C类叶结点; return
4. end if
5. if A = $\emptyset$ OR D 中样本在A上取值相同 then
6.     将node标记为叶结点,其类别标记为D中样本数最多的类; return
7. end if
8. 从 A 中选择最优划分属性$a_{*}$
9. for $a_{*}$ 的每一个值 $a_{*}^v$ do
10.     为node生成一个分支;令$D_v$表D中在$a_{*}$上取值为$a_{*}^v$的样本子集
11.     if $D_v$ 为空 then
12.         将分支结点标记为叶结点,其类别标记为D中样本最多的类; return
13.     else
14.         以TreeGenerate($D_v$, A \ {$a_{*}$})为分支结点
15.      end if
16. end for
输出:以node为根节点的一棵决策树

以上的方法生成的决策树可能对训练数据具有很好的分类能力,但对未知的数据未必有很好的分类能力,即可能发生过拟合现象。我们需要对决策树进行剪枝,将树变得更为简单,从而使它具有更好的泛化能力。其实,决策树的生成对应于模型的局部选择,决策树的剪枝对应于模型的全局选择。

决策树的选择可以归纳为3个步骤:特征选择、决策树的生成和决策树的剪枝。接下来会对这三部分的内容依次介绍。

特征的选择

这里有必要提一下,如果训练数据中特征数量很多,有必要在决策树学习开始的时候,对特征进行选择,只留下对训练数据有足够分类能力的特征。关于特征的选择这一问题,之后可能会专门写一篇博客来介绍。

特征的选择在于在于选取对训练数据具有分类能力的特征,这样可以提高决策树学习的效率。如果利用一个特征进行分类的结果与随机分类的结果没有很大的差别,则这个特征是没有分类能力的。经验上扔掉这样的特征对决策树学习的精度影响不大。

为了之后举例的方便,我们以李航《统计学习方法》P59的数据作为示例数据。如下:

数据

我们希望随着划分过程的不断进行,决策树的分支结点所包含的样本尽可能属于同一个类别,即结点的『纯度』越来越高。『信息熵』是度量样本集合纯度最常用的一种方法:

H(x)=i=1npilog(pi)

其中 pi 是类i出现的概率。熵越大,随机变量的不确定性就越大。熵只依赖于X的分布,与X的取值无关。

因为我不是通信专业出身,也没有办法介绍地更多,但这个概念确实是一个非常有意思的东西,有兴趣的请谷歌之。

信息增益

假定离散属性a有V个可能的取值{ a1,a2,...,aV },若使用a来对样本集D进行划分,则会产生V个分支结点,其中第v个分支结点包含了D中所有在属性a上取值为 av 的样本,记为 Dv 。我们可以根据熵的公式计算出 Dv 的信息熵,再考虑到不同的分支结点所包含的样本数不同,给分支结点赋予权重 |Dv|/|D| ,即样本数越多的分支结点影响越大,于是可以计算出属性a对样本集D进行划分所获得的『信息增益』:

Gain(D,a)=H(D)v=1V|Dv||D|H(Dv)

该式表示由于特征a使得对数据集D的分类的不确定性减小的程度。信息增益依赖于特征,不同的特征往往具有不同的信息增益。信息增益大的特征具有更强的分类能力,因为这意味着不确定性减小的更多。所以我们可以选择信息增益作为属性选择的标准。

下面来谈谈具体的计算。以之前的数据为例:

贷款情况

H(D)=915log2(915)615log2(615)=0.971

再看特征 A=A1(A2)(A3)(A4)

总体情况

如果按照年龄这个特征对数据进行划分,则:

H(D1)=25log2(25)35log2(35)

H(D2)=25log2(25)35log2(35)

H(D3)=45log2(45)15log2(15)

即可求得 Gain(D,A1)=0.083 ,按照同样的方法可以计算其他属性的信息增益:

Gain(D,A2)=0.324,Gain(D,A3)=0.420,Gain(D,A4)=0.363

由于 A3 (有自己的房子信息增益最大),所以选择 A3 作为最优特征。

这是ID3算法所使用的特征选择方法。

利用信息增益存在的问题

以信息增益作为划分训练数据集的特征,存在偏向于选择取值较多的特征的问题。

对于取值多的属性,尤其一些连续型数值,比如两条地理数据的距离属性,这个单独的属性就可以划分所有的样本,使得所有分支下的样本集合都是“纯的”(最极端的情况是每个叶子节点只有一个样本)。

一个属性的信息增益越大,表明属性对样本的熵减少的能力更强,这个属性使得数据由不确定性变成确定性的能力越强。

所以如果是取值更多的属性,更容易使得数据更“纯”(尤其是连续型数值),其信息增益更大,决策树会首先挑选这个属性作为树的顶点。结果训练出来的形状是一棵庞大且深度很浅的树,这样的划分是极为不合理的。

摘自知乎

但取值越多是否就一定会导致信息增益越大?

这个是不一定的,楼上举的例子比较极端,我再举个例子:

图1

Humidity的值有两种,High和Normal,Temperature的值有三种,Hot、Mild和Cool,而Day的值多达14种,如果按照信息增益的公式来算,对于PlayTennis,各个属性的信息增益值:

Gain(PlayTennis, Day) = 0.940, Gain(PlayTennis, Humidity) = 0.151, Gain(PlayTennis, Temperature) = 0.028

可以看出Temperature所带来的信息增益不如Humidity,也就是说取值越多不一定会导致信息增益越大。

摘自知乎

以信息增益作为划分训练数据集的特征,存在偏向于选择取值较多的特征的问题(数据存在这样的趋势,但不是全是这样)。所以有必要选择另一种更加合理的特征选择方法。

信息增益比

Gain_ratio(D,a)=Gain(D,a)HA(D)

其中, HA(D)=Vv=1|Dv||D|log2|Dv||D| v 是特征A取值的个数。

为什么添加一个正则项的信息增益比可以解决信息增益的问题:

1.假设数据均匀散开(这不是我们想要的结果)。

即每个取值概率约为 1v 。此时 HA(D) 的值约为 log2(v) v 越大HA(D)越大,整个式子的取值越小。

2.假设数据虽然分散,但大部分集中于一个部分。(这是我们想要的)

这个我们从熵的不确定性角度考虑,虽然 v 很大,但是熵的不确定性依然很小,即HA(D)依然很小,这样就保留了我们想要的结果。

C4.5算法是使用了信息增益比来作为特征选择的标准。但它并不是直接选择信息增益比最大的属性。而是使用了一个启发式的方法:先从候选属性中选择信息增益高于平均水平的属性,再从中选择信息增益比最高的属性。

基尼指数

CART算法则是『剑走偏锋』,选择了一个看起来与信息增益毫无关系的方法作为特征选择的方法。该方法叫做『基尼指数』。数据集D的纯度也可以用基尼指数来衡量:

Gini(D)=1k=1Kp2k

Gini(D)反应了从数据集D中随机抽取两个样本,其类别不一致的概率。因此,Gini(D)越小,则数据集D的纯度越高。

属性a的基尼指数定义为:

Gini_index(D,a)=v=1V|Dv||D|Gini(D)

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

对于以上介绍的3中特征选择方法,将其代入最开始介绍的伪代码中,即得到了不同的决策树生成算法。

数据的两种情况

在上面的例子中,我们所计算的情况都是最基本的。这里我们对属性值是连续的情况,以及属性值缺失的情况进行讨论。

连续值属性的处理

上面的例子中,属性值都是离散的,那么对于连续值属性在计算信息增益时又应该如何计算呢?

最简单的策略是采用二分法对连续属性进行处理,这是C4.5算法中采用的机制。

给定样本集D和连续属性a,假设a在D上出现了n个不同的取值,将这些值从大到小排序,记为 {a1,a2,...,an} 。基于划分点t可以将D分为子集 Dt D+t ,其中 Dt 包含那些在属性a上取值不大于t的样本,而 D+t 则包含那些在属性a上取值大于t的样本。考察包含n - 1个候选划分点的集合:

Ta={ai+ai+12|1in1}

即把区间 [ai,ai+1) 的中位点作为候选划分点。然后,我们就可以像离散属性值一样来考察这些划分点。对信息增益的公式进行稍加改造:

Gain(D,a)=maxtTaH(D)λ{,+}|Dλt||D|H(Dλt)

需要注意的是,与离散属性不同,若当前划分属性为连续属性,则该属性还可以作为其后代结点的划分属性。

缺失值处理

在之前的博客中也介绍过,在运行学习算法之前,需要准备好数据,其中有一个重要的部分就是数据的预处理。其中包含了缺失值处理这一过程,对于不同的算法,会采取不同的方法。这里就来介绍下决策树算法中的方法。

在这里我们需要解决两个问题:(1) 如何在属性值缺失的情况下进行划分属性的选择;(2) 给定划分属性,若样本在该属性上的值缺失,如何对该样本进行划分。

对于问题(1),令 ρ 表示五确实样本所占比例, pk~ 表示无缺失值样本中第k类所占比例, rv~ 表示无缺失值样本中属性a上取值 av 的样本所占的比例。则熵的公式为:

H(D̃ )=k=1Kpk~log2pk~

信息增益的公式为:

Gain(D,a)=ρ×(H(D̃ )v=1Vrv~H(Dv~))

对于问题(2),若样本x在划分属性a上的取值已知,则将x划入与其值相对应的子结点中,且样本权值在子结点中保持为 wx 。若样本x在划分属性a上的取值未知,则将x同时划入所有子结点,且样本权值在属性值 av 对应的子结点中调整为 rv~wx 。直观地看,这就是让同一个样本以不同的概率划入到不同的子结点中去。

剪枝

剪枝是用来解决过拟合的问题。就是由于数据对样本数据的拟合程度过高,导致对测试数据的判别存在误差。剪枝的基本策略有『预剪枝』和『后剪枝』。

预剪枝

在决策树生成的过程中,对于某个结点,根据分配到其结点中的训练集数据,为该结点选择一个合适的类标签。在测试集上测试其分类精度。然后根据特征选择方法,选择一个最优属性进行展开,在其子结点上,选择一个最优的分类标签,再在测试数据集上进行测试。如果测试精度有提升,则保留该特征选择结果,继续进行决策树的生成。如果测试精度没有提升,则停止划分,并将当前的结点标记为叶结点。

预剪枝方法不仅降低了过拟合的风险,还显著减小了决策树的训练时间开销和测试时间开销。但是,有些分支的当前划分虽然不能提升泛化性能,甚至可能导致泛化性能暂时下降,但在其基础上进行的后续划分却有可能导致性能的显著提高。而预剪枝基于贪心的本质禁止这些分支展开,给预剪枝决策树带来了欠拟合的风险。

后剪枝

后剪枝则是先从训练集中生成一棵完整的决策树,然后自底向上地对内部结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化性能的提升,则将该子树替换为叶结点。

后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树。但后剪枝过程是在生成完全决策树之后进行的,并且要自底向上地对树中所有的非叶结点进行逐一地考察,因此训练时间开销要比未剪枝决策树和预剪枝决策树都要大。

写在最后

这篇博客一开始是由与我同一级的朱旦奇同学整理的,之后我参照了一些《统计学习方法》、《机器学习》(周志华)中的一些内容。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值