西瓜书/南瓜书_学习笔记_4

决策树

4.1 基本流程

        决策树(decision tree)是一类常见的机器学习方法。可以理解为我们把问题分割成了多次的0与1的判断。以挑西瓜的二分类问题为例,我们先看“是什么颜色”,假设我们要的是“青绿色”,而此时这个瓜是“青绿色”,那我们就再看“根蒂是什么状态”,假如是“蜷缩”,我们就再看“敲起来的声音”,假如是“浊响”。如果此时已经进行完了所有我们设定好的特征的检测,那我们才可以下最终结论,这是个好瓜。

   

        决策过程中提出的每个判定问题都是对某个属性的“测试”,每个测试的考虑范围都在上一个问题的范围内。

        一般的,一棵决策树包含一个根节点、若干个内部结点和若干个叶结点;叶结点对应于决策的最终结果,其他每个结点对应一个属性测试;每个结点包含的样本集合根据属性测试的结果被划分到子结点中;根结点包含样本全集,从根结点到任意一个叶结点的路径对应了一个判定测试序列。决策树的泛化能力,或者说处理新问题的能力很强。其遵循分而治之策略(divide_and_conquer)

从图里可以看出,决策树方法是一个递归过程,有三种情形会导致递归返回:

(1)当前结点包含的样本完全属于同一类别,无需划分。

(2)当前属性集为空,或是所有样本在属性上完全相同,无法划分。这种情形下,我们把这种结点标记为叶结点,将其类别设定为该结点所含样本最多的类别。这种情况是在利用当前结点的后验分布。

(3)当前结点包含的集合样本为空,不能划分。把当前结点标记为叶结点,但是将其类别设为父结点所含样本最多的类型。这种情况是把父结点的样本分布作为当前结点的先验分布。

4.2 划分选择

        从4.2图可以看出,决策树关键就在第八行,是为了找到最优化分属性。我们希望越往下细分,所有样本尽可能属于同一类别,即让结点的纯度(purity)越来越高。

4.2.1 信息增益

        纯度由信息熵(information entropy)度量。假定样本集合D中第k类样本所占的比例为p_{k}(k=1,2,...,\left | y \right |),则D的信息熵定义为:

根据上一章的学习,我们可以把负的Ent(D)当作类似损失的东西,它的值越小,D的纯度越高。

假定离散属性a有V个可能的取值{{a^{1},a^{2},...,a^{V}}},用a来对D进行划分,则会产生V个分支,其中第v个分支结点包含了D中所有在属性a上取值为a^{V}的样本,记为D^{V}。因为不同结点包含的样本数不同,我们需要分给分支结点不同的权重\left | D^{v} \right |/\left | D \right |,即样本数越多的分支影响越大。于是可以算出a对样本集D进行划分所获得的信息增益(information gain)

        一般而言,信息增益越大,则意味着使用属性a来进行划分所获得的"纯度提升"越大。因此在4.2中的划分属性选择就是a_{*}=\underset{a\in A}{argmax}Gain(D,a)

包含17个样本,最终要求分为“好瓜”和“坏瓜”两类。所以\left | y \right |=2。开始时,根结点包含所有样例,其中正例占p_{1}=8/17,反例占p_{2}=9/17,则信息熵为:

然后我们要求每个特征对应的信息增益,我们现在有{色泽,根蒂,敲声,纹理,脐部,触感}。以“色泽”为例,它有三个可能取值{青绿,乌黑,浅白},那按照上面的规律来,我们会有三个子集D_{1}(色泽=青绿)D_{2}(色泽=乌黑)D_{3}(色泽=浅白)

D_{1}包含{1,4,6,10,13,17}等6个样例,其中正例占p_{1}=3/6,反例占p_{2}=3/6,剩下两个同理,最终我们可以得到三组的信息熵:

所以增益为:

同理可得其他的增益:

显然“纹理”的信息增益最大,所以我们就可以选“纹理”作为划分属性。下图为结果:

然后我们需要做的就是,把相同的步骤在D1上再继续进行,这次的可用属性集合就是去掉纹理后的特征集{色泽,根蒂,敲声,脐部,触感},算出各部信息增益:

“根蒂”、“脐部”、“触感”的信息增益相等,所以可以任选其一作为划分属性。类似的,把所有的特征都进行一遍,得到下图:

4.2.2 增益率

        在上面的介绍中,我们没有考虑编号这一属性,因为编号每个都只有一个样本,会产生17个分支,每个节点的纯度都是最大值,也就没什么分类的意义。

        我们在上面的公式中可以看出,信息增益准则会对可取数值较多的属性有偏好,所以我们需要进一步的泛化,也就是使用增益率(gain ratio)来选择最优划分属性:

其中:

称作a的固有值(intrinsic value),属性a的可能取值(也就是V)越多,则这个值就会越大。

我们可以看到,它的形式和Ent很相像,

p_{k}\frac{ \left | D^{v}\right |}{\left | D \right |}顶替,大概相当于从D中选出Dv的概率,\left | y \right |由V代替,都是代表可能的取值数。可以类比的理解二者。

那么增益率就完美无缺了吗?显然不是的,事实上,它会对可取数目较少的样本有所偏好,所以我们不会直接选择增益率最大的划分属性,而是先从侯选属性中挑选出信息增益高于平均水平的属性,再从中挑选增益率最高的,也就是将两个方法结合了一下。

4.2.3 基尼指数

        CART决策树使用基尼指数(Gini Index)来选择划分属性。数据D的纯度可由基尼值来衡量:

基尼指数也被称为不纯度,表示在样本集合中一个随机选中的样本被分错的概率。Gini指数越小表示集合中被选中的样本被参错的概率越小,也就是说集合的纯度越高,反之,集合越不纯。当集合中所有样本为一个类时,基尼指数为0。

从式子可以理解为,在总共的次数中选到不同的两种样本的概率。

属性a的基尼指数定义为

表示在属性a的取值已知的条件下,数据集D按照属性a的所有可能取值(Dv)划分后的不纯度。不过在构造CART决策树的时候并不会严格按照此式来选择划分属性。主要是因为CART决策树是一棵二叉树,如果用上面的式去选出最优划分属性,无法进一步选出最优划分属性的最优化分点。

在此基础上,我们在候选集合A中挑出那个使得划分后基尼指数最小的属性最为最优划分属性,即a_{*}=\underset{a\in A}{arg min}Gini_index(D,a)

4.3 剪枝处理

        剪枝(pruning)是决策树学习算法对付过拟合的主要手段。正如上面我们看到的,结点划分过程不断重复,可能会生成过多的决策树分支,也就是发生了过拟合,此时,决策树已经把许多特有的特征也纳入了判断,因此可以主动去掉一些枝条来降低过拟合风险。

        基本策略有预剪枝(prepruning)后剪枝(postpruning)

4.3.1 预剪枝

预剪枝:在生成决策树的过程中,在分类之前,先对分类后的结果评估是否能有效地提高泛化效果提升,如果不能就直接停止划分,标记为叶结点。

使用第二章的留出法来进行性能评估(把样本分割为两个互斥的集合,一部分用来训练,一部分用来测试),对下表,分成训练集{1,2,3,6,7,10,14,15,16,17}和验证集{4,5,8,9,11,12,13}

基于4.2.1的知识,得到下图:

其中,\left | y \right |=2(好瓜和坏瓜),先由样本中正例和反例占总数的比例,算出信息熵,然后针对各特征算出信息增益,选出最大的“脐部”作为第一次分类的依据,在分过一次后,记得就是在各个子集中计算信息增益了,然后再经由这部分中的剪枝,处理一下叶结点。

其实在进行这种算法的时候,是从根部开始的,也就是说,我们会先把根结点试着标为叶结点。由于只有一个结点,所以我们只能在好瓜和坏瓜中选一个赋给根结点,和测试集比对一下,可以发现标为好瓜大约40的准确率,标为坏瓜大约五十多的准确率,而我们在用“脐部”分类后,准确率上升到了七十左右,所以我们不能直接在根节点上预剪枝。

那么继续往下,对②,直接用信息增益算出来,我们应该用色泽分类,但是和测试集比对后,发现准确率下降了,那么就预剪枝,把它标为叶结点;③也是同理,没有精度提升,标为叶结点;④则是训练集和测试集中都完全正确,无需再分。

于是我们就得到了仅有一层的决策树,也被称为决策树桩(decision stump)。

整体问题的思路,感觉就是先从根结点看,能不能直接剪掉,不能就用信息熵的知识,在“要在这些特征中挑一个最准”的条件下先算增益,再由剪枝思路检查,看到底要不要分。

4.3.2 后剪枝

后剪枝:在完整生成一棵决策树后,再返回去对非叶结点进行考察,若某个非叶节点无法带来泛化性能地提升,就标记为叶结点,把之后的分类“剪掉”。

在后剪枝问题中,我们相当于先有了4.5那张图,现在我们要做的是,从下到上,看能删掉哪些点。

先从⑥开始,我们直接假设是叶结点,让⑥的集合中包含下属几个分类中的所有样本,直接和测试集比对,发现准确率上升了,那就确定剪掉。

之后的都同理,⑤在假设换为叶结点后,精度不变,考虑到对付可能存在的欠拟合隐患,我们选择不剪掉;对于②,剪掉后,精度上升,所以剪掉;然后是①和③,均未发生变化,所以不做处理。

可以看出,后剪枝分支更多,也因此不容易发生欠拟合问题,但是耗时会比预剪枝有显著提高。

4.4 连续与缺失值

4.4.1 连续值处理

        在现实任务中,我们经常会用连续属性解决问题,简单的策略是使用二分法(bi-partition)对连续属性进行处理。

        给定样本集D和连续属性a,假定a在D上出现了n个不同的取值,将这些值从小到大排序,记为{a^{1},a^{2},...,a^{n}},基于划分点t(可以理解为之前逻辑回归中的阈值)将D划为子集D_{t}^{-}D_{t}^{+},也就是大于和不大于两类。思想大概就是,把连续性划分离散型,这些a其实就是代表着一个个区间[a^{i},a^{i+1}),在区间内取任何值,最终分类结果都相同。

我们可以把中位点\frac{a^{i}+a^{i+1}}{2}设为候选划分点,划分点集合即为:

包含n-1个元素,其实就是各个区间的中点。

那我们现在就把问题转化为对点求信息增益最大处的问题了。对(4.2)稍加改造:

其中Gain(D,a,t)是指用t进行二分后,计算信息增益,信息熵不需要怎么改变,中位点的数量就是原先分类的数量,后面的λ就是之前的V,因为已经把D分为两份了,所以就是+和-两个子集。

举个例子,在原先的西瓜表上,添加几个连续属性:

对属性“密度”,根据(4.8)可算出信息增益为0.262,对应于划分点是0.381.

对属性“含糖率”,也可算出信息增益为0.349,对应划分点0.126

再和原先的那些已经算出来的信息增益比较,得出决策树

需注意的是,与离散属性不同,若当前结点划分属性为连续属性?该属性还 可作为其后代结点的划分属性。也就是\leq其他的值。

4.4.2 缺失值处理

        现实问题中,时常会出现数据缺失的情况,如某年某月的收入没有登记等,但是如果把这类样本全部舍弃的话,会造成严重的浪费,所以我们需要思考如何使用这类样例进行学习。

、我们需要解决两个问题:
(1)在属性值缺失的情况下,如何进行划分属性选择

(2)给定划分属性,在样本这个属性的值缺失的情况下,如何把这个样本分类

\widetilde{D}表示D在a属性上没有缺失值的样本子集,对(1)假定属性a有V个可取值{a^{1},a^{2},...,a^{V}},令\widetilde{D}^{v}表示\widetilde{D}在a上取值为a^{v}的样本子集,\widetilde{D}_{k}表示属于第k类(就是好瓜和坏瓜的那个分类)的样本子集,则有\widetilde{D}=\bigcup_{k=1}^{\left | y \right |}\widetilde{D_{k}}\widetilde{D}=\bigcup_{v=1}^{V}\widetilde{D^{v}},假定我们为每个x赋予一个权重w_{x}

ρ表示无缺失值的样本所占的比例

\widetilde{p_{k}}表示无缺失值的样本中第k类所占的比例

\widetilde{r_{v}}表示无缺失值的样本在属性a上取值a^{v}的样本所占的比例

\sum_{k=1}^{\left | y \right |}\widetilde{p_{k}}=1

\sum_{v=1}^{V}\widetilde{r_{v}}=1

我们可由信息增益的计算式(4.2)推广得:

D在a属性上没有缺失值的样本子集的信息熵,表示取值为a^{v}的样本的信息熵,\widetilde{r_{v}}替换了原本表示比例的一项,最前面的ρ是因为这是只算无缺样本得出的增益。

进一步,我们可以得到:

对问题(2),若样本x在划分属性a上的取值己知,则将x划入与其取值对应的子结点,且样本权值在于结点中保持为w_{x}。若样本x在划分属性a上的取值未知,则将x同时划入所有子结点,且样本权值在与属性值a^{v}对应的子结点中调整为w_{x}*\widetilde{r_{v}},直观地看,这就是让同一个样本以不同的概率划入到不同的子结点中去。

以上面图中的样本进行试验。先以属性“色泽”为例,\widetilde{D}包含{2,3,4,6,7,8,9,10,11,12,14,15,16,17}的14个样例。信息熵为:

\widetilde{D}^{1}\widetilde{D}^{2}\widetilde{D}^{3}分别表示“青绿”“乌黑”以及“浅白”的样本子集

算出信息增益为:

类似地,得出所有属性的信息增益:

4.5 多变量决策树

        若我们把每个属性视为坐标空间中的一个坐标轴,则d个属性描述的样本就对应了d维空间中的一个数据点,对样本分类则意味着在这个坐标空间中寻找不同类样本之间的分类边界。决策树所形成的分类边界有一个明显的特点: 轴平行(axis-parallel),即它的分类边界由若干个与坐标轴平行的分段组成。

假如我们说挑瓜按照密度和含糖度两个属性,那么好瓜和坏瓜肯定有个界限,就是个数,假如是a和b,那么,这两个边界就是x=a和y=b。

举个例子,用表4.5的数据

                        

但在学习任务的真实分类边界比较复杂时,必须使用很多段划分才能获得较好的近似,就会相应地增加时间成本。

根据我们以前的知识储备,我们会想到用曲线来贴合细分多次的直线边界,多变量决策树(multivariate decision tree)就是能实现这样的“斜划分”甚至更复杂划分的决策树。

此类决策树中,非叶节点不再是针对某个属性,而是对属性的线性组合进行测试,每个叶节点是一个形如\sum_{i=1}^{d}w_{i}a_{i}=t的线性分类器,其中w_{i}是属性a的权重,w_{i}和t可在该节点所含的样本集和属性集中学到。

此类决策树不是为每一个非叶节点找一个最优化分属性,而是试图建立一个合适的线性分类器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值