一、决策树模型概述
1.决策树模型(Decision Tree Model)
- 出发点:模拟人决策思想的过程,决策树基于树结构进行预测。
- 是一种树形结构,每个内部节点表示一个属性上的判断
- 每个分支对应该判断的一种可能结果(即该属性的某个取值)
- 每个叶节点代表一种分类结果,本质是一颗由多个判断节点组成的树。
学习过程:通过对训练样本的分析(通过信息熵等)来划分树的结构,确定树节点对应的属性;
预测过程:将测试数据从根节点开始,沿着训练出的树结构进行判断,直到叶节点;
2.决策树简史
- 第一个决策树算法:CLS(Concept Learning System) [by Hunt Earl B. Janet Marin Philip J. Stone’s book ‘“Experiments in Induction” published by Academic Press in 1996 ]
- 使得决策树受到关注成为主流的算法:ID3 [ J.R.Quinlan’s paper in a book “Expert System in the Micro Electronic Age” edited by D.Michie,publiced by Edinburgh University Press in 1979]
- 最常用的决策树算法:C4.5 [J.R.Quinlan’s book “C4.5 Programs for Machine Learing” published by Morgan Kaufmann in 1993]
- 可用于回归任务的决策树:CART(Classification and Regression Tree)[L.Breiman,J.H.Freidman,R.A.Olshen,and C.J.Stone’s book “Classification and Regression Trees” published by Wadsworth in 1984]
- 基于决策树的最强算法:RF(Random Forest)[L.Breiman’s MLJ’ 01 paper “Random Forest”]
二、决策树基本流程
1.基本流程:
划分条件:自根节点开始,通过选择出最佳属性进行划分树结构,并递归划分;
停止条件:当前节点都是同一种类型;当前节点后为空,或者所有属性都可以,无法划分;
2.最佳属性选择方法
通过信息熵的计算方法:
信息熵(Entropy):原理是—-系统越有序,熵值越低;系统越混乱或者分散,熵值越高 ;
假如事件A的分类划分是(A1,A2,…,An),每部分发生的概率是(p1,p2,…,pn),那信息熵定义为公式如下:
Ent(A)=−∑k=1npklog2pk E n t ( A ) = − ∑ k = 1 n p k l o g 2 p k
例子:
如果有32个球队,准确的信息量应该是: H = -(p1 * logp1 + p2 * logp2 + … + p32 * logp32),其中 p1, …, p32 分 别是这 32 支球队夺冠的概率。当每支球队夺冠概率相等都是 1/32 的时:H = -(32 * 1/32 *log1/32) = 5 每个事件概率相同时,熵最大,这件事越不确定。
1).信息增益(ID3)
信息增益:以某特征划分数据集前后的熵的差值。熵可以表示样本集合的不确定性,熵越大,样本的不确定性就越大。因此可以使用划分前后集合熵的差值来衡量使用当前特征对于样本集合D划分效果的好坏。
信息增益 = entroy(前) - entroy(后)
信息增益公式如下:
D D :为样本集 ;
Ent(D) E n t ( D ) :整体熵 ;
a a :离散型属性 ;v v :是 a a 属性里可能的取值节点 ;对离散属性a a 的取值 {a1,a2...,av} { a 1 , a 2 . . . , a v }
Dv D v :表示 D D 样本中在属性a a 上取值 =av = a v 的样本集合
Gain(D,a)=Ent(D)−∑v=1vDvDEnt(Dv) G a i n ( D , a ) = E n t ( D ) − ∑ v = 1 v D v D E n t ( D v )
信息增益缺点:对属性中可取值较多的属性有所偏好;例如:若使用这个方法对编号进行计算,那么编号的信息增益是最高;容易引起过拟合,在西瓜书中对西瓜的编号信息增益进行计算编号的信息增益为0.998;
2).信息增益率(C4.5)
增益比率度量是用前面的增益度量 Gain(D,a) G a i n ( D , a ) 和所分离信息度量 IV(D,a) I V ( D , a ) (SplitInformation) 的比值来共同定义的,可以减少对可取值数目较多的属性有更大的信息熵这一问题。 a a 属性取值越多 IV(D,a) I V ( D , a ) 会越大;
信息增益率是一种启发式的:先通过信息增益找出属性中哪些是高于平均属性的,再从中选出增益率高的
信息增益率公式如下:
D D :为样本集 ;Gain(D,a) G a i n ( D , a ) :增益度量; a a :离散型属性 ;v v : 是 a a 属性里可能的取值节点 ;Dv D v :第 v v 个分支节点包含了D中所有在属性a上取值为av a v 的样本,其中 IV(D,a) I V ( D , a ) 表示:SplitInformation
Gain_Ratio(D,a)=Gain(D,a)IV(D,a)−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−其中IV(D,a)=−∑v=iV|Dv||D|log2DvD G a i n _ R a t i o ( D , a ) = G a i n ( D , a ) I V ( D , a ) − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − 其 中 I V ( D , a ) = − ∑ v = i V | D v | | D | l o g 2 D v D
例子(游戏活跃度情况表):
编号 |
性别(gender) |
活跃度(act_info) |
流失情况(is_lost) |
1 |
男 |
高 |
0 |
2 |
女 |
中 |
0 |
3 |
男 |
低 |
1 |
4 |
女 |
高 |
0 |
5 |
男 |
高 |
0 |
6 |
男 |
中 |
0 |
7 |
男 |
中 |
1 |
8 |
女 |
中 |
0 |
9 |
女 |
低 |
1 |
10 |
女 |
中 |
0 |
11 |
女 |
高 |
0 |
12 |
男 |
低 |
1 |
13 |
女 |
低 |
1 |
14 |
男 |
高 |
0 |
15 |
男 |
高 |
0 |
对上面进行划分:
其中Positive为正样本( 已流失) , Negative为负样本 ( 未流失) , 下面的数值为不同划分下对应的人数。可得到三个熵:
整体熵:
Ent(D)=−515log2(515)−1015log2(1015)=0.9182 E n t ( D ) = − 5 15 l o g 2 ( 5 15 ) − 10 15 l o g 2 ( 10 15 ) = 0.9182
性别熵:
Ent(g1)=−38log2(38)−58log2(58)=0.9543Ent(g2)=−27log2(27)−57log2(57)=0.8631 E n t ( g 1 ) = − 3 8 l o g 2 ( 3 8 ) − 5 8 l o g 2 ( 5 8 ) = 0.9543 E n t ( g 2 ) = − 2 7 l o g 2 ( 2 7 ) − 5 7 l o g 2 ( 5 7 ) = 0.8631
性别信息增益:
IGain(D,g)=E(D)−815E(g1)−715E(g2)=0.0064 I G a i n ( D , g ) = E ( D ) − 8 15 E ( g 1 ) − 7 15 E ( g 2 ) = 0.0064
同理对活跃度求信息熵:
E(a1) = 0
E(a2) = 0.7219
E(a3) = 0
活跃度信息增益:
IGain(D,a)=E(D)−615E(a1)−515E(a2)−415E(a3)=0.6776 I G a i n ( D , a ) = E ( D ) − 6 15 E ( a 1 ) − 5 15 E ( a 2 ) − 4 15 E ( a 3 ) = 0.6776
活跃度的信息增益比性别的信息增益大,也就是说,活跃度对用户流失的影响比性别大。
在做特征选择或者数据分析的时候, 我们应该重点考察活跃度这个指标。
信息增益率计算:
活跃度属性
属性活跃度(act_info)有3个取值,其中高有6个样本、中有5个样本、低有4个样本,则
IV(act_info)=−[615∗log2(615)]+515∗log2(515)]+415∗log2(415)]=1.565Gain_Ratio(D,a)=Gain(D,a)IV(D,a)=0.67761.565=0.432 I V ( a c t _ i n f o ) = − [ 6 15 ∗ l o g 2 ( 6 15 ) ] + 5 15 ∗ l o g 2 ( 5 15 ) ] + 4 15 ∗ l o g 2 ( 4 15 ) ] = 1.565 G a i n _ R a t i o ( D , a ) = G a i n ( D , a ) I V ( D , a ) = 0.6776 1.565 = 0.432
3)基尼值和基尼指数(CART)
基尼值 Gini(D) G i n i ( D ) :从数据集D中随机抽取两个样本,起类别标记不一致的概率,故, Gini(D) G i n i ( D ) 值越小,数据集 D D 的纯度越高。
基尼系数公式如下:
Gini(D)=∑k=1|y|∑k‘≠kpkpk‘=∑k=1|y|pk(1−pk)=1−∑k=1|y|p2k G i n i ( D ) = ∑ k = 1 | y | ∑ k ‘ ≠ k p k p k ‘ = ∑ k = 1 | y | p k ( 1 − p k ) = 1 − ∑ k = 1 | y | p k 2
基尼增益:
Gini(D,a)=Gini(D)−∑v=1v|Dv||D|Gini(Dv) G i n i ( D , a ) = G i n i ( D ) − ∑ v = 1 v | D v | | D | G i n i ( D v )
计算方法:使用上面的游戏活跃度情况表进行Gini之的计算:
是否流失(总的Gini数):
Gini(D)=1−(515)2−(1015)2=0.444 G i n i ( D ) = 1 − ( 5 15 ) 2 − ( 10 15 ) 2 = 0.444
性别Gini系数:
男性:Gini(g1)=1−(515)2−(1015)2=0.468女性:Gini(g2)=1−(38)2−(58)2=0.408Gini(D,g)=Gini(D)−815Gini(g1)−715Gini(g2)=0.004 男 性 : G i n i ( g 1 ) = 1 − ( 5 15 ) 2 − ( 10 15 ) 2 = 0.468 女 性 : G i n i ( g 2 ) = 1 − ( 3 8 ) 2 − ( 5 8 ) 2 = 0.408 G i n i ( D , g ) = G i n i ( D ) − 8 15 G i n i ( g 1 ) − 7 15 G i n i ( g 2 ) = 0.004
活跃度Gini系数:
1.{高|中,低}(注意:这里划分是高和非高两类)
类型 |
留存 |
流失 |
汇总 |
整体 |
5 |
10 |
15 |
男性 |
3 |
5 |
8 |
女性 |
2 |
5 |
7 |
高 |
0 |
6 |
6 |
中,低 |
5 |
4 |
9 |
高:Gini(a1)=1−(06)2−(66)2=0{中,低}:Gini(a2)=1−(59)2−(49)2=0.493Gini(D,g)=Gini(D)−615Gini(a1)−915Gini(a2)=0.444−0.296=0.148 高 : G i n i ( a 1 ) = 1 − ( 0 6 ) 2 − ( 6 6 ) 2 = 0 { 中 , 低 } : G i n i ( a 2 ) = 1 − ( 5 9 ) 2 − ( 4 9 ) 2 = 0.493 G i n i ( D , g ) = G i n i ( D ) − 6 15 G i n i ( a 1 ) − 9 15 G i n i ( a 2 ) = 0.444 − 0.296 = 0.148
2.{高,中|低}
类型 |
留存 |
流失 |
汇总 |
整体 |
5 |
10 |
15 |
男性 |
3 |
5 |
8 |
女性 |
2 |
5 |
7 |
高,中 |
1 |
10 |
11 |
低 |
4 |
0 |
4 |
{高,中}:Gini(a1)=1−(111)2−(1011)2=0.165{低}:Gini(a2)=1−(44)2−(04)2=0Gini(D,g)=Gini(D)−1115Gini(a1)−415Gini(a2)=0.444−0.121=0.323 { 高 , 中 } : G i n i ( a 1 ) = 1 − ( 1 11 ) 2 − ( 10 11 ) 2 = 0.165 { 低 } : G i n i ( a 2 ) = 1 − ( 4 4 ) 2 − ( 0 4 ) 2 = 0 G i n i ( D , g ) = G i n i ( D ) − 11 15 G i n i ( a 1 ) − 4 15 G i n i ( a 2 ) = 0.444 − 0.121 = 0.323
2.{高,低|中}
类型 |
留存 |
流失 |
汇总 |
整体 |
5 |
10 |
15 |
男性 |
3 |
5 |
8 |
女性 |
2 |
5 |
7 |
高,低 |
4 |
6 |
10 |
中 |
1 |
4 |
5 |
{高,低}:Gini(a1)=1−(410)2−(610)2=0.480{中}:Gini(a2)=1−(15)2−(45)2=0.320Gini(D,g)=Gini(D)−1015Gini(a1)−515Gini(a2)=0.444−0.427=0.017 { 高 , 低 } : G i n i ( a 1 ) = 1 − ( 4 10 ) 2 − ( 6 10 ) 2 = 0.480 { 中 } : G i n i ( a 2 ) = 1 − ( 1 5 ) 2 − ( 4 5 ) 2 = 0.320 G i n i ( D , g ) = G i n i ( D ) − 10 15 G i n i ( a 1 ) − 5 15 G i n i ( a 2 ) = 0.444 − 0.427 = 0.017
对比计算结果,根据活跃度状况属性来划分根节点时取Gini系数增益最大的分组作为划分结果即
{{高,中} | 低}
三、决策树代码实现:
代码访问路径
信息熵,信息增益率,Gini系数之间的联系:
四、常见决策树类型及剪枝
1.为什么要剪枝
决策树的剪枝理论
随着树的增长,在训练样集上的精度是单调上升的,然而在独立的测试样例上测出的精度先上升后下降。
原因1: 噪声、 样本冲突, 即错误的样本数据。
原因2: 特征即属性不能完全作为分类标准。
原因3: 巧合的规律性, 数据量不够大。
2.常用的剪枝方法
1.1 预剪枝:
(1)每一个结点所包含的最小样本数目,例如10,则该结点总样本数小于10时,则不再分;
(2)指定树的高度或者深度,例如树的最大深度为4;
(3)指定结点的熵小于某个值,不再划分。随着树的增长, 在训练样集上的精度是调上升的, 然而在独立的测试样例上测出的精度先上升后下降。
1.2 后剪枝:
后剪枝,在已生成过拟合决策树上进行剪枝,可以得到简化版的剪枝决策树。
主要有四种:
(1)REP-错误率降低剪枝
(2)PEP-悲观剪枝
(3)CCP-代价复杂度剪枝
(4)MEP-最小错误剪枝
小结:
一,决策树构建的基本步骤如下:
- 开始讲所有记录看作一个节点
- 遍历每个变量的每一种分割方式,找到最好的分割点
- 分割成两个节点N1和N2
- 对N1和N2分别继续执行2-3步,直到每个节点足够“纯”为止。
二,决策树的变量可以有两种:
1) 数字型(Numeric):变量类型是整数或浮点数,如“年收入”。用“>=”, “>”,“<”或“<=”作为分割条件(排序后,利用已有的分割情况,可以优化分割算法的时间复杂度)。
2) 名称型(Nominal):类似编程语言中的枚举类型,变量只能重有限的选项中选取,比如前面例子中的“活跃度状况”,用“高”,“中”或“低”,使用“=”来分割。
三,如何评估分割点的好坏?
如果一个分割点可以将当前的所有节点分为两类,使得每一类都很“纯”,也就是同一类的记录较多,那么就是一个好分割点。
比如“拥有房产”,可以将记录分成了两类,“是”的节点全部都可以偿还债务,非常 “纯”;“否”的节点,可以偿还贷款和无法偿还贷款的人都有,不是很“纯”,但是两个节点加起来的纯度之和与原始节点的纯度之差最大,所以按照这种方法分割。构建决策树采用贪心算法,只考虑当前纯度差最大的情况作为分割点。
决策树的一些其他算法:
C5.0
基于决策树C5.0的商业银行客户细分研究
决策树之ID3、C4.5、C5.0等五大算法及python实现
QUEST
决策树模型 —-QUEST