今天学习了决策树算法中的ID3、c4.5、CART算法,记录如下:
客户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指标时会有些区别。详细描述如下:
如以自变量故障原因举例,故障原因的信息增益=原信息需求(即仅仅基于满意度类别比例的信息需求,记为a)-按照故障原因划分所需要的信息需求(记为a1)。
其中D为目标变量,此例中为满意度。m=2,即满意和不满意两种情况。Pi为满意度中属于分别属于满意和不满意的概率。此例中共计10条数据,满意5条,不满意5条。概率都为1/2。Info(满意度)即为仅仅基于满意和满意的类别比例进行划分所需要的信息需求,计算方式为:
其中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
同样的道理,变量故障类型的信息增益计算方式如下:
变量故障类型的信息增益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。然后与故障原因和故障类型的信息增益相比较,取最大的信息增益作为第一个树叉的分支,此例中选取了故障原因作为第一个分叉。按照同样的方式继续构造树的分支。
2.C4.5算法的增益率:
其中Gain(A)的计算方式与ID3算法中的信息增益计算方式相同。
以故障原因为例:
同理可以求得其他自变量的增益率。
选取最大的信息增益率作为分裂属性。
3.CART算法的Gini指标:
不纯度的计算方式为:
pi表示按某个变量划分中,目标变量不同类别的概率。
某个自变量的Gini指标的计算方式如下:
计算子集故障原因={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