先来一段决策树相关的小故事:
最初的决策树算法是心理学家兼计算机科学家E.B.Hunt 1962年在研究人类的概念学习过程时提出的CLS(Concept Learning System),这个算法确立了决策树“分而治之”的学习策略。罗斯·昆兰在Hunt的指导下于1968年在美国华盛顿大学获得计算机博士学位,然后到悉尼大学任教。1978年他在学术假时到斯坦福大学访问,在一门研究生课程上要求写一个程序来学习出完备正确的规则,以判断国际象棋残局中一方是否会在两步棋后被将死。昆兰写了一个类似于CLS的程序。其中最重要的改进是引入了信息增益准则,后来他把这个工作整理出来在1979年发表,这就是ID3算法。1986年昆兰应邀在Machine Learning创刊号上重新发表了ID3算法,掀起了决策树研究的热潮,短短几年间众多决策树算法问世,ID4,ID5等名字迅速被其他研究者提出的算法占用,昆兰只好将自己的ID3后续算法命名为C4.0,在此基础上进一步提出了著名的C4.5(只是对C4.0做了些小改进),将后续的商业化版本称为C5.0。
看完小故事了,那我们开始进入正题,什么是决策树??
决策树是一类常用的机器学习方法,是一种基于树结构来进行决策的分析方法,也是一种直观运用概率分析的图解法。由于其决策分支画成图形很像一棵树的枝干,故称决策树。一般地,每棵决策树都包含一个根结点、若干个内部结点和若干个叶结点,其中根结点(在树中用矩形表示)包含样本全集,叶结点(在树中用椭圆表示)对应于决策结果,其他每个结点(在树中用矩形表示)则对应于一个属性测试。从根结点到每个叶结点的路径对应了一个判定测试序列。决策树遵循的是”分而治之“(divide-and-conquer)策略,目的是为了产生一棵泛化能力强,即处理未见示例能力强的决策树。下面给出一个决策树示意描述,该树描述了一个是否选择网上购物的分类模型,利用它既可以对一个学生的网购行为进行分类预测,还可以分析是否选择网上购物的影响因素。
决策树示意图
决策树生成基本算法:
决策树学习基本算法如下所述:
输入:训练集D={(x1,y1),(x2,y2),……,(xm,ym)};
属性值A={a1,a2,……,ad}
处理流程:Generate_decision_tree(D,A)
1)创建一个结点N;
2)if D中样本全属于同一类别C then
3) 将N标记为C类叶结点;return
4)end if
5)if A为空 OR D中样本在A上取值相同 then
6) 将N标记为叶结点,其类别标记为D中样本类最多的类;return
7)end if
8)从A中选择最优划分属性a_*; (以下_表示下标,^表示上标)
9)for a_* 的每一个值a_*^v do
10) 为N生成一个分支;令D_y表示D中在a_*上取值为a_*^v的样本子集;
11) if D_y 为空 then
12) 将分支结点标记为叶结点,其类别标记为D中样本最多的类;return
13) else
14) 以 Generate_decision_tree(D_y,A\({a_*})为分支结点
15) end if
16) end for
输出:以N为根结点的一棵决策树
常用的决策树算法有以下几个:ID3、ID4.5、ID5.0、CART
1)ID3算法(节点选择:信息增益最大)
信息熵(也叫熵,Entropy):用来度量一个属性的信息量
假设S为训练集(即目标属性?),则该训练集S所包含的的信息熵定义为
信息增益:
其中
eg:weather数据集(14个样本)包含属性{天气,温度,湿度,风},目标——是否打球
晴朗 | 阴天 | 雨天 | |
是 | 2 | 4 | 3 |
否 | 3 | 0 | 2 |
该属性的信息熵为0.94;
信息增益为
缺点:
2)ID4.5算法(节点选择:信息增益率最大)
信息增益率:
eg:
晴朗 | 阴天 | 雨天 | |
是 | 2 | 4 | 3 |
否 | 3 | 0 | 2 |
所以
优点1:解决了ID3对具有很多值属性的敏感性问题
假设我们要构建一个决策树来分类公司的客户,那么其中的一个属性可能是客户的信用卡号,这个属性具有很高的信息增益,因为它唯一标识每个客户。但是,我们并不想在决策树中包含这个属性,这是因为它虽然在训练集上表现地很好,而对于没见过的样本它是不可能表现好的。但是,如果我们用增益率来作为度量的手段,我们可以很好地避免这个问题。也就是说,对于客户的信用卡号这个属性,虽然你的信息增益很大,但是同时你的内在价值也很大,因此你的增益率不会太大。
优点2:解决了ID3不能处理具有连续值属性的问题
假设训练集中每个样本的某个属性为:{65, 70, 70, 70, 75, 78, 80, 80, 80, 85, 90, 90, 95, 96}。现在我们要计算这个属性的信息增益。我们首先要移除重复的值并对剩下的值进行排序:{65, 70, 75, 78, 80, 85, 90, 95, 96}。接着,我们分别求用每个数字拆分的信息增益(比如用65做拆分:用≤65和>65≤65和>65做拆分,其它数字同理),然后找出使信息增益获得最大的拆分值。
缺点1:需要对数据集进行多次的顺序扫描和排序,导致算法的低效
缺点2:C4.5只适用于能够驻留于内存的数据集,大数据集乏力
3)C5.0算法(节点选择:Boosting方式)
优点:
4)CART算法(节点选择:最小的Gini指数,指数越小表示样本的纯净度越高,即该样本只属于同一类的概率越高或最大的差异性损失值)
CART(Classifaction And Regression Tree)算法采用的是一种二分递归分割的技术,将当前样本集分为两个子样本集,使得生成的决策树每个非叶结点都有两个分枝,生成的是结构简洁的二叉树。
特点1:节点采用二分法(有效简化规模,提高效率),因而是是一种二叉树,既可以是分类树,又可以是回归树、模型树
特点2:与C5.0不同在于输出字段既可以是数值型,又可以是分类型
特点3:即使一个属性有多个取值,也是把数据分为两部分
特点4:算法分两步进行,第一,将样本递归划分进行建树过程;第二,利用验证数据进行减枝
CART算法流程:
CART算法——cartformtree(T),其中T表示当前样本集,当前候选属性集用T_attributelist表示
1)创建根节点N;
2) 为N分配类别;
3)if T 都属于同一个类别 or T 中只剩下一个样本则返回N为叶节点,为其分配属性;
4)for each T_attributelist中的属性执行该属性上的一个划分,计算此次划分的Gini系数;
5)N的测试属性test_attribute=T_attributelist中具有最小Gini系数的属性;
6)划分T得T1,T2两子集;
7)调用cartformtree(T1);
8)调用cartformtree(T2);
下面以银行贷款数据集为例,分析CART构建决策树的详细过程:
step 1:首先对数据集非类标号属性{是否有房,婚姻状况,年收入}分别计算它们的差异性损失,取差异性损失最大的属性作为决策树的根节点属性。一开始创建的结点为根节点,假定为r,该根节点的Gini系数为
① 对是否有房属性分析
(是否有房,r)
② 对婚姻状况属性分析
该属性有三个可能的取值{已婚,单身,离异},分别计算划分后的超类{已婚}/{单身或离异}、{单身}/{已婚或离异}、{离异}/{单身或已婚}
=0.12
=0.053
=0.02
根据计算结果,差异性损失最大的分组为{已婚}/{单身或离异},作为划分结果。
③ 对年收入属性分析
由于年收入属性为数值型属性,先对数据进行升序排序,然后从从、小到大依次以相邻值得中间值作为分割将样本分为两组,取差异性损失值最大的分割作为该属性的分组,如下表:
拖欠贷款 | 否 | 否 | 否 | 是 | 是 | 是 | 否 | 否 | 否 | 否 |
年收入 | 60 | 70 | 75 | 85 | 90 | 95 | 100 | 120 | 125 | 220 |
相邻值中点 | 65 | 72.5 | 80 | 87.5 | 92.5 | 97.5 | 110 | 122.5 | 172.5 | no |
差异性损失 | 0.02 | 0.045 | 0.077 | 0.003 | 0.02 | 0.12 | 0.077 | 0.045 | 0.02 |
综合①②③计算结果,差异性损失最大的有2个:年收入和婚姻状况,都是0.12,此时我们按照属性出现的先后顺序选择第一个作为当前节点划分的决策属性,即选择婚姻状况中的{已婚,单身,离异}分组作为根节点的决策属性,得到第一次的划分。
step 2:采用同样的方法,(此时已婚的结果都是”否“,已到叶节点,即接下来只取单身/离异数据做以上类似的考虑)分别计算三个属性对婚姻状况取单身/离异的数据子集进行划分的差异性损失,取最大的那个属性作为当前节点的决策属性。
假设当前节点为t,它的Gini系数为
① 对是否有房属性分析
(是否有房,t)
=0.25
② 对婚姻状况属性分析
同样的分为三组进行差异性损失的分析,结果是:
{已婚}/{单身或离异}为0、{单身}/{已婚或离异}为0.056、{离异}/{单身或已婚}为0.1
③ 对年收入属性分析
拖欠贷款 | 否 | 否 | 是 | 是 | 否 | 否 |
年收入 | 70 | 85 | 90 | 95 | 125 | 220 |
相邻值中点 | 77.5 | 87.5 | 92.5 | 110 | 172.5 | |
差异性损失 | 0.1 | 0.25 | 0.05 | 0.25 | 0.1 |
根基①②③计算结果,差异性损失最大为0.25,选择最早出现的属性——是否有房作为当前节点划分的决策属性,此时得到第二次划分。
step 3:重复步骤2,最后可得CART决策树如下:
PS:下面考虑Gini系数来进行划分
现在来分析各个属性划分后的Gini指数(不考虑剪枝情况下,每次选择指数最小的节点做分叉点)
还有一个连续值属性——年收入,下面采用分裂点进行分裂: