话你知-决策树

来源:互联网 发布:apache ftpclient 编辑:程序博客网 时间:2024/05/22 07:07

这一篇主要讲我在学习决策树过程中的一些思路整理和比较直白的说明。以下不涉及具体的公式计算,如果想要了解更多,不妨看一下我的另一篇博文:http://blog.csdn.net/savinger/article/details/52819900

当然,要讨论一个问题,免不了“是什么,为什么以及怎么做”这个经典的套路。
首先,什么是决策树呢?
就我个人的理解,决策树就是通过一步一步的判断和决策,把数据进行分类或者是回归的过程。然后,因为这一个过程,很像是一棵树的结构,所以就称为决策树。

那么,决策树有哪几种呢?
按照功能来讲,决策树分为两种:即分类树和回归树;按照不同种方法,决策树有ID3、C4.5、C5.0、CART和QUEST等等。可以理解为,决策树的本质就是做分类或者回归,然后不同的人对原始的决策树进行修改和加强,于是就有多个版本的决策树。

按照剧本,接下来应该谈的,就应该是决策树的流程了吧?
最基本的,我们需要原始数据。这份数据里面,需要有预测变量和目标变量。这里所说的预测变量,就是我们常说的特征。而在分类树中,目标变量为离散型变量,在回归树中,目标变量为连续型变量。为了便于理解,举一个简单的例子:现在我们有一份医院的数据,里面有一大批病患的身高(高,中等,低),体重(重,中等,轻),血型(A,B,AB,O),性别(男,女)的信息。然后我们把他们的身高,体重,血型作为特征,然后把性别作为目标变量,构建一颗决策树来研究这些特征与性别的关系。这里因为性别是男或女,为分类型变量,所以构建的是一颗分类决策树。

那么有了这些数据后,决策树怎么构造呢?
简单地讲,决策树就是通过数据的特征,进行一步步的决策和划分。但是到底应该从什么特征开始入手呢?这时候就需要涉及几个概念了,信息熵、信息增益、信息增益率和基尼指数。所谓的信息熵,就是用来描述原始数据的纯度。比如在分类树中,假定当前数据集合D中第k类数据所占的比例为pk(k=1,2,…,|y|),则D的信息熵定义为:
这里写图片描述
Ent(D)的值越小,则数据集D的纯度越高。

关于ID3决策树:
有了信息熵后,接下来出场的就是信息增益了。所谓的信息增益,就是用来衡量使用每种特征进行数据划分时的“纯度提升”程度,然后对它们进行排序,选择信息增益最大的特征进行当前的数据划分。还是举上面提到过的医院数据的例子,我们计算病患的身高,体重和血型的信息增益,然后对这三种特征的信息增益进行排序,之后选择信息增益最大的特征做为当前分支结点的划分特征。然后以此类推,直至这个决策树构造完成。信息增益的计算公式如下:
这里写图片描述
优缺点:
(1)由信息增益的概念和计算公式可知,其对可取值数目较多的特征有所偏好。简单来说,当每个分支结点包含非常少甚至只有一个样本,这些分支节点的纯度达到最大,因此信息增益相对应最大。然而,这样的决策树不具有泛化能力,很可能会过拟合,无法对新样本进行有效预测。比如,数据的序号的信息增益是最大的,但以此作为划分特征没实际意义。
(2)ID3只能处理取值离散的特征,像上面举的医院的数据,如果身高和体重是连续值,即取每个病患的具体重量和身高,那么ID3是无法处理这两个特征的。但换个角度看,只要我们事先处理好这些特征,把他们按照高,中等,轻等进行分类,那么还是可以使用ID3的,只不过麻烦了点。

关于C4.5决策树:
这种决策树其实是ID3的一种增强和改进版,其主要的特点或者说优势如下:
(1)使用信息增益率,用来弱化ID3使用信息增益时对可取值数目较多的特征的偏好。而且C4.5算法并不是直接选择增益率最大的候选划分特征,而是使用了一个启发式:先从候选划分特征中找出信息增益高于平均水平的特征,再从中选择增益率最高的。
这里写图片描述
(2)可以处理取值为连续值的特征,将其离散化。简单来说,其方法是先对该特征中的所有数值进行排序,
然后将相邻两个数值的平均值作为候选划分点。通过计算每个候选划分点的信息增益,取信息增益最大的那个作为最终划分点t,把该特征分为小于t和大于t两类。这样,就可以实现特征的离散化。而且,需要注意的是,与离散属性不同,若当前结点划分属性为连续属性,该属性还可以作为其后代结点的划分属性。
(3)可以处理缺失值。在有缺失值的情况下,需要解决两个问题:
如何在特征缺失的情况下进行划分特征选择?还是举上面的医院数据的例子,即只给了你一大堆数据,但是你不知道这些数据是病患的身高还是其他。这种情况下,是只取那些没有缺失值的特征的信息增益,只不过在计算信息增益时根据缺失值的数量调整了一下每个特征的权重;
给定划分特征后,若样本在该特征上的值缺失,如何对样本进行划分?这种情况,就类似于给你一大堆病患身高的样本数据,但是有几个病患的身高的值缺失了。如果此时身高这一特征的信息增益最大,也就是当前分支结点以身高作为划分特征,那么就将这些样本分给所有的子结点,然后相对应地调整一下权重。简单来说,就是让同一个样本以不同的概率划分到不同的子结点中。同样的,如果缺失的是病患的体重的值,但是当前结点是以身高作为划分特征,那么还是正常地把这些病患的数据分给相对应的子节点。

关于CART决策树:
这种决策树算法引入了基尼和基尼指数两个概念。所谓基尼,反映的是从数据集D中随机抽取两个样本,其类别标记不一致的概率。因此,基尼值越小,则数据集D的纯度越高,这点跟信息熵类似。而基尼指数跟信息增益也同样类似,选择候选特征中基尼指数最小的特征作为划分。
基尼值计算:
这里写图片描述
基尼指数计算:
这里写图片描述
特点:
CART是一个二叉树,即每一次选定划分特征后,都把特征的值划分为两部分,而ID3和C4.5没有这个特性。

那么,决策树怎样才算构造完成或者说什么情况下会终止呢?
一种情况是,假如当前的分支中,全部数据在所有特征上的取值一样时,无法继续划分,结束构造决策树;另一种情况是,假如当前分支已经没有特征继续可供划分,或者说所有特征都划分完毕了,那么决策树也会停止构造。但如果按照这种构造方法,很容易把数据分得太细,构造出太复杂的决策树,导致泛化能力不够,甚至引起过拟合。

如何避免过拟合?
防止过拟合的常见方法是进行剪枝,目的是为了去掉一些节点,包括叶节点和中间节点。 感觉就像是在制作一个高考作文模板一样,去掉个性化的东西,多一点可供模仿的主题和套路。这样子,遇到不同的高考题目,都具有举一反三的“可泛化”能力。而剪枝有预剪枝和后剪枝两种。
(1)预剪枝是在构建决策树的过程中,提前终止决策树的生长,从而避免过多的节点的产生。预剪枝使得决策树的很多分支没有“展开”,不仅降低了过拟合的风险,还显著减少了决策树的训练和测试的时间开销。虽然有些分支的当前划分虽不能提升泛化性能,甚至可能使泛化性能暂时降低,但是在其基础上进行的后续划分却有可能使得泛化性能显著提升,即预剪枝容易达成局部最优解。简单来说,预剪枝就是当一个足球运动员在一场比赛犯错后,以后就直接不让他上场了,即便他有潜力成为下一个梅西。
(2)后剪枝就是在决策树构建完后再去掉一些节点,通常比预剪枝决策树保留更多的分支。其欠拟合风险小,泛化性能往往优于预剪枝决策树。但是其训练时间开销比未剪枝和预剪枝决策树要大得多。打个比方,后剪枝就像是根据科比的整个篮球生涯,然后写一本传记选出他的最能让后辈学习的篮球技巧或者精神品质。这样子的话,虽然得等他退役后才能评选出,但是却是比较全面和客观的,包括他在退役之战砍下60分的不服输的品质。而预剪枝就像是在科比遭受跟腱断裂后就认为科比已经可以退役了,然后就匆忙出了一本传记。可是,谁想到他能复出并打得那么顽强,还能在退役之战砍下60分?
(3)常见后剪枝方法有四种:悲观错误剪枝(PEP)、最小错误剪枝(MEP)、代价复杂度剪枝(CCP)和基于错误的剪枝(EBP)。
C4.5采用悲观剪枝,而CART算法使用了代价复杂度剪枝。

0 0