数据挖掘3---决策树的构造

今天学习了决策树算法中的ID3、c4.5、CART算法,记录如下:

    决策树算法:顾名思义,以二分类问题为例,即利用自变量构造一颗二叉树,将目标变量区分出来,所有决策树算法的关键点如下:

    1.分裂属性的选择。即选择哪个自变量作为树叉,也就是在n个自变量中,优先选择哪个自变量进行分叉。而采用何种计算方式选择树叉,决定了决策树算法的类型,即ID3、c4.5、CART三种决策树算法选择树叉的方式是不一样的,后文详细描述。

    2.树剪枝。即在构建树叉时,由于数据中的噪声和离群点,许多分支反映的是训练数据中的异常,而树剪枝则是处理这种过分拟合的数据问题,常用的剪枝方法为先剪枝和后剪枝。后文详细描述。

    为了描述方便,本文采用评价电信服务保障中的满意度预警专题来解释决策树算法,即假如我家办了电信的宽带,有一天宽带不能上网了,于是我打电话给电信报修,然后电信派相关人员进行维修,修好以后电信的回访专员询问我对这次修理障碍的过程是否满意,我会给我对这次修理障碍给出相应评价,满意或者不满意。根据历史数据可以建立满意度预警模型,建模的目的就是为了预测哪些用户会给出不满意的评价。目标变量为二分类变量:满意(记为0)和不满意(记为1)。自变量为根据修理障碍过程产生的数据,如障碍类型、障碍原因、修障总时长、最近一个月发生故障的次数、最近一个月不满意次数等等。简单的数据如下:

客户ID 故障原因 故障类型 修障时长    满意度
001 1 5 10.2 1
002 1 5 12 0
003 1 5 14 1
004 2 5 16 0
005 2 5 18 1
006 2 6 20 0
007 3 6 22 1
008 3 6 23 0
009 3 6 24 1
010 3 6 25 0

故障原因和故障类型都为离散型变量,数字代表原因ID和类型ID。修障时长为连续型变量,单位为小时。满意度中1为不满意、0为满意。

    下面沿着分裂属性的选择和树剪枝两条主线,去描述三种决策树算法构造满意度预警模型:

    分裂属性的选择:即该选择故障原因、故障类型、修障时长三个变量中的哪个作为决策树的第一个分支。

ID3算法是采用信息增益来选择树叉,c4.5算法采用增益率,CART算法采用Gini指标。此外离散型变量和连续型变量在计算信息增益、增益率、Gini指标时会有些区别。详细描述如下:

    1.ID3算法的信息增益:

     信息增益的思想来源于信息论的香农定理,ID3算法选择具有最高信息增益的自变量作为当前的树叉(树的分支),以满意度预警模型为例,模型有三个自变量:故障原因、故障类型、修障时长。分别计算三个自变量的信息增益,选取其中最大的信息增益作为树叉。信息增益=原信息需求-要按某个自变量划分所需要的信息。

如以自变量故障原因举例,故障原因的信息增益=原信息需求(即仅仅基于满意度类别比例的信息需求,记为a)-按照故障原因划分所需要的信息需求(记为a1)。

其中原信息需求a的计算方式为:

决策树算法学习笔记

其中D为目标变量,此例中为满意度。m=2,即满意和不满意两种情况。Pi为满意度中属于分别属于满意和不满意的概率。此例中共计10条数据,满意5条,不满意5条。概率都为1/2。Info(满意度)即为仅仅基于满意和满意的类别比例进行划分所需要的信息需求,计算方式为:

决策树算法学习笔记
按照故障原因划分所需要的信息需求(记为a1)可以表示为:

决策树算法学习笔记
其中A表示目标变量D(即满意度)中按自变量A划分所需要的信息,即按故障类型进行划分所需要的信息。V表示在目标变量D(即满意度)中,按照自变量A(此处为故障原因)进行划分,即故障原因分别为1、2、3进行划分,将目标变量分别划分为3个子集,{D1、D2、D3},因此V=3。即故障原因为1的划分中,有2个不满意和1个满意。D1即指2个不满意和1个满意。故障原因为2的划分中,有1个不满意和2个满意。D2即指1个不满意和2个满意。故障原因为3的划分中,有2个不满意和2个满意。D3即指2个不满意和2个满意。具体公式如下:

决策树算法学习笔记

注:此处的计算结果即0.165不准确,没有真正去算,结果仅供参考。

因此变量故障原因的信息增益Gain(故障原因)=Info(满意度)- Info故障原因(满意度)=1-0.165=0.835

同样的道理,变量故障类型的信息增益计算方式如下:

决策树算法学习笔记

决策树算法学习笔记
                    =0.205(结果不准,为准确计算)
变量故障类型的信息增益Gain(故障类型)=1-0.205=0.795

故障原因和故障类型两个变量都是离散型变量,按上述方式即可求得信息增益,但修障时长为连续型变量,对于连续型变量该怎样计算信息增益呢?只需将连续型变量由小到大递增排序,取相邻两个值的中点作为分裂点,然后按照离散型变量计算信息增益的方法计算信息增益,取其中最大的信息增益作为最终的分裂点。如求修障时长的信息增益,首先将修障时长递增排序,即10.2、12、14、16、18、20、22、23、24、25,取相邻两个值的中点,如10.2和12,中点即为(10.2+12)/2=11.1,同理可得其他中点,分别为11.1、13、15、17、19、21、22.5、23.5、24.5。对每个中点都离散化成两个子集,如中点11.1,可以离散化为两个<=11.1和>11.1两个子集,然后按照离散型变量的信息增益计算方式计算其信息增益,如中点11.1的信息增益计算过程如下:

决策树算法学习笔记

决策树算法学习笔记
中点11.1的信息增益Gain(修障时长)=1-0.222=0.778

中点13的信息增益计算过程如下:

决策树算法学习笔记
决策树算法学习笔记 
中点11.1的信息增益Gain(修障时长)=1-1=0
同理分别求得各个中点的信息增益,选取其中最大的信息增益作为分裂点,如取中点11.1。然后与故障原因和故障类型的信息增益相比较,取最大的信息增益作为第一个树叉的分支,此例中选取了故障原因作为第一个分叉。按照同样的方式继续构造树的分支。

    总之,信息增益的直观解释为选取按某个自变量划分所需要的期望信息,该期望信息越小,划分的纯度越高。因为对于某个分类问题而言,Info(D)都是固定的,而信息增益Gain(A)=Info(D)-InfoA(D)  影响信息增益的关键因素为:-InfoA(D),即按自变量A进行划分,所需要的期望信息越小,整体的信息增益越大,越能将分类变量区分出来。

2.C4.5算法的增益率:

    由于信息增益选择分裂属性的方式会倾向于选择具有大量值的属性(即自变量),如对于客户ID,每个客户ID对应一个满意度,即按此变量划分每个划分都是纯的(即完全的划分,只有属于一个类别),客户ID的信息增益为最大值1。但这种按该自变量的每个值进行分类的方式是没有任何意义的。为了克服这一弊端,有人提出了采用增益率(GainRate)来选择分裂属性。计算方式如下:

决策树算法学习笔记
决策树算法学习笔记 

其中Gain(A)的计算方式与ID3算法中的信息增益计算方式相同。
以故障原因为例:

决策树算法学习笔记
                         =1.201

  Gain(故障原因)=0.835(前文已求得)

    GainRate故障原因(满意度)=1.201/0.835=1.438

同理可以求得其他自变量的增益率。

选取最大的信息增益率作为分裂属性。

3.CART算法的Gini指标:

         CART算法选择分裂属性的方式是比较有意思的,首先计算不纯度,然后利用不纯度计算Gini指标。以满意度预警模型为例,计算自变量故障原因的Gini指标时,先按照故障原因可能的子集进行划分,即可以将故障原因具体划分为如下的子集:{1,2,3}、{1,2}、{1,3}、{2,3}、{1}、{2}、{3}、{},共计8(2^V)个子集。由于{1,2,3}和{}对于分类来说没有任何意义,因此实际分为2^V-2共计6个有效子集。然后计算这6个有效子集的不纯度和Gini指标,选取最小的Gini指标作为分裂属性。

不纯度的计算方式为:

  决策树算法学习笔记


pi表示按某个变量划分中,目标变量不同类别的概率。

某个自变量的Gini指标的计算方式如下:

   决策树算法学习笔记 
        对应到满意度模型中,A为自变量,即故障原因、故障类型、修障时长。D代表满意度,D1和D2分别为按变量A的子集所划分出的两个不同元组,如按子集{1,2}划分,D1即为故障原因属于{1,2}的满意度评价,共有6条数据,D2即故障原因不属于{1,2}的满意度评价,共有3条数据。计算子集{1,2}的不纯度时,即Gini(D1),在故障原因属于{1,2}的样本数据中,分别有3条不满意和3条满意的数据,因此不纯度为1-(3/6)^2-(3/6)^2=0.5。
        以故障原因为例,计算过程如下:

决策树算法学习笔记

                                                        决策树算法学习笔记 
                                                          =0.5

计算子集故障原因={1,3}的子集的Gini指标时,D1和D2分别为故障原因={1,3}的元组共计7条数据,故障原因不属于{1,3}的元组即故障原因为2的数据,共计3条数据。详细计算过程如下:

决策树算法学习笔记
决策树算法学习笔记 
=0.52
同理可以计算出故障原因的每个子集的Gini指标,按同样的方式还可以计算故障类型和修障时长每个子集的Gini指标,选取其中最小的Gini指标作为树的分支。连续型变量的离散方式与信息增益中的离散方式相同。

树的剪枝:
树剪枝可以分为先剪枝和后剪枝。

先剪枝:通过提前停止树的构造,如通过决定在给定的节点不再分裂或划分训练元组的子集,而对树剪枝,一旦停止,该节点即成为树叶。在构造树时,可以使用诸如统计显著性、信息增益等度量评估分裂的优劣,如果划分一个节点的元组低于预先定义阈值的分裂,则给定子集的进一步划分将停止。但选取一个适当的阈值是困难的,较高的阈值可能导致过分简化的树,而较低的阈值可能使得树的简化太少。

后剪枝:它由完全生长的树剪去子树,通过删除节点的分支,并用树叶替换它而剪掉给定节点的子树,树叶用被替换的子树中最频繁的类标记。

其中c4.5使用悲观剪枝方法,CART则为代价复杂度剪枝算法(后剪枝)。

 

 

进一步研究的方向:

1、不同决策树算法的详细剪枝方式。

2、决策树算法性能为何如此优秀?

 这篇文章就计算方法来说很不错,适合需要拿着就用的同学们。

来源:http://blog.sina.com.cn/s/blog_8095e51d01013chj.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值