机器学习笔记6——决策树

牙齿焦黄的肯定不是女神,可以直接pass掉。但胸围就不好说了,胸小的未必不是女神,胸大的也未必是,这就要结合身高、腰围和臀围等其他属性分别讨论,在讨论其他属性时也是如此。就像沿着树的分叉,往上下左右不同方向都有可能找到果实一样,这就是决策树。

一、基本流程

对每个属性进行讨论之后都会导出最终结论或者需要进一步讨论的问题,对需要进一步讨论的新问题,其考虑范围在上一次讨论结果的限定范围之内。比如,胸围有瘦小、普通、丰满和波霸四个取值,我们对波霸可能会直接判定为女神,对胸围普通的可能还要进一步讨论体重、腰围等,这时再讨论体重、腰围就不需要考虑波霸的情形了。

一般而言,一棵决策树包括一个根结点、若干个内部结点和若干个叶结点,其中内部结点就是对属性进行讨论,叶结点就是最终的决策结果。根结点包含样本全集,每个结点包含的样本集合要根据结点对应属性的讨论结果被进一步划分到不同子结点中,直到得到最终结果。生成一棵决策树的基本流程如下:

/* 决策树学习基本算法
 * 假设D为训练集,即美女1(女神)、美女2(女汉子)……美女m(女神)
 * A为属性集,即身高、体重、胸围、腰围、臀围……
 */
 
TreeBuilding(D, A)
{
	生成结点N;
	if(训练集D中样本全部属于同一类别C)
	{
		将节点N标记为叶结点,类别为C;
		return;
	}
	if(属性集A为空 || 训练集D中所有样本所有属性相同)
	{
		将节点N标记为叶结点,类别为训练集D中样本数量最多的类;
		return;
	}
	从属性集A中选择一个属性a,如胸围;
	// 遍历属性a的每一个取值,如瘦小、普通、丰满和波霸
	for(a的每一个取值av)
	{
		为节点N生成一个分支结点Nb;
		Dv = D中在属性a上取值为av的子集,如所有胸围丰满的美女;
		if(Dv为空)
		{
			将分支节点Nb标记为叶结点,类别为D中样本最多的类;
			return;
		}
		else
		{
			/* 本分支中属性a(胸围)已讨论完毕
			 * 从属性集A中去除属性a,程序递归以讨论其他属性
			 */
			TreeBuilding(D, A\a);
		}
	}
}

显然,决策树的生成是一个递归过程,有三种情况(上述三个RETURN)将导致递归返回,即生成一个叶结点。1、当前结点包含的样本全部属于同一类别,得到分类结果,无需继续划分;2、当前属性集为空,或所有样本在所有属性上取值相同,无法划分;3、当前结点包含的样本集合为空,不能划分。

二、划分选择

在决策树学习基本算法的第19行,要从属性集A中选择一个属性a,也就是通过属性a来对样本集进行划分,然后再分别讨论。但在这么多属性中,哪一个才是最优的划分属性,即可以让划分出来的分支结点中的样本尽可能属于同一类别,使结点具有较高的纯度。打个比喻,这就是“先看胸还是先看脸”的问题,用胸围划分可以又好又快尽可能把女神筛出来,还是用脸更容易。一般可以使用以下三种方法:

1、信息增益(information gain)划分

分别计算用属性集A中的每个属性a对样本集D进行划分所获得的“信息增益”,选择信息增益最大的属性作为最优划分属性,如果有多个属性均获得最大信息增益,可任选其中之一。类似的,对之后所有的分支结点均进行上述操作。

计算属性a划分样本集D的信息增益Gain(D, a),首先要计算D的信息熵Ent(D),以及用属性a划分样本集D之后得到的V个样本子集Dv的信息熵Ent(Dv)。

计算信息熵 Ent(D) = 对每类样本数量在D中所占的比例与该比例以2为底的对数的乘积求和,然后乘以-1。求Dv的信息熵亦是如此。

计算信息增益 Gain(D, a) = Ent(D) – 对V个样本子集的权重与其信息熵的乘积求和。其中样本子集Dv的权重即Dv的样本数量在D的样本数量中的占比|Dv| / |D|。

通过信息增益划分生成决策树的基本步骤如下:

(1)计算当前结点所包含样本集D的信息熵;
(2)计算用属性a划分D得到各子集Dv的信息熵;
(3)计算用属性a划分D的信息增益;
(4)重复步骤2-3计算出所有属性的信息增益;
(5)选择信息增益最大的属性对D进行划分,生成新的结点。
(6)在各结点循环步骤1-5,直到得到最终决策树。

2、增益率(gain ratio)划分

在上面的信息增益划分中,考虑一个极端情况,每个样本都有一个ID,如果把这个ID作为划分属性,计算它的信息增益将接近1,远大于其他属性划分的信息增益。因为ID是唯一的,用ID划分样本,得到的每个样本子集中仅有一个样本,纯度当然最大。但这样的决策树对我们没有实际意义。

因此,信息增益划分准则对可取值数目较多的属性(比如ID)有所偏好,为了减少这种偏好的不利影响,可以使用“增益率”选择最优划分属性。

增益率Gain_ratio(D, a) = 信息增益Gain(D, a) / 固有值IV(a)

固有值IV(a)的计算方法是,用属性a划分D得到若干样本子集Dv,对每个子集的权重|Dv| / |D|与该权重以2为底对数的乘积求和再乘以-1。

属性a的可能取值数目越多,固有值IV(a)就越大,由于固有值在分母位置,因此增益率划分准则对可取值数目较少的属性有所偏好,为了减少这种偏好的影响,可使用启发式:先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的。

3、基尼指数(Gini index)划分

用基尼值来度量数据集D的纯度,进而计算出每个属性的基尼指数,选择使得划分后基尼指数最小的属性作为最优划分属性。

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

基尼指数的计算方法是,用属性a划分D得到若干样本子集Dv,对每个子集的权重|Dv| / |D|与该子集基尼值的乘积求和。

三、剪枝处理

决策树学习中,结点划分过程不断重复,有时会造成分支过多,就有可能因为对训练样本学习的太好,导致过拟合。因此可通过剪枝来降低过拟合的风险。

在剪枝过程中,需要判断决策树的泛化性能是否有所提升,这就需要用到机器学习笔记2中的模型评估方法。比如可以使用留出法,即对数据集D随机划分为两部分,一部分样例组成训练集,剩下一部分组成验证集。

1、预剪枝(prepruning)

预剪枝是在决策树生成过程中,对每个结点在划分前先进行评估,若当前结点的划分不能带来决策树泛化性能的提升,则停止划分,并将当前结点标记为叶结点。预剪枝是一个自上而下的过程。

预剪枝使得决策树的很多分支没有被“展开”,降低了过拟合的风险,减少了训练和测试时间开销。但另一方面,预剪枝“贪图眼前利益,不考虑长远”,有些分支的当前划分虽然不能提升泛化性能,或者导致泛化性能的下降,但如在其基础上进行后续划分却有可能导致性能显著提高,其“贪心”本质禁止这些分支展开,可能带来欠拟合风险。

2、后剪枝(postpruning)

后剪枝是先从训练集生成一棵完整的决策树,然后自底向上对非叶结点进行评估,若将该结点替换为叶结点(即将该结点以下的分支剪除)能够带来决策树泛化性能的提升,则将该子树替换为叶结点。

对于剪枝后性能评估不变的结点,根据奥卡姆剃刀准则,一般都应当进行剪枝。

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

四、连续与缺失值

1、连续值处理

如果训练集数据中,美女的胸围给出的是瘦小、普通、丰满和波霸这样的离散型数据,我们可以直接使用本章介绍的上述方法和公式来生成决策树。但如果像身高、体重这样的连续型属性,可取值数目并非有限,此时就要用到连续属性的离散化技术。

最简单的离散化技术就是二分法,即对连续属性a在D上出现的n个不同取值,按从小到大排序,以任意相邻两个取值之间的中位点作为划分点t,将D分为两个子集Dt+和Dt-,其中Dt+包含所有在属性a上取值大于t的样本,Dt-包含所有在属性a上取值小于t的样本。这样对于连续属性a,就有n-1个可选的划分点t。选择其中最优的划分点进行样本集合的划分。

最优划分点的选择可以参照本章第二节介绍的划分选择准则,例如以信息增益准则选取,可选择使Gain(D, a, t)最大化的划分点。Gain(D, a, t)是样本集D基于划分点t二分后的信息增益,即属性a有大于t和小于t两种取值,用属性a把样本集D划分为2个子集,利用本章第二节介绍的方法计算信息增益。在n-1个可选的划分点t中,取信息增益最大的作为最优划分点。

与离散属性不同,连续属性被用于划分当前结点后,还可以继续作为当前结点的后代结点的划分属性。

2、缺失值处理

现实中由于各种客观原因,样本的某些属性值会缺失,如果放弃这些不完整样本,将可能导致数据的浪费,甚至导致学习无法继续,有必要考虑利用缺失属性值的训练样例进行学习。这就需要解决两个问题:一是如何在属性值缺失的情况下选择划分属性?二是选定划分属性,如何对在该属性上值缺失的样本进行划分?

解决这两个问题,需要引入以下定义:

给定训练集D和属性a,令D1表示D中在属性a上无缺失值的样本子集,令wx为对每个样本x赋予的权重(初始为1)。对于属性a,令ρ为D中无缺失值样本所占的比例,pk表示无缺失值样本中第k个分类所站的比例,rv表示无缺失值样本中在属性a上取值为av的样本所占的比例。

对于问题一,可参照本章第二节划分选择介绍的准则,根据D1来判断属性a的优劣,即先计算出Gain(D1, a),再乘以ρ(D中在属性a上无缺失值样本所占的比例),即得到Gain(D, a)。

对于问题二,若样本x在划分属性a上的取值未知(缺失),则将样本x同时划入所有子结点,但其在每个子结点的权值不同,在属性a取值为av的子结点中,样本x的权值为rv*wx,即让同一个样本以不同的概率划入到不同的子结点中。

五、多变量决策树

上述过程介绍的是通过单一属性来对训练集D进行划分,可以把每个属性视为坐标空间的一个坐标轴,d个属性描述的样本就对应了d维空间中的一个点,对样本分类相当于在这个d维坐标空间中寻找不同类别样本的分类边界。

由于决策树学习通过属性将样本集划分,每一次划分都直接对应了某个属性的取值,划分边界的函数形如x = m、y = n等(其图像是平行于坐标轴的直线),因此它所形成的分类边界是由许多与坐标轴平行的分段组成的,即轴平行。

当学习任务的真实分类边界比较复杂时,必须要用很多与坐标轴平行的段划分才能获得较好的近似,此时的决策树会相当复杂,其开销将会很大。如使用斜的划分边界,则决策树模型将会简化,因此提出“多变量决策树”(multivariate decision tree)来实现斜划分。

在多变量决策树中,非叶结点不再仅对某一个属性,而是对多个属性的线性组合进行测试,每个组合的属性都赋予一定的权重。换言之,不是为每个非叶结点寻找一个最优划分属性,而是试图建立一个合适的线性分类器(其函数图像是斜线):

w1a1 + w2a2 + … +wiai = t,其中w是属性a的权重,w和t可通过该结点所含的样本集和属性集学得。

例如,给身高赋予权重0.7,体重赋予权重0.3,那么这个线性分类器可以是:

0.7 * 身高 + 0.3 * 体重 <= 150

如果成立则进一步测试其他属性的线性组合,如果不成立则直接判断为女汉子。


本文为学习思考笔记,难免有错误和不准确之处,欢迎吐糟、探讨。


原创声明:“机器学习笔记”系列文章为本人(李博 blog.xzlib.com)学习《机器学习》(周志华著,清华大学出版社)一书过程中的笔记,内容均为本人结合书中讲述和自身理解所写,文章配图、视频均为本人原创,转载和引用请注明出处并不得篡改作者姓名,本人保留《中华人民共和国著作权法》赋予的所有权利。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值