决策树 机器学习第四章

决策树


前言

  决策树概念:决策树是基于树结构进行决策的、类似人类面临决策问题时的一种决策机制。决策树是一类常见的机器学习方法。
  以二分类任务为例,我们希望从给定训练数据集学得一个模型用以对新示例进行分类,把这个样本分类的任务,可看做对“当前样本属于正类吗?”这个问题的决策或判断过程。

  决策树学习目的:产生一棵泛化能力强,即处理未见示例能力强的决策树。

一、基本流程

  决策过程的最终结论对应了我们所希望的判定结果;决策过程中提出的每个判定问题都是对某个属性的“测试”;每个测试结果或是导出的最终结论,或是导出的进一步的判定问题,其考虑范围是在上次决策结果的限定范围内之内。
  一般地,一颗决策树包含一个根节点、若干个内部节点和若干个叶结点。叶结点对应于决策结果,其他每个结点则对应于一个属性测试;每个结点包含的样本集合 根据属性测试的结果 被划分到 对应子结点中;根节点包含样本全集。

  从根节点到每个叶结点的路径对应了一个判定测试序列。
  其基本流程遵循简单且直观的“分而治之”策略,如下图所示:
在这里插入图片描述

以c语言形式的表现
Node TreeGenerate(D,A){		//输入为一个样本集合D和一个属性集合A;输出是一个结点
	Node node;
	if(D中样本全部属于同一类别C){	//递归结束出口,如果运行到某处,比如:判定一个西瓜为好瓜坏瓜的决策树,对当前传过来的样本集都是好瓜,则此node设为好瓜的叶结点;并返回
		将node标记为C类叶结点;
		return;
	}
	if( A = ∅  |  D中样本在A上取值相同){	//递归结束的出口,仍以西瓜为例,当从某一分支判定到最后,没有属性可以划分,剩余样本大部分是好瓜,将node设为好瓜的叶结点;或者D中样本在当前A属性上都取值为同一个值,那就不用再向下划分了。比如都是好瓜,则直接将node设为好瓜叶结点,无需向下寻找划分属性。
		将node设为叶结点,类别标记为D中样本最多的类;
		return;
	}
	从A中选择最优划分属性a*;		//a*如何获得会在下一节提到
	for(a*的每一个值a*v ){		//比如当前寻找到最优划分属性为根蒂,对根蒂属性有弯的和直的,那就进行两次循环,生成两个分支;
		为node生成一个分支;
		令Dv表示D中在a*上取值为a*v的样本子集;		//例如,在根蒂属性上取值为好瓜的样本集合就是Dv,根蒂=好瓜就是a*v
		if (Dv为空 ){		//如果在根蒂属性上取值为好瓜的样本集合是空的,无法继续划分,也无法判定,将其设为D中最多的类别,判定成功率较高
			将分支节点标记为叶结点,其类别标记为D中样本最多的类;return;
		}
		else {				//子集不为空集合,则继续向下划分,直至遇见函数出口
			TreeGenerate(Dv,A\{a*})		//A\{a*}表示属性集合A去除a*后的属性集合
		}
	}
}

决策树的生成式一个递归过程。在决策树基本算法中,有三种情形会导致递归返回:
(1)当前结点包含的样本全属于同一类别,无需划分
(2)当前属性集为空,或是所有样本在所有属性上取值相同,无法划分
(3)当前结点包含的样本集合为空,不能划分

  在第(2)种情形下,我们把当前结点标记为叶结点,并将其类别设定为该跌点所含样本最多的类别;在第(3)种情形下,同样把当前结点标记为叶结点,但将其类别谁定位其父节点所含样本最多的类别。注意这两种情形的处理是指不同:情形(2)是利用当前结点的后验分布,而情形(3)则是把父节点的样本分布作为当前结点的先验分布。

二、划分选择

  在第一节中的算法中,我们涉及到最优划分属性,本节进行详细讲述。最优划分属性的要求:随着划分过程不断进行,决策树的分支节点所包含的样本尽可能属于同一类别,即结点“纯度”越来越高。

1.信息增益

信息熵
  “信息熵”是度量样本集合纯度最常用的一种指标。
   E n t ( D ) = − ∑ k = 1 ∣ y ∣ p k l o g 2 p k Ent(D) = - \sum_{k=1}^{|y|} p_k log_2 p_k Ent(D)=k=1ypklog2pk
  其中,pk为样本集合D中第k类样本所占比例。(k=1,2,……,|y|)。信息熵Ent(D)的值越小,D的纯度越高。

信息增益
   G a i n ( D , a ) = E n t ( D ) − ∑ v = 1 V D v D E n t ( D v ) Gain(D,a)= Ent(D) - \sum_{v=1}^V \frac{D^v}{D} Ent(D^v) GainD,a=Ent(D)v=1VDDvEnt(Dv)
  其中,a是D中的离散属性,V是a可能取值的数目,用a对D进行划分,将会产生V个分支,Dv是第v个分支节点包含了D中所有在属性a上取值为av的样本(数目)。
  对公式进行解读:
  用属性a对样本集D进行划分所得的信息增益 G a i n ( D , a ) Gain(D,a) GainD,a = 样本集D的信息熵 E n t ( D v ) Ent(D^v) Ent(Dv) - ∑ 属 性 a 的 每 个 可 能 取 值 对 属 性 a 的 当 前 可 能 取 值 所 对 应 的 样 本 子 集 的 数 目 ∣ D v ∣ 样 本 集 D 的 数 目 ∣ D ∣ \sum_{属性a的每个可能取值}\frac{对属性a的当前可能取值所对应的样本子集的数目|D^v|}{样本集D的数目|D|} aDDaDv·对应的样本子集的信息熵 E n t ( D v ) Ent(D^v) Ent(Dv)

  一般而言,信息增益越大,则意味着使用属性a来进行划分所获得的“纯度提升”越大。因此,我们可用信息增益来进行决策树的划分属性选择,即在决策树算法中提到的最优划分属性。

2.增益率

  背景:信息增益对可取值数目较多的属性有所偏好,为减少这种偏好可能带来的不良影响,著名的C4.5决策树算法,不直接使用信息增益,而是采用增益率来选择最优划分属性。
  定义增益率公式为:
       G a i n r a t i o ( D , a ) = G a i n ( D , a ) I V ( a ) Gain_ratio(D,a) = \frac{Gain(D,a)}{IV(a)} Gainratio(D,a)=IV(a)Gain(D,a)
其中,
       I V ( a ) = − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ l o g 2 ∣ D v ∣ ∣ D ∣ IV(a) = -\sum_{v=1}^{V}\frac{|D^v|}{|D|}log_2\frac{|D^v|}{|D|} IVa=v=1VDDvlog2DDv
IV(a)称为属性a的“固有值”。属性a的取值可能数目越多(即V越大),IV(a)的值越大。
  需注意,增益率准则对可取值数目较少的属性有所偏好,因此C4.5算法并不是直接算则增益率最大的属性作为候选划分属性,而是使用了一个启发式:先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的。

3.基尼指数

  CART决策树使用“基尼指数”来选择划分属性。数据集D的纯度可用基尼值来度量:
       G i n i ( D ) = ∑ k = 1 ∣ y ∣ ∑ k ′ ≠ k p k p k ′ = 1 − ∑ k = 1 ∣ y ∣ p k 2 Gini(D) = \sum_{k=1}^{|y|} \sum_{k'≠k}p_kp_{k'}= 1 - \sum_{k=1}^{|y|}p_k^2 Gini(D)=k=1yk=kpkpk=1k=1ypk2
其中,pk为样本集合D中第k类样本所占比例。
  直观来说,Gini(D)反映了从数据集D中随机抽取两个样本,其类别标记不一致的概率。因此,Gini(D)越小,数据集D的纯度越高。
  属性a的基尼指数定义为:
       G i n i _ i n d e x ( D , a ) = ∑ v = 1 V ∣ D v ∣ ∣ D ∣ G i n i ( D v ) Gini\_index(D,a) = \sum_{v=1}^{V} \frac{|D^v|}{|D|}Gini(D^v) Gini_index(D,a)=v=1VDDvGini(Dv)
  于是,在候选属性集合A中,选择那个使得划分后基尼指数最小的属性作为最优划分属性。

三、剪枝处理

  剪枝是决策树学习算法对付“过拟合”的主要手段。

决策树剪枝的基本策略有“预剪枝”和“后剪枝”。
  1、预剪枝是指在决策树生成过程中,对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶结点;
  2、后剪枝是先从训练集生成一颗完整的决策树,然后自底向上第对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化性能的提升,则将该子树替换为叶结点。

  一般采用本系列第二章中提到的性能评估来判断决策树性能是否提升。

1.预剪枝

  优点:预剪枝使得决策树的很多分支没有“展开”,不仅降低了过拟合的风险,还显著减少了决策树的训练时间开销和测试时间开销。
  缺点:有些分支的当前划分虽不能提升泛化性能、甚至可能导致泛化性能下降,但在其基础上进行的后续划分却有可能导致性能显著提高;预剪枝基于“贪心”本质,禁止某些分支展开,给预剪枝决策树带来了欠拟合的风险。
预剪枝决策树可能会生成一个只有一层划分的决策树,也称为“决策树桩”。
在这里插入图片描述

2.后剪枝

  后剪枝决策树通常比预剪枝决策树保留了更多的分支。
  优点:一般情况下,后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树。
  缺点:后剪枝过程是在生成完全决策树之后进行的,并且要自底向上地对所有非叶结点进行逐一考察,因此其训练时间开销比未剪枝决策树和预剪枝决策树都要大得多。

四、连续与缺失值

1.连续值处理

  在此之前,我们讨论的是基于离散属性来生成决策树,现实生活中经常会遇到连续属性,由于连续属性的可取值数目无限,不能直接根据连续属性的可取值来对结点进行划分,采用连续属性离散化技术处理这一问题。最简单的策略师采用二分法对连续属性进行处理(C4.5决策树算法中采用的机制)。

处理:
  1.排序。给定样本集和连续属性a,假定a在D上出现了n个不同取值,将这些值从小到大进行排序,记为{ a 1 , a 2 , … , a n a^1,a^2,…,a^n a1,a2,,an}。(例如属性a为密度∈[0,1],在样本中出现了0.996,0.874,0.235,0.238,0.374,排序后为0.235,0.238,0.374,0.874,0.996)。
  2.划分及候选划分点。基于划分点t将D分为 D t − 和 D t + D_t^-和D_t^+ DtDt+两个子集, D t − D_t^- Dt包含对属性a的取值不大于划分点t的样本, D t + D_t^+ Dt+包含对属性a的取值大于划分点t的样本。划分点的获取:从排序完的属性a的取值中,两两相邻的取值的中位点作为候选划分点(如,对前两个取值0.235,0.238,候选划分点t1就是0.236,向下取整)。对n个取值,相邻两两进行划分,有n-1个候选划分点。
  3.考察候选划分点。候选划分点确定后,像离散属性值一样来考察这些划分点,选取最优划分点进行样本集合划分。在之前小节内容中,我们通过信息增益选取最优划分点,在连续属性值划分,对信息增益公式进行一定的改动:
G a i n ( D , a ) = m a x t ∈ T a G a i n ( D , a , t ) = m a x t ∈ T a E n t ( D ) − ∑ λ ∈ { − , + } ∣ D t λ ∣ ∣ D ∣ E n t ( D t λ ) Gain(D,a) = max_{t∈T_a}Gain(D,a,t)= max_{t∈T_a}Ent(D) - \sum_{λ∈\{-,+}\} \frac{|D_t^λ|}{|D|}Ent(D_t^λ) Gain(D,a)=maxtTaGain(D,a,t)=maxtTaEnt(D)λ{ ,+}DDtλEnt(Dtλ)
其中, G a i n ( D , a , t ) Gain(D,a,t) Gain(D,a,t)是样本集d基于划分点t二分后的信息增益。通过 修改后的信息增益 选择划分点。
  注意:与离散属性不同的是,若当前结点划分属性为连续属性,该属性还是可作为其后代结点的划分属性。

2.缺失值处理

  背景:
  现实任务中,经常会遇到不完整样本,即样本的某些属性缺失。如果简单的放弃不完整样本,仅使用无缺失会的样本来进行学习,显然,数据信息得到了极大的浪费。因此,有必要考虑利用缺失属性值的训练样例来进行学习。
  需要解决的两个问题:
1、如何在属性值缺失的情况下进行划分属性选择?
2、给定划分属性,若样本在该属性上的值缺失,如何对样本进行划分?

  处理:
对问题1:
  显然我们仅可根据 D ~ \tilde{D} D~来判断属性a的优劣。
  给定训练集D和属性a,令 D ~ \tilde{D} D~表示D中在属性a上没有缺失值的样本子集。假定属性a有V个可取值{ a 1 , a 2 , … , a V a^1,a^2,…,a^V a1,a2,,aV} (属性a在样本集中出现的值),令 D ~ v \tilde{D}^v D~v表示 D ~ \tilde{D} D~中在属性a上取值为 a v a^v av的样本子集, D ~ k \tilde{D}_k D~k表示 D ~ \tilde{D} D~中属于第k类(k=1,2,…,|y|)的样本子集,显然 D ~ \tilde{D} D~= ∪ k = 1 ∣ y ∣ D ~ k ∪_{k=1}^{|y|}\tilde{D}_k k=1yD~k(无缺失值子集=每个类的无缺失值子集相加), D ~ \tilde{D} D~= ∪ v = 1 ∣ V ∣ D ~ v ∪_{v=1}^{|V|}\tilde{D}^v v=1VD~v(无缺失值子集=属性a的每个取值的无缺失值子集相加)。假定我们为每个样本x赋予一个权重 w x w_x wx,并定义以下元素:
  无缺失值样本所占比例:
       ρ = ∑ x ∈ D ~ w x ∑ x ∈ D w x ρ=\frac{\sum_{x∈\tilde{D}}w_x}{\sum_{x∈D}w_x} ρ=xDwxxD~wx
  无缺失值样本中第k类所占比例:
       ρ ~ k = ∑ x ∈ D ~ k w x ∑ x ∈ D ~ w x ( 1 ≤ k ≤ ∣ y ∣ ) \tilde{ρ}_k=\frac{\sum_{x∈\tilde{D}_k}w_x}{\sum_{x∈\tilde{D}}w_x} (1≤k≤|y|) ρ~k=xD~wxxD~kwx(1ky)
  无缺失值样本在属性a上取值为 a v a^v av的样本所占的比例:
       r ~ v = ∑ x ∈ D ~ v w x ∑ x ∈ D ~ w x ( 1 ≤ v ≤ ∣ V ∣ ) \tilde{r}_v=\frac{\sum_{x∈\tilde{D}^v}w_x}{\sum_{x∈\tilde{D}}w_x}(1≤v≤|V|) r~v=xD~wxxD~vwx(1vV)
  基于上述三个元素,我们对信息增益公式进行推广为:
       G a i n ( D , a ) = ρ × G a i n ( D ~ , a ) Gain(D,a) =ρ×Gain(\tilde{D},a) Gain(D,a)=ρ×Gain(D~,a)
             = ρ × ( E n t ( D ~ ) − ∑ v = 1 V r ~ v E n t ( D ~ v ) ) =ρ×(Ent(\tilde{D})-\sum_{v=1}^V\tilde{r}_vEnt(\tilde{D}^v)) =ρ×(Ent(D~)v=1Vr~vEnt(D~v))
其中,
       E n t ( D ~ ) = − ∑ k = 1 ∣ y ∣ ρ ~ k l o g 2 ρ ~ k Ent(\tilde{D}) = -\sum_{k=1}^{|y|}\tilde{ρ}_klog_2\tilde{ρ}_k Ent(D~)=k=1yρ~klog2ρ~k
  根据推广后的信息增益公式,通过计算即可得出在属性值缺失的情况下进行划分属性选择,即问题1得解。

对问题2:
  若样本x在划分属性a上的取值已知,则将x划入与其取值对应的子结点,且样本权值在子结点中保持为 w x w_x wx。若样本x在划分属性a上的取值未知,则将x同时划入所有子结点,且样本权值在与属性值 a v a^v av对应的子结点中调整为 r ~ v ⋅ w x \tilde{r}_v·w_x r~vwx;直观上看,就是让同一个样本以不同概率划入到不同的子结点中去。
  问题2得解。

  C4.5算法使用的就是上述解决方案。

五、多变量决策树

  多变量决策树,顾名思义,就是在决策过程中使用多个变量进行决策生成的树结构,
  以实现斜划分的多变量决策树为例,在此类决策树中,非叶结点不在是仅对某个属性,而是对属性的线性组合进行测试;换言之,每个非叶结点是一个线性分类器。
  在多变量决策树的学习过程中,不是为每个非叶结点寻找一个最优划分属性,而是试图建立一个合适的线性分类器。


总结

决策树学习算法最著名的代表是ID3、C4.5和CART。
本章讲述了决策树生成的过程、决策树划分选择、剪枝策略、连续值与缺失值处理、多变量决策树。
在决策树划分选择中,常用的是信息增益、增益率、基尼指数等准则进行划分。这些准则对决策树的尺寸有较大影响,但是对泛化性能的影响很有限。
本章介绍了决策树剪枝的基本策略,剪枝方法和程度对决策树泛化性能的影响相当显著。

猜你喜欢

转载自blog.csdn.net/G_Shengn/article/details/127687362