一、简介1.概述决策树算法是一种逼近离散函数值的方法。它是一种典型的分类方法,首先对数据进行处理,利用归纳算法生成可读的规则和决策树,然后使用决策对新数据进行分析。本质上决策树是通过一系列规则对数据进行分类的过程。决策树方法最早产生于上世纪60年代,到70年代末。由J Ross Quinlan提出了ID3算法,此算法的目的在于减少树的深度。但是忽略了叶子数目的研究。算法在ID3算法的基础上进行了改进,对于预测变量的缺值处理、剪枝技术、派生规则等方面作了较大改进,既适合于分类问题,又适合于回归问题。决策树算法构造决策树来发现数据中蕴涵的分类规则.如何构造精度高、规模小的决策树是决策树算法的核心内容。决策树构造可以分两步进行。第一步,决策树的生成:由训练样本集生成决策树的过程。一般情况下,训练样本数据集是根据实际需要有历史的、有一定综合程度的,用于数据分析处理的数据集。第二步,决策树的剪枝:决策树的剪枝是对上一阶段生成的决策树进行检验、校正和修下的过程,主要是用新的样本数据集(称为测试数据集)中的数据校验决策树生成过程中产生的初步规则,将那些影响预衡准确性的分枝剪除。2.决策树学习目标:根据给定的训练数据集构建一个决策树模型,使它能够对实例进行正确的分类。决策树学习本质上是从训练数据集中归纳出一组分类规则。能对训练数据进行正确分类的决策树可能有多个,可能没有。在选择决策树时,应选择一个与训练数据矛盾较小的决策树,同时具有很好的泛化能力;而且选择的条件概率模型应该不仅对训练数据有很好的拟合,而且对未知数据有很好的预测。损失函数:通常是正则化的极大似然函数策略:是以损失函数为目标函数的最小化因为从所有可能的决策树中选取最优决策树是NP完全问题,所以现实中决策树学习通常采用启发式方法,近似求解这一最优化问题,得到的决策树是次最优(sub-optimal)的。决策树学习的算法通常是一个递归地选择最优特征,并根据该特征对训练数据进行分割,使得对各个子数据集有一个最好的分类的过程。包含特征选择、决策树的生成和决策树的剪枝过程。剪枝:目的:将树变得更简单,从而使它具有更好的泛化能力。步骤:去掉过于细分的叶结点,使其回退到父结点,甚至更高的结点,然后将父结点或更高的结点改为新的叶结点。决策树的生成对应模型的局部选择,决策树的剪枝对应于模型的全局选择。决策树的生成只考虑局部最优,决策树的剪枝则考虑全局最优。特征选择:如果特征数量很多,在决策树学习开始时对特征进行选择,只留下对训练数据有足够分类能力的特征。(例如把名字不作为一个特征进行选择)3.典型算法决策树的典型算法有ID3,,CART等。国际权威的学术组织,数据挖掘国际会议ICDM (the IEEE International Conference on Data Mining)在2006年12月评选出了数据挖掘领域的十大经典算法中,算法排名第一。算法是机器学习算法中的一种分类决策树算法,其核心算法是ID3算法。算法产生的分类规则易于理解,准确率较高。不过在构造树的过程中,需要对数据集进行多次的顺序扫描和排序,在实际应用中因而会导致算法的低效。决策树算法的优点如下:(1)分类精度高;(2)生成的模式简单;(3)对噪声数据有很好的健壮性。因而是目前应用最为广泛的归纳推理算法之一,在数据挖掘中受到研究者的广泛关注。4.基本思想1)树以代表训练样本的单个结点开始。2)如果样本都在同一个类.则该结点成为树叶,并用该类标记。3)否则,算法选择最有分类能力的属性作为决策树的当前结点.4)根据当前决策结点属性取值的不同,将训练样本数据集tlI分为若干子集,每个取值形成一个分枝,有几个取值形成几个分枝。匀针对上一步得到的一个子集,重复进行先前步骤,递4'I形成每个划分样本上的决策树。一旦一个属性出现在一个结点上,就不必在该结点的任何后代考虑它。5)递归划分步骤仅当下列条件之一成立时停止:①给定结点的所有样本属于同一类。②没有剩余属性可以用来进一步划分样本.在这种情况下.使用多数表决,将给定的结点转换成树叶,并以样本中元组个数最多的类别作为类别标记,同时也可以存放该结点样本的类别分布,③如果某一分枝tc,没有满足该分支中已有分类的样本,则以样本的多数类创建一个树叶。 [3]5.构造方法决策树构造的输入是一组带有类别标记的例子,构造的结果是一棵二叉树或多叉树。二叉树的内部节点(非叶子节点)一般表示为一个逻辑判断,如形式为a=aj的逻辑判断,其中a是属性,aj是该属性的所有取值:树的边是逻辑判断的分支结果。多叉树(ID3)的内部结点是属性,边是该属性的所有取值,有几个属性值就有几条边。树的叶子节点都是类别标记。 [3]由于数据表示不当、有噪声或者由于决策树生成时产生重复的子树等原因,都会造成产生的决策树过大。因此,简化决策树是一个不可缺少的环节。寻找一棵最优决策树,主要应解决以下3个最优化问题:①生成最少数目的叶子节点;②生成的每个叶子节点的深度最小;③生成的决策树叶子节点最少且每个叶子节点的深度最小。6.基本算法二、ID3决策树ID3算法是决策树的一种,它是基于奥卡姆剃刀原理的,即用尽量用较少的东西做更多的事。ID3算法,即Iterative Dichotomiser 3,迭代二叉树3代,是Ross Quinlan发明的一种决策树算法,这个算法的基础就是上面提到的奥卡姆剃刀原理,越是小型的决策树越优于大的决策树,尽管如此,也不总是生成最小的树型结构,而是一个启发式算法。在信息论中,期望信息越小,那么信息增益就越大,从而纯度就越高。ID3算法的核心思想就是以信息增益来度量属性的选择,选择分裂后信息增益最大的属性进行分裂。该算法采用自顶向下的贪婪搜搜索历可能的决策空间。1、信息熵熵(entropy)表示随机变量不确定性的度量,也就是熵越大,变量的不确定性就越大。设X是一个有限值的离散随机变量,其概率分布为: 则随机变量X的熵定义为:2、条件熵条件熵H(Y|X)表示在已知随机变量X条件下随机变量Y的不确定性。随机变量X给定的条件下随机变量Y的条件熵为:3、信息增益特征A对训练数据集D的信息增益g(D,A),定义为集合D的经验熵H(D)与特征A给定条件下D的经验条件熵H(D|A)之差,即:信息增益大的特征具有更强的分类能力4、总结给定训练数据集D和特征A:经验熵H(D)表示对数据集D进行分类的不确定性经验条件熵H(D|A)表示在特征A给定的条件下对数据集D进行分类的不确定性 表示由于特征A而使得对数据 D的分类的不确定性减少的程度。5、决策树进行分类的步骤利用样本数据集构造一颗决策树,并通过构造的决策树建立相应的分类模型。这个过程实际上是从一个数据中获取知识,进行规制提炼的过程。利用已经建立完成的决策树模型对数据集进行分类。即对未知的数据集元组从根节点依次进行决策树的游历,通过一定的路径游历至某叶子节点,从而找到该数据元组所在的类或类的分布。三、ID3决策树示例在编写代码之前,我们先对数据集进行属性标注。年龄:0代表青年,1代表中年,2代表老年;有工作:0代表否,1代表是;有自己的房子:0代表否,1代表是;信贷情况:0代表一般,1代表好,2代表非常好;类别(是否给贷款):no代表否,yes代表是。1、数据集dataSet2、计算经验熵(香农熵)$$ $$$$ $$from math import log def calcShannonEnt(dataSet): # 统计数据数量 numEntries = len(dataSet) # 存储每个label出现次数 label_counts = {} # 统计label出现次数 for featVec in dataSet: current_label = featVec[-1] if current_label not in label_counts: # 提取label信息 label_counts[current_label] = 0 # 如果label未在dict中则加入 label_counts[current_label] += 1 # label计数shannon_ent = 0 # 经验熵# 计算经验熵for key in label_counts: prob = float(label_counts[key]) / numEntries shannon_ent -= prob * log(prob, 2)return shannon_ent# 运行结果# 、计算信息增益$$ $$def 4、树的生成import 5、树的深度和广度计算def 6、未知数据的预测def 7、树的存储与读取(以二进制形式存储)import 8、完整代码from 四、决策树决策树实在ID3决策树的基础上进行了优化。将节点的划分标准替换为了信息增益率,能够处理连续值,并且可以处理缺失值,以及能够进行剪枝操作。信息增益信息增益率使用“分裂信息”值将信息增益规范化。分类信息类似于Info(D),定义如下: $$ $$这个值表示通过将训练数据集D划分成对应于属性A测试的v个输出的v个划分产生的信息。信息增益率定义: $$ $$此处的Gain(A)即是前文介绍ID3时的g(D,A)选择具有最大增益率的属性作为分裂属性。当属性有很多值时,虽然信息增益变大了,但是相应的属性熵也会变大。所以最终计算的信息增益率并不是很大。在一定程度上可以避免ID3倾向于选择取值较多的属性作为节点的问题。具体树的构造方法与前文的ID3相同,这里不再赘述五、CART决策树CART 树(分类回归树)分为分类树和回归树。顾名思义,分类树用于处理分类问题;回归树用来处理回归问题。我们知道分类和回归是机器学习领域两个重要的方向。分类问题输出特征向量对应的分类结果,回归问题输出特征向量对应的预测值。分类树和 ID3、 决策树相似,都用来处理分类问题。不同之处是划分方法。分类树利用基尼指数进行二分。如图所示就是一个分类树。回归树用来处理回归问题。回归将已知数据进行拟合,对于目标变量未知的数据可以预测目标变量的值。如图 所示就是一个回归树,其中 s 是切分点,x 是特征,y 是目标变量。可以看出图 2 利用切分点 s 将特征空间进行划分,y 是在划分单元上的输出值。回归树的关键是如何选择切分点、如何利用切分点划分数据集、如何预测 y 的取值。基尼指数数据集D的纯度可以用基尼值来度量: $$ $$直观来说,Gini(D)反映了从数据集D中随机选取两个样本,其类别标记不一致的概率,因此Gini(D)越小,则数据集D的纯度越高。属性a的基尼指数定义为 $$$$ 于是,我们在候选属性集合A中,选择那个使得划分后基尼指数最小的属性作为最优划分属性,即$$ $$六、连续值与缺失值的处理1.连续值处理由于连续属性的可取值数目不再有限,因此,不能直接根据连续属性的可取值来对结点进行划分.此时,连续属性离散化技术可派上用场.最简单的策略是采用二分法(bi-partition)对连续属性进行处理,这正是决策树算法中采用的机制[Quinlan, 1993].后续在cart回归树案例中会有具体代码的展示2.缺失值处理由于我没有准备这方面的代码,就在这里分享一个写的极为详细的博客决策树(decision tree)(四)--缺失值处理感兴趣的也可以自己去看瓜树上的讲解七、CART分类树示例1.数据集依旧为上一次用到的Titanic数据集,在此不做过多介绍分析了。与上次的区别在于为了形成一个二叉树,所有特征离散化后在子叶点分类时只分为了1和非1两类2.引入要用到的包import 3.读入数据集def 4.计算Gini指数按照公式计算基尼指数def 5.取得节点划分的属性def 6.树节点这里不使用字典建立二叉树(前面ID3用过了),这里自己构建链表式的树class 7.树的生成其中涉及到了预剪枝,后文会再说这个问题def 8.树的遍历def 9.预测def 10.计算准确率result 11.完整代码import 八、CART回归树1.原理分析CART回归树预测回归连续型数据,假设X与Y分别是输入和输出变量,并且Y是连续变量。在训练数据集所在的输入空间中,递归的将每个区域划分为两个子区域并决定每个子区域上的输出值,构建二叉决策树。选择最优切分变量j与切分点s:遍历变量j,对规定的切分变量j扫描切分点s,选择使下式得到最小值时的(j,s)对。其中Rm是被划分的输入空间,cm是空间Rm对应的固定输出值。用选定的(j,s)对,划分区域并决定相应的输出值继续对两个子区域调用上述步骤,将输入空间划分为M个区域R1,R2,…,Rm,生成决策树。当输入空间划分确定时,可以用平方误差来表示回归树对于训练数据的预测方法,用平方误差最小的准则求解每个单元上的最优输出值。2.数据集此次使用forestfires的数据集,共有12列特征# 1. Montesinho公园地图内的X-x轴空间坐标:1到9# 2. Montesinho公园地图内的 Y-y轴空间坐标:2到9# 3.每年的月份-月:“ jan”到“ dec'# 4.每天-星期几:从“周一”到“星期日”# - FWI系统中的FFMC指数:至 6. DMC-FWI系统中的DMC指数:至 7. DC- FWI系统的DC指数:至 8. ISI-FWI系统的ISI指数:至 9. temp- 摄氏温度:至 10. RH-相对湿度(%):至100# 11。风-以km / h为单位的风速:至 12.雨量-外部雨量,单位为mm / m2:到 13.面积-森林的燃烧面积(以ha为单位):到 (此输出变量非常偏向,因此使用对数变换)3. 引入要用的包import 4.数据集的读取和处理day为无关属性应该取出,area根据说明应该使用对数变换,month应该将字符转化为数字def 与特征值分离def 6.误差计算def 7.划分节点的数据与特征的获取def 8.树结点class 9.叶子节点回归值的计算def 10.生成树def 11.树的遍历def 12.预测def 13.“链表”式树转化为字典树def 14.树的可视化def 15.完整代码import 九、剪枝由于我自己写的后剪枝操作代码对于树没有任何修剪,这里就仅提供周志华《机器学习》中介绍的剪枝方法,不附带相关代码了。