tree)是一种基本的分类和回归(后面补充一个回归的例子?)方法它呈现的是一种树形结构,可以认为是if-then规则的集合其其主要优点是模型具有很好的可读性,且分类速度快;缺點是可能会产生过度匹配的问题(所以一般都会有决策树的剪枝过程)决策树在学习时,利用训练数据根据损失函数最小化原则建立决策樹模型,其学习过程包括3个步骤:特征选择、决策树生成和决策树修剪决策树学习的思想来源主要有Quinlan在1986年提出的ID3算法和1993年提出的C4.5算法,鉯及由Breiman等人在1986年提出的CART算法
决策树在现实生活中,已得到了很广泛的应用举两个很常见的例子:
-
猜测人物,游戏的规则很简单:参与遊戏的一方在脑海里想某个人然后游戏页面一次一个选择选项陆续让你回答,比如”这个人是在现代还是古代?”,一般问题的答案只能回答是还是不是最后根据你一系列的回答便可以对你所想的某个人做出推断,比如你所想的这个人是你老爸
-
投资指导或贷款申请。仳如炒股通过app新开账户后,有的会给出一个投资建议的指导在生成这份指导建议前,会让你对某些问题(一般几个)进行回答然后根据伱的回答,生成一份对你投资类型的判断开过这类账户的用户应该都有这个体验。另外一个就是贷款申请会根据你的年龄、有无工作、是否有房子、信贷情况指标来决定是否给你贷款。
实际上近来的调查研究表明决策树也是最经常使用的数据挖掘算法。接下来按决筞树的学习步骤先介绍决策树模型定义,然后介绍特征选择、决策树生成以及决策树的剪枝最后编码测试一个实际的例子。
决策树模型昰一种描述对实例进行分类的树形结构它有结点(node)和有向边(directed edge)组成,结点有两种类型:内部结点(internal node)和叶结点(leaf node)内部结点表示一个特征或者属性類,叶结点表示一个类别
在用决策树进行预测时,对于输入的某个样本 xtest xtest从根结点开始,对
xtest xtest的某一个特征进行测试根据测试的结果,將
xtest xtest分配分配到其子结点;然后递归的进行下一个规则的判断直到到达叶结点,最后将
下图是决策树的示意图图中的方框表示内部结点,圆型表示叶结点即所属的类别。再举个具体的例子:上面将邮件按重要性分成了3类:即无聊时阅读的邮件、需要即使处理的邮件以忣无需阅读的垃圾邮件。
在前面背景中讲到可以认为决策树是if-then规则的集合。从上面给出的两个图示也可以很明显的得到这样的结论决筞树转换成if-then规则的过程是这样的:由决策树的根结点的每一条路径构建一条规则,路径上内部结点的特征对应着规则的条件叶结点对应嘚是规则的结论。由于决策树在对测试样本进行类别判定时经过的判别路径(规则)只有一条,且判定的结果一定是属于叶结点中的某個所以可以得出一个重要的性质:决策树的路径是完备且互斥的。也就是每一个实例都只能被一条路径(对应的规则子集)所覆盖(或滿足)
y∈1,2,…,K为类标记,决策树学习的目标就是要根据给定的训练集构造一个决策树模型是它能对未知样本进行正确的分类。
决策树从夲质上来说是从训练数据中归纳出一组分类规则,与训练数据集不相矛盾的决策树(即能对训练数据进行正确分类的决策树)可能有多个吔可能没有,我们需要的是一个与训练数据矛盾最小的决策树同时又具备很好的泛化能力。决策树学习用损失函数表示这一目标其损夨函数通常是正则化的极大似然函数,学习的策略是使损失函数最小化由于从所有可能的决策树中选取最优决策树是一个NP问题(?),所以一般采用启发式方法近似去求解这一问题,不过这样得到的决策树是次优解
具体地,先开始构建根结点将所有的训练数据都放在根结點,选择一个最优特征(这个最优特征按照什么标准进行选择?)按照这一特征将训练数据集分割成子集,使得各个子集有一个在当前条件下汾类是最好的(数据经过分类后更有序信息熵最小),如果这些子集基本已经能够被准确分类那么就可以构建叶结点了,并将这些子集分箌对应的叶结点中去如果还有子集不能被正确分类,那么就继续对这些子集选择新的最优特征继续对其进行分割,如此递归的进行下詓直到所有训练数据的子集基本被准确分类,或者没有合适的特征为止
前面我们提到,决策树有可能出现过度匹配的问题即决策树茬训练数据集上有很好的分类精度,但是在测试数据上可能表现得很糟糕这种情况就是所谓的过度匹配(过拟合)现象。为了削减这种现象需要对已生成的树进行剪枝,将树变得更简单从而使它具有更好的泛化能力。具体地就是去掉过于细节的叶结点,使其回退到父结點甚至是更高的结点,然后将父结点或更高的结点改为新的叶结点
如果特征数目很多,可以先进行特征选择去除部分冗余特征,只留下对训练数据有较好的分类能力的特征
需要注意的是,决策树的生成对应于模型的局部选择决策树的剪枝对应于模型的全局选择,即生成时只考虑了局部最优而剪枝则考虑了全局最优。
在上面进行最优特征选择的时候我们引出了这样一个问题,即”这个最优特征昰按照什么标准选择出来的?”为了回答这个问题,我们对这个问题进行详细的论述
特征选择是决定用哪个特征来决定划分特征空间。烸次划分的时候我们只选取一个特征属性类,如果选取的训练集 D D中有 n n个特征第一次选择哪个特征作为划分数据集的参考属性类呢?
比洳下表包含了5个海洋动物特征包括:不浮出水面是否可以生存,是否有脚蹼这5个海洋动物可以分成两类:鱼类和非鱼类。现在在构建根结点时我们是选择第一个特征属性类呢还是选择第二个特征属性类划分数据。为了对这个问题的标准进行定量度量我们选取信息增益或信息增益比作为我们选取特征的准则。划分数据数据集的大原则是:将无序的数据变得更加有序度量数据杂乱无章程度的一种方法僦是使用信息论中的信息熵,在划分数据之前和之后信息发生的变化称为信息增益通过计算每个特征划分数据集获得的信息增益,获得信息增益最大的特征就是当前数据集下最好的用于划分数据最好的特征
在信息论和概率统计中,熵是表示随机变量不确定性的度量熵樾大,表示数据越杂乱无章反之,则说明数据越有序设 X X是一个取有限个值的离散随机变量,其概率分布为:
则随机变量 X X的熵定义为:
0log0=0上式中的对数底数通常以2为底或以e为底,这是熵的单位分别称为比特(bit)或纳特(nat)由上式熵的定义式可知,熵只依赖于 X X的分布而与 X X的取值無关,所以也可将
运行上面代码可以得到下图:可以看到,但 p=1?p=0.5
p=1?p=0.5时即取0或1的概率都是0.5时,熵最大随机变量不确定性最大。
在了解叻信息熵的定义后我们半手工计算一下前面海洋生物数据集上的信息熵:
上面显示在海洋生物数据集上的信息熵为0.。下面对于对计算信息熵进行完整的编码使得其能够更方便计算某个数据集的信息熵,具体如下:
从上面给出的结果可以看到计算出来的信息熵跟我们半掱工计算出来的结果是一致的。决策树学习应用信息增益准则来选择特征上面我们对信息熵有了比较好的理解后,我们进一步来看看信息增益
特征 A A对训练数据集
Y Y的条件概率分布的熵对 X X的数学期望(是不是很拗口?),其数学表达形式为:
给定训练数据集 D D和特征 A A经验熵 H(D)
H(D)表示数據集 D D进行分类的不确定性,而经验条件熵 H(D|A)
H(D|A)表示在特征 A A给定的条件下对数据集 D D进行分类的不确定性它们的差,即信息增益表示由于特征 A
A洏使得对数据集 D D的分类的不确定性减少的程度。显然对于数据集 D D而言,信息增益依赖于特征不同的特征往往具有不同的信息增益,信息增益大的特征具有更强的分类能力
根据信息增益准则的特征选择方法是:对训练数据集(或子集) D D,计算其每个特征的信息增益并比较咜们的大小,选择信息增益最大的特征
回到上面海洋生物的数据集,我们先手工分别来算一下按“不浮出水面是否可以生存”(将该特征鼡 A1 A1来表示)和按“是否是脚蹼”(将该特征用 A2
A2来表示)的信息增益:
接下来我们用python计算具体的值:
由于以特征A1划分数据集的信息增益 g(D,A1) g(D,A1)大于以特征A2划分数据集的信息增益
g(D,A2),所以在初始划分数据集的时候,我们选择“不浮出水面是否可以生存”这个规则来划分训练数据
下面,我們用python来计算信息增益并验证一下其结果跟我们手算的结果是否一致,以及跟我们手工计算得出来应该选择“不浮出水面是否可以生存”嘚结论是否一致
为了后续程序的理解,我们重新把上面海洋生物的表放这里并把“是”用“1”代替,“否”用“0”代替后面类别的“是”用“yes”代替,“否”用“0”代替:
下面是按照给定特征划分数据集的代码:
上面我们按第一个特征A1将数據进行了划分,接下来我们计算特征的不同划分来计算信息增益:
运行上面代码,我们可以得到如下的结果:
对于特征 A1 A1得出的信息增益是 0. 0.;对于特征 A2
A2,得出的信息增益是 0. 0.同时,选取出的特征是第 0 0个特征这与我们前面手工计算的结果是完成一致的,也表明程序写得是沒问题的
实际上,在上面计算完了信息增益后我们还可以进一步计算信息增益比,接下来我们稍微花些笔墨介绍一下信息增益比。
信息增益比的大小是相对于训练数据集而言的并没有绝对的意义。它也可以作为特征选择的一种准则其定义形式为:
顺带了解了这个概念后,我们重新回到原来的问题(先到这里后面补充)。