您的位置:首页 > 其它

机器学习之决策树整理

2014-07-31 10:09 633 查看
一、决策树包含三种类型的节点: 

1.决策节点——通常用矩形框来表式 2.机会节点——通常用圆圈来表式 3.终结点——通常用三角形来表示

如何预测
先看看下面的数据表格:
ID

拥有房产(是/否)

婚姻情况(单身,已婚,离婚)

年收入(单位:千元)

无法偿还债务(是/否)

1



单身

125



2



已婚

100



3



单身

70



4



已婚

120



5



离婚

95



6



已婚

60



7



离婚

220



8



单身

85



9



已婚

75



10



单身

90



上表根据历史数据,记录已有的用户是否可以偿还债务,以及相关的信息。通过该数据,构建的决策树如下:




比如新来一个用户:无房产,单身,年收入55K,那么根据上面的决策树,可以预测他无法偿还债务(蓝色虚线路径)。从上面的决策树,还可以知道是否拥有房产可以很大的决定用户是否可以偿还债务,对借贷业务具有指导意义。

基本步骤
决策树构建的基本步骤如下:
1. 开始,所有记录看作一个节点
2. 遍历每个变量的每一种分割方式,找到最好的分割点
3. 分割成两个节点N1和N2
4. 对N1和N2分别继续执行2-3步,直到每个节点足够“纯”为止
决策树的变量可以有两种:
1) 数字型(Numeric):变量类型是整数或浮点数,如前面例子中的“年收入”。用“>=”,“>”,“<”或“<=”作为分割条件(排序后,利用已有的分割情况,可以优化分割算法的时间复杂度)。
2) 名称型(Nominal):类似编程语言中的枚举类型,变量只能重有限的选项中选取,比如前面例子中的“婚姻情况”,只能是“单身”,“已婚”或“离婚”。使用“=”来分割。

如何评估分割点的好坏?如果一个分割点可以将当前的所有节点分为两类,使得每一类都很“纯”,也就是同一类的记录较多,那么就是一个好分割点。比如上面的例子,“拥有房产”,可以将记录分成了两类,“是”的节点全部都可以偿还债务,非常“纯”;“否”的节点,可以偿还贷款和无法偿还贷款的人都有,不是很“纯”,但是两个节点加起来的纯度之和与原始节点的纯度之差最大,所以按照这种方法分割。构建决策树采用贪心算法,只考虑当前纯度差最大的情况作为分割点。

量化纯度
前面讲到,决策树是根据“纯度”来构建的,如何量化纯度呢?这里介绍三种纯度计算方法。如果记录被分为n类,每一类的比例P(i)=第i类的数目/总数目。还是拿上面的例子,10个数据中可以偿还债务的记录比例为P(1) = 7/10 = 0.7,无法偿还的为P(2) = 3/10 = 0.3,N = 2。
Gini不纯度



熵(Entropy)



错误率



上面的三个公式均是值越大,表示越 “不纯”,越小表示越“纯”。三种公式只需要取一种即可,实践证明三种公司的选择对最终分类准确率的影响并不大,一般使用熵公式。
纯度差,也称为信息增益(Information Gain),公式如下:



其中,I代表不纯度(也就是上面三个公式的任意一种),K代表分割的节点数,一般K = 2。vj表示子节点中的记录数目。上面公式实际上就是当前节点的不纯度减去子节点不纯度的加权平均数,权重由子节点记录数与当前节点记录数的比例决定。

停止条件
决策树的构建过程是一个递归的过程,所以需要确定停止条件,否则过程将不会结束。一种最直观的方式是当每个子节点只有一种类型的记录时停止,但是这样往往会使得树的节点过多,导致过拟合问题(Overfitting)。另一种可行的方法是当前节点中的记录数低于一个最小的阀值,那么就停止分割,将max(P(i))对应的分类作为当前叶节点的分类。

过渡拟合
采用上面算法生成的决策树在事件中往往会导致过滤拟合。也就是该决策树对训练数据可以得到很低的错误率,但是运用到测试数据上却得到非常高的错误率。过渡拟合的原因有以下几点:
噪音数据:训练数据中存在噪音数据,决策树的某些节点有噪音数据作为分割标准,导致决策树无法代表真实数据。
缺少代表性数据:训练数据没有包含所有具有代表性的数据,导致某一类数据无法很好的匹配,这一点可以通过观察混淆矩阵(Confusion Matrix)分析得出。
多重比较(Mulitple Comparition):举个列子,股票分析师预测股票涨或跌。假设分析师都是靠随机猜测,也就是他们正确的概率是0.5。每一个人预测10次,那么预测正确的次数在8次或8次以上的概率为


,只有5%左右,比较低。但是如果50个分析师,每个人预测10次,选择至少一个人得到8次或以上的人作为代表,那么概率为


,概率十分大,随着分析师人数的增加,概率无限接近1。但是,选出来的分析师其实是打酱油的,他对未来的预测不能做任何保证。上面这个例子就是多重比较。这一情况和决策树选取分割点类似,需要在每个变量的每一个值中选取一个作为分割的代表,所以选出一个噪音分割标准的概率是很大的。

优化方案1:修剪枝叶
决策树过渡拟合往往是因为太过“茂盛”,也就是节点过多,所以需要裁剪(Prune Tree)枝叶。裁剪枝叶的策略对决策树正确率的影响很大。主要有两种裁剪策略。
前置裁剪 在构建决策树的过程时,提前停止。那么,会将切分节点的条件设置的很苛刻,导致决策树很短小。结果就是决策树无法达到最优。实践证明这中策略无法得到较好的结果。
后置裁剪 决策树构建好后,然后才开始裁剪。采用两种方法:1)用单一叶节点代替整个子树,叶节点的分类采用子树中最主要的分类;2)将一个字数完全替代另外一颗子树。后置裁剪有个问题就是计算效率,有些节点计算后就被裁剪了,导致有点浪费。

优化方案2:K-Fold Cross Validation
首先计算出整体的决策树T,叶节点个数记作N,设i属于[1,N]。对每个i,使用K-Fold Validataion方法计算决策树,并裁剪到i个节点,计算错误率,最后求出平均错误率。这样可以用具有最小错误率对应的i作为最终决策树的大小,对原始决策树进行裁剪,得到最优决策树。

优化方案3:Random Forest
Random Forest是用训练数据随机的计算出许多决策树,形成了一个森林。然后用这个森林对未知数据进行预测,选取投票最多的分类。实践证明,此算法的错误率得到了经一步的降低。这种方法背后的原理可以用“三个臭皮匠定一个诸葛亮”这句谚语来概括。一颗树预测正确的概率可能不高,但是集体预测正确的概率却很高。

准确率估计
决策树T构建好后,需要估计预测准确率。直观说明,比如N条测试数据,X预测正确的记录数,那么可以估计acc = X/N为T的准确率。但是,这样不是很科学。因为我们是通过样本估计的准确率,很有可能存在偏差。所以,比较科学的方法是估计一个准确率的区间,这里就要用到统计学中的置信区间(Confidence Interval)。
设T的准确率p是一个客观存在的值,X的概率分布为X ~ B(N,p),即X遵循概率为p,次数为N的二项分布(Binomial Distribution),期望E(X) = N*p,方差Var(X) = N*p*(1-p)。由于当N很大时,二项分布可以近似有正太分布(Normal Distribution)计算,一般N会很大,所以X ~ N(np,n*p*(1-p))。可以算出,acc = X/N的期望E(acc) = E(X/N) = E(X)/N = p,方差Var(acc)
= Var(X/N) = Var(X) / N2 = p*(1-p) / N,所以acc ~ N(p,p*(1-p)/N)。这样,就可以通过正太分布的置信区间的计算方式计算执行区间了。
正太分布的置信区间求解如下:
1) 将acc标准化,即


2) 选择置信水平α= 95%,或其他值,这取决于你需要对这个区间有多自信。一般来说,α越大,区间越大。
3) 求出 α/2和1-α/2对应的标准正太分布的统计量





(均为常量)。然后解下面关于p的不等式。acc可以有样本估计得出。即可以得到关于p的执行区间




二、决策树基本算法

1、ID3

通过自顶向下构造决策树来进行学习。构造过程是从“哪一个属性将在树的根结点被测试?”这个问题开始的。为了回答这个问题,使用统计测试来确定每一个实例属性单独分类训练样例的能力。分类能力最好的属性被选作树的根结点的测试。然后为根节点属性的每个可能值产生一个分支,并把训练样例排列到适当的分支之下。然后重复整个过程,用每个分支结点关联的训练样例来选取在该点被测试的最佳属性。这形成了对合格决策树的贪婪搜索(greedy
search),也就是算法从不回溯重新考虑原来的选。

专门用于学习布尔函数的ID3算法概要
ID3(Examples,Target_attribute,Attributes)

Examples即训练样例集。Target_attribute是这棵树要测试的目标属性。Attributes是除目标属性外供学习到的决策树测试的属性列表。返回一棵能正确分类给定Examples的决策树。

•如果Examples都为正,那么返回label=+的单结点树Root
•如果Examples都为反,那么返回label=+的单结点树Root
•如果Attributes为空,那么返回单结点树Root,label=Examples中最普遍的Target_attribute的值
•否则开始
•A←Attributes中分类Examples能力最好的属性
•Root的决策属性←A
•对于A的每个可能值vi
       •在Root下加一个新的分支对应测试A=vi
          •令Examples vi为Examples中满足A属性值为vi的子集
      •如果Examples vi为空
          •在这个新分支下加一个叶子结点,结点的label=Examples中最普遍的Target_attribute值
          •否则在这个新分支下加一个子树ID3(Examples vi,Target_attribute,Attributes-{A})
     •结束
     •返回Root

2. 哪个属性是最佳的分类属性

熵(entropy):刻画了任意样例集的纯度(purity)。
熵确定了要编码集合S中任意成员(即以均匀的概率随机抽出的一个成员)的分类所需要的最小二进制位数。
如果目标属性具有c个不同的值,那么S相对c个状态(c-wise)的分类的熵定义为:



Pi是S中属于类别i的比例。
信息增益(information gain):一个属性的信息增益就是由于使用这个属性分割样例而导致的期望熵降低。



Values(A)是属性A所有可能值的集合,Sv 是S中属性A的值为v的子集。
例如,假定S包含14个样例-[9+,5-]。在这14个样例中,假定正例中的6个和反例中的2个有Wind=Weak,其他的有Wind=Strong。由于按照属性Wind分类14个样例得到的信息增益可以计算如下。
Values(Wind)=Weak,Strong
S=[9+,5-]
SWeak←[6+,2-]
Sstrong←[3+,3-]

=Entropy(S)-(8/14)Entropy(SWeak)-(6/14)Entropy(Sstrong)
=0.940-(8/14)0.811-(6/14)1.00
=0.048

3.举例



首先计算四个属性的信息增益:
Gain(S,Outlook)=0.246
Gain(S,Humidity)=0.151
Gain(S,Wind)=0.048
Gain(S,Temperature)=0.029
根据信息增益标准,属性Outlook在训练样例上提供了对目标属性PlayTennis的最佳预测。



Ssunny ={D1,D2,D8,D9,D11}
Gain(Ssunny,Humidity)=0.970-(3/5)0.0-(2/5)0.0=.970
Gain(Ssunny, Temperature)=0.970-(2/5)1.0-(2/5)1.0-(1/5)0.0=.570
Gain(Ssunny ,Wind)=0.970-(2/5)1.0-(3/5).918=.019

五.决策树学习中的假设空间搜索

ID3算法中的假设空间包含所有的决策树,它是关于现有属性的有限离散值函数的一个完整空间。
当变了决策树空间时,ID3仅维护单一的当前假设。
基本的ID3算法在搜索中不进行回溯。
ID3算法在搜索的每一步都使用当前的所有训练样例,以统计为基础觉得怎样简化以前的假设。

2、C4.5算法

C4.5克服了ID3的2个缺点:
1.用信息增益选择属性时偏向于选择分枝比较多的属性值,即取值多的属性

2.不能处理连贯属性
OutlookTemperatureHumidityWindyPlayGolf?
sunny8585FALSEno
sunny8090TRUEno
overcast8386FALSEyes
rainy7096FALSEyes
rainy6880FALSEyes
rainy6570TRUEno
overcast6465TRUEyes
sunny7295FALSEno
sunny6970FALSEyes
rainy7580FALSEyes
sunny7570TRUEyes
overcast7290TRUEyes
overcast8175FALSEyes
rainy7191TRUEno
Outlook和Windy取离散值,Temperature和Humidity则取连续值。

对于离散属性V,ID3中计算的是“信息增益”,C4.5中则计算“信息增益率”:




    
vj表示属性V的各种取值,在ID3中用信息增益选择属性时偏向于选择分枝比较多的属性值,即取值多的属性,在C4.5中由于除以了H(V),可以削弱这种作用。
C4.5是如何处理连续属性的呢?实际上它先把连续属性转换为离散属性再进行处理。虽然本质上属性的取值是连续的,但对于有限的采样数据它是离散的,如果有N条样本,那么我们有N-1种离散化的方法:<=vj的分到左子树,>vj的分到右子树。计算这N-1种情况下最大的信息增益率。

在离散属性上只需要计算1次信息增益率,而在连续属性上却需要计算N-1次,计算量是相当大的。有办法可以减少计算量。对于连续属性先进行排序,只有在决策属性发生改变的地方才需要切开。比如对Temperature进行排序



本来有13种离散化的情况,现在只需计算7种。如果利用增益率来选择连续值属性的分界点,会导致一些副作用。分界点将样本分成两个部分,这两个部分的样本个数之比也会影响增益率。根据增益率公式,我们可以发现,当分界点能够把样本分成数量相等的两个子集时(我们称此时的分界点为等分分界点),增益率的抑制会被最大化,因此等分分界点被过分抑制了。子集样本个数能够影响分界点,显然不合理。因此在决定分界点是还是采用增益这个指标,而选择属性的时候才使用增益率这个指标。这个改进能够很好得抑制连续值属性的倾向。当然还有其它方法也可以抑制这种倾向,比如MDL。

Tree-Growth终止的条件以及剪枝策略很多,在CART树中已讲了一些。每个叶子上都是“纯的”不见得就是好事,那样会过拟合。还有一个方法是叶子节点上覆盖的样本个数小于一个阈值时停止Tree-Growth。
在《CART树》中介绍了基于代价复杂性的剪枝法,剪枝的目的也是为了避免过拟合。

第一种方法,也是最简单的方法,称之为基于误判的剪枝。这个思路很直接,完全的决策树不是过度拟合么,我再搞一个测试数据集来纠正它。对于完全决策树中的每一个非叶子节点的子树,我们尝试着把它替换成一个叶子节点,该叶子节点的类别我们用子树所覆盖训练样本中存在最多的那个类来代替,这样就产生了一个简化决策树,然后比较这两个决策树在测试数据集中的表现,如果简化决策树在测试数据集中的错误比较少,并且该子树里面没有包含另外一个具有类似特性的子树(所谓类似的特性,指的就是把子树替换成叶子节点后,其测试数据集误判率降低的特性),那么该子树就可以替换成叶子节点。该算法以bottom-up的方式遍历所有的子树,直至没有任何子树可以替换使得测试数据集的表现得以改进时,算法就可以终止。

第一种方法很直接,但是需要一个额外的测试数据集,能不能不要这个额外的数据集呢?为了解决这个问题,于是就提出了悲观剪枝。悲观剪枝就是递归得估算每个内部节点所覆盖样本节点的误判率。剪枝后该内部节点会变成一个叶子节点,该叶子节点的类别为原内部节点的最优叶子节点所决定。然后比较剪枝前后该节点的错误率来决定是否进行剪枝。该方法和前面提到的第一种方法思路是一致的,不同之处在于如何估计剪枝前分类树内部节点的错误率。
把一颗子树(具有多个叶子节点)的分类用一个叶子节点来替代的话,在训练集上的误判率肯定是上升的,但是在新数据上不一定。于是我们需要把子树的误判计算加上一个经验性的惩罚因子。对于一颗叶子节点,它覆盖了N个样本,其中有E个错误,那么该叶子节点的错误率为(E+0.5)/N。这个0.5就是惩罚因子,那么一颗子树,它有L个叶子节点,那么该子树的误判率估计为

。这样的话,我们可以看到一颗子树虽然具有多个子节点,但由于加上了惩罚因子,所以子树的误判率计算未必占到便宜。剪枝后内部节点变成了叶子节点,其误判个数J也需要加上一个惩罚因子,变成J+0.5。那么子树是否可以被剪枝就取决于剪枝后的错误J+0.5在

的标准误差内。对于样本的误差率e,我们可以根据经验把它估计成各种各样的分布模型,比如是二项式分布,比如是正态分布。

那么一棵树错误分类一个样本值为1,正确分类一个样本值为0,该树错误分类的概率(误判率)为e(e为分布的固有属性,可以通过

统计出来),那么树的误判次数就是伯努利分布,我们可以估计出该树的误判次数均值和标准差:





把子树替换成叶子节点后,该叶子的误判次数也是一个伯努利分布,其概率误判率e为(E+0.5)/N,因此叶子节点的误判次数均值为



使用训练数据,子树总是比替换为一个叶节点后产生的误差小,但是使用校正后有误差计算方法却并非如此,当子树的误判个数大过对应叶节点的误判个数一个标准差之后,就决定剪枝:



这个条件就是剪枝的标准。
当并不一定非要大一个标准差,可以给定任意的置信区间,我们设定一定的显著性因子,就可以估算出误判次数的上下界。



比如T4这棵子树的误差率:



子树误差率的标准误差:



子树替换为一个叶节点后,其误差率为:



因为

,所以决定将子树T4替换这一个叶子节点。

参考原文地址:http://www.cnblogs.com/lufangtao/archive/2013/05/30/3103588.html

http://www.cnblogs.com/bourneli/archive/2013/03/15/2961568.html

http://www.cnblogs.com/zhangchaoyang/articles/2842490.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息