一决策树的介绍
决策树(decision tree):是一种基本的分类与回归方法,此处主要讨论分类的决策树。
决策树算法在树形结构的基础上直接模仿现实生活中人类做决策的过程如:医学诊断、商业决策等
构成决策树的元素是节点和边。节点会根据样本的特征作出判断,最初的分支点称为根节点,其余的被称为子节点,不再有分支的节点则被称为叶子节点,这些节点代表了样本的分类结果。边则指示着方向
在分类问题中,表示基于特征对实例进行分类的过程,可以认为是if-then的集合,也可以认为是定义在特征空间与类空间上的条件概率分布。
决策树通常有三个步骤:特征选择、决策树的生成、决策树的修剪。
用决策树分类:从根节点开始,对实例的某一特征进行测试,根据测试结果将实例分配到其子节点,此时每个子节点对应着该特征的一个取值,如此递归的对实例进行测试并分配,直到到达叶子节点,最后将实例分到叶节点的类中。
下图为决策树示意图,圆点——内部节点,方框——叶节点
决策树学习的目标:根据给定的训练数据集构建一个决策树模型,使它能够对实例进行正确的分类并在损失函数的意义下,选择最优决策树的问题。
决策树学习的本质:从训练集中归纳出一组分类规则,或者说是由训练数据集估计条件概率模型。
决策树学习的损失函数:正则化的极大似然函数。
决策树学习的测试:最小化损失函数。
决策树原理和问答猜测结果游戏相似,根据一系列数据,然后给出游戏的答案。如下图便是一个简单决策树。
上图为一个决策树流程图,正方形代表判断模块,椭圆代表终止模块,表示已经得出结论,可以终止运行,左右箭头叫做分支。
k-近邻算法可以完成很多分类任务,但是其最大的缺点是无法给出数据的内在含义,决策树的优势在于数据形式非常容易理解。
二决策树的构造
为了构造决策树,人们找到了一个衡量标准熵。在热力学中,熵被用来描述一个系统内在的混乱程度。在决策树中,熵代表分支样本种类的丰富性,样本中种类越多越混乱,熵就越大,如果分支下的样本完全属于同一类,熵就等于0
构建树的基本思路,是随着树的深度也就是层数的增加,让熵快速降低。熵降低的速度越快,代表决策树的分类效率越高。
递归构建决策树:
- 得到原始数据集,然后基于最好的属性值划分数据集,由于特征值可能多于两个,因此可能存在大于两个分支的数据集划分,第一次划分之后,数据将被向下传递到树分支的下一个节点,在此节点在此划分数据,因此可以使用递归的原则处理数据集。
递归结束的条件:
- 程序完全遍历所有划分数据集的属性,或者每个分支下的所有实例都具有相同的分类,如果所有实例具有相同的分类,则得到一个叶子节点或者终止块,任何到达叶子节点的数据必然属于叶子节点的分类。
决策树学习的3个步骤:
1、特征选择
特征选择决定了使用哪些特征来做判断。在训练数据集中,每个样本的属性可能有很多个,不同属性的作用有大有小。因而特征选择的作用就是筛选出跟分类结果相关性较高的特征,也就是分类能力较强的特征。 特征选择的目的是选取能够对训练集分类的特征。
特征选择的关键是准则:信息增益、信息增益比、Gini 指数。
2、决策树生成
选择好特征后,就从根节点触发,对节点计算所有特征的熵,选择合适特征作为节点特征,根据该特征的不同取值建立子节点;对每个子节点使用相同的方式生成新的子节点。
通常是利用信息增益最大、信息增益比最大、Gini 指数最小作为特征选择的准则。从根节点开始,递归的生成决策树。相当于是不断选取局部最优特征,或将训练集分割为基本能够正确分类的子集;
3、决策树剪枝 剪枝(pruning)
从已经生成的树上裁掉一些子树或叶节点,并将其根节点或父节点作为新的叶子节点,从而简化分类树模型。剪枝的主要目的是对抗“过拟合”,通过主动去掉部分分支来降低过拟合的风险。包括预剪枝和后剪枝。
预剪枝是在训练开始前规定条件,如:树达到某一深度就停止训练。 后剪枝树先找到树,再根据一定条件去掉一部分分支,如:限制叶子节点的个数。
总结: 在一棵决策树中
将面临的因素也就是问题的特征构建为树的内部节点;
因素的特征值均构建为该因素特征节点中的分支指针;
最终的类别结果树树的叶子节点; 这样就构成了一棵决策树。
决策树的优缺点
优点:
- 易于理解和解释,决策树可以可视化。
- 几乎不需要数据预处理,决策树不支持缺失值。
- 可以同时处理数值变量和分类变量。其他方法大都适用于分析一种变量的集合。
- 可以处理多值输出变量问题。
- 使用白盒模型。如果一个情况被观察到,使用逻辑判断容易表示这种规则。相反,如果是黑盒模型(例如人工神经网络),结果会非常难解释。
缺点:
- 决策树学习可能创建一个过于复杂的树,并不能很好的预测数据。也就是过拟合。修剪机制,设置一个叶子节点需要的最小样本数量,或者数的最大深度,可以避免过拟合。
- 决策树可能是不稳定的,因为即使非常小的变异,可能会产生一颗完全不同的树。这个问题通过decision trees with an ensemble来缓解。
- 学习一颗最优的决策树是一个NP-完全问题under several aspects of optimality and even for simple concepts。因此,传统决策树算法基于启发式算法,例如贪婪算法,即每个节点创建最优决策。这些算法不能产生一个全家最优的决策树。对样本和特征随机抽样可以降低整体效果偏差。
- 如果某些分类占优势,决策树将会创建一棵有偏差的树。因此,建议在训练之前,先抽样使样本均衡。
决策树学习的算法通常是一个递归地选择最优特征,并根据该特征对训练数据进行分割,使得各个子数据集有一个最好的分类的过程。这一过程对应着对特征空间的划分,也对应着决策树的构建。
- 开始:构建根节点,将所有训练数据都放在根节点,选择一个最优特征,按着这一特征将训练数据集分割成子集,使得各个子集有一个在当前条件下最好的分类。
- 如果这些子集已经能够被基本正确分类,那么构建叶节点,并将这些子集分到所对应的叶节点去。
- 如果还有子集不能够被正确的分类,那么就对这些子集选择新的最优特征,继续对其进行分割,构建相应的节点,如此递归进行,直至所有训练数据子集被基本正确的分类,或者没有合适的特征为止。
- 每个子集都被分到叶节点上,即都有了明确的类,这样就生成了一颗决策树。
使用决策树做预测需要以下过程:
- 收集数据:可以使用任何方法。比如想构建一个相亲系统,我们可以从媒婆那里,或者通过参访相亲对象获取数据。根据他们考虑的因素和最终的选择结果,就可以得到一些供我们利用的数据了。
- 准备数据:收集完的数据,我们要进行整理,将这些所有收集的信息按照一定规则整理出来,并排版,方便我们进行后续处理。
- 分析数据:可以使用任何方法,决策树构造完成之后,我们可以检查决策树图形是否符合预期。
- 训练算法:这个过程也就是构造决策树,同样也可以说是决策树学习,就是构造一个决策树的数据结构。
- 测试算法:使用经验树计算错误率。当错误率达到了可接收范围,这个决策树就可以投放使用了。
- 使用算法:此步骤可以使用适用于任何监督学习算法,而使用决策树可以更好地理解数据的内在含义。
在学习决策树的构建方法之前,我们先介绍两个非常重要的概念:信息增益和信息增益比。
1.信息熵
熵是神马东东?信息论的开山祖师爷Shannon明确告诉我们,信息的不确定性可以用熵来表示:
对于一个取有限个值的随机变量X,如果其概率分布为:
那么随机变量X的熵可以用以下公式描述:
每次看到这个式子,都会从心底里感叹数学的伟大与奇妙。在这之前,信息这东东对于人们来说,是个看着好像挺清晰实际还是很模糊的概念。Shannon用最简洁美妙的方式,告诉了整个世界信息到底应该怎么去衡量去计算。今天每个互联网人都知道,这个衡量的标准就是bit。正是由于bit的出现,才引领了我们今天信息时代的到来。所以即使把Shannon跟世界上最伟大的那些科学家相提并论,我觉得也丝毫不为过。
举个例子,如果一个分类系统中,类别的标识是c cc,取值情况是c 1 ,c 2 ,⋯,c n ,n为类别的总数。那么此分类系统的熵为:
其中p ( c 0 )、p ( c 1 )分别为正负样本出现的概率。
2.条件熵(Conditional Entropy)与信息增益(Information Gain)
第一节我们谈到,信息的不确定性我们用熵来进行描述。很多时候,我们渴望不确定性,渴望明天又是新的一天,希望寻找新的刺激与冒险,所谓的七年之庠就是最好的例子。但是又有很多时候,我们也讨厌不确定性,比如现在的RTB广告,很多时候广告主其实希望不管什么情况下,这个广告位都是归我所有来投广告,别人都别跟我来抢,我把广告素材准备好以后,媒体按排期给我播就行了。所以在这种情况下,我们又要竭力去消除系统的不确定性。
那怎么样去消除系统的不确定性呢?当我们知道的信息越多的时候,自然随机事件的不确定性就越小。举个简单的例子:
如果投掷一枚均匀的筛子,那么筛子出现1-6的概率是相等的,此时,整个系统的熵可以表述为:
如果我们加一个特征,告诉你掷筛子的结果出来是偶数,因为掷筛子出来为偶数的结果只可能为2,4,6,那么此时系统的熵为:
因为我们加了一个特征x:结果为偶数,所以整个系统的熵减小,不确定性降低。
来看下条件熵的表达式:
1.当特征x xx被固定为值x i
时,条件熵为: H ( c ∣ x = x i )
2.当特征X XX的整体分布情况被固定时,条件熵为:H ( c ∣ X )
应该不难看出:
其中,n为特征X XX所出现所有种类的数量。
那么因为特征X被固定以后,给系统带来的增益(或者说为系统减小的不确定度)为:
举个别人文章中例子:文本分类系统中的特征X,那么X有几个可能的值呢?注意X是一个固定的特征,比如关键词"经济",当我们说特征"经济"可能的取值时,实际上只有两个,要么出现,要么不出现。假设x xx代表x xx出现,而x ˉ 表示x xx不出现。注意系统包含x xx但x xx不出现与系统根本不包含x xx可是两回事。
因此固定X XX时系统的条件熵为:
特征X XX给系统带来的信息增益(IG)为:
式子看上去很长,其实计算起来很简单,都是一些count的操作。
- − ∑ i = 1 n p ( c i ) log 2 p ( c i ) 这一项不用多说,就是统计各个类别的概率,将每个类别的样本数量除以总样本量即可。
- $ p(x) \sum_{i=1}^n p(c_i|x) \log_2 p(c_i|x)这 一 项 ,p(x)表 示 特 征 在 样 本 中 出 现 的 概 率 , 将 特 征 出 现 的 次 数 除 以 样 本 总 量 即 可 。
- p(c_i|x)表 示 特 征 出 现 的 情 况 下 , 每 个 类 别 的 概 率 分 别 为 多 少 , 也 全 是 c o u n t 操 作 。 表示特征出现的情况下,每个类别的概率分别为多少,也全是count操作。p(c_i| \bar x)$操作以此类推。
3.信息增益做特征选择的优缺点
先来说说优点:
1.信息增益考虑了特征出现与不出现的两种情况,比较全面,一般而言效果不错。
2.使用了所有样例的统计属性,减小了对噪声的敏感度。
3.容易理解,计算简单。
主要的缺陷:
1.信息增益考察的是特征对整个系统的贡献,没有到具体的类别上,所以一般只能用来做全局的特征选择,而没法针对单个类别做特征选择。
2.只能处理离散型的属性值,没法处理连续值的特征。
3.算法天生偏向选择分支多的属性,容易导致overfitting。
4.信息增益比(Infomation Gain Ratio)
前面提到,信息增益的一个大问题就是偏向选择分支多的属性导致overfitting,那么我们能想到的解决办法自然就是对分支过多的情况进行惩罚(penalty)了。于是我们有了信息增益比,或者说信息增益率:
特征X 的熵:
特征X 的信息增益 :
那么信息增益比为:
在决策树算法中,ID3使用信息增益,c4.5使用信息增益比。
5.Gini系数
Gini系数是一种与信息熵类似的做特征选择的方式,可以用来数据的不纯度。在CART(Classification and Regression Tree)算法中利用基尼指数构造二叉决策树。
Gini系数的计算方式如下:
其中,D表示数据集全体样本p i表示每种类别出现的概率。取个极端情况,如果数据集中所有的样本都为同一类,那么有p 0 = 1 ,Gini(D)=0,显然此时数据的不纯度最低。
与信息增益类似,我们可以计算如下表达式:
上面式子表述的意思就是,加入特征X XX以后,数据不纯度减小的程度。很明显,在做特征选择的时候,我们可以取ΔGini(X)最大的那个