集成学习(一) 决策树

原文链接: https://www.cnblogs.com/pinard/p/6053344.html

一、什么是决策树

  • 决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构建决策树来 进行分析的一种方式,是一种直观应用概率分析的一种图解法;决策树是一种预 测模型,代表的是对象属性与对象值之间的映射关系;决策树是一种树形结构, 其中每个内部节点表示一个属性的测试,每个分支表示一个测试输出,每个叶节 点代表一种类别;决策树是一种非常常用的有监督的分类算法。
  • 决策树的决策过程就是从根节点开始,测试待分类项中对应的特征属性,并按照 其值选择输出分支,直到叶子节点,将叶子节点的存放的类别作为决策结果。
  • 决策树分为两大类:分类树和回归树,前者用于分类标签值,后者用于预测连续 值,常用算法有ID3、C4.5、CART等
    2、决策树的构建过程
  1. 将所有的特征看成一个一个的节点;
  2. 遍历当前特征的每一种分割方式,找到最好的分割点;将数据划分为不同的子节点,eg: N1、 N2…Nm;计算划分之后所有子节点的’纯度’信息;
  3. 使用第二步遍历所有特征,选择出最优的特征以及该特征的最优的划分方式;得出最终的子节点: N1、 N2…Nm
  4. 对子节点N1、N2…Nm分别继续执行2-3步,直到每个最终的子节点都足够’纯’。
    构建决策树的关键步骤就是分裂属性,分裂属性是指在某个节点按照某一类特征属性的不同划分构建不同的分支,其目标就是让各个分裂子集尽可能的’纯 '(让一个分裂子类中待分类的项尽可能的属于同一个类别)。
    3、决策树特征属性类型
    根据特征属性的类型不同,在构建决策树的时候,采用不同的方式,具体如下:
  • 属性是离散值,而且不要求生成的是二叉决策树,此时一个属性就是一个分支(如果不要求是二叉决策树,那么X1={1,3,5},每个属性就是一个分支)
  • 属性是离散值,而且要求生成的是二叉决策树,此时使用属性划分的子集进行测试,按照 “属于此子集”和“不属于此子集”分成两个分支
  • 属性是连续值,可以确定一个值作为分裂点split_point,按照>split_point和 <=split_point生成两个分支
    决策树算法是一种“贪心”算法策略,只考虑在当前数据特征情况下的最好分割 方式,不能进行回溯操作。对于整体的数据集而言,按照所有的特征属性进行划分操作,对所有划分操作的结果集的“纯度”进行比较,选择“纯度”越高的特征属性作为当前需要分割的数据集进行分割操作,持续迭代,直到得到最终结果。决策树是通过“纯度”来 选择分割特征属性点的。
    4、决策树的量化纯度
    “纯”可以通过三个公式进行判断,分别是Gini系数、熵(Entropy)这两个公式来衡量当前节点的纯度,值越大,表示数据越“不纯”;越小表示越“纯”;
    我们对决策树的划分一般采用信息增益率或者条件gini系数来对样本进行划分。为此将决策树分为以下几类,分别是ID3、cs4.5、cart决策树
    5、决策树的停止条件
    决策树构建的过程是一个递归的过程,所以必须给定停止条件,否则过程将不会 进行停止,一般情况有两种停止条件:
  • 当每个子节点只有一种类型的时候停止构建
  • 当前节点中记录数小于某个阈值,同时迭代次数达到给定值时,停止构建过程,此时使用 max(p(i))作为节点的对应类型
    方式一可能会使树的节点过多,导致过拟合(Overfiting)等问题;比较常用的方式是使用 方式二作为停止条件
    决策树算法效果评估
    决策树的效果评估和一般的分类算法一样,
    ①采用混淆矩阵来进行计算准确率、召回率、精确率等指标
    ②也可以采用叶子节点的纯度值总和来评估算法的效果,值越小,效果越好
    在这里插入图片描述
    这个公式的含义是, D t |D_t| 该叶子结点的样本数目, D |D| 是总的样本数目,乘以当前叶子结点的纯度度量指标。
    二、三种决策树介绍
    决策树可以被分为
    ID3、c4.5、cart分类数
    1、ID3
    在介绍ID3之前我们先介绍几个概念
    1.1、信息熵
    H(X)就叫做随机变量X的信息熵
    在这里插入图片描述
    信息熵公式的解读:如果随机变量x有m个取值,每个取值的概率为 p i p_i ,那么这个随机变量x的信息熵为所有取值的概率乘以log以2为底 p i p_i 的乘积。(可以看出信息熵其实就是前面我们学的logistic的损失函数)。
    信息量:指的是一个样本/事件所蕴含的信息,如果一个事件的概率越大,那么就可以认为该事件所蕴含的信息越少。极端情况下,比如:“太阳从东方升起”, 因为是确定事件,所以不携带任何信息量。
    信息熵:1948年,香农引入信息熵;一个系统越是有序, 信息熵就越低,一个系统越是混乱,信息熵就越高,所以信息熵被认为是一个系统有序程度的度量。 信息熵越大代表当前数据集的信息越混乱,信息熵越小代表当前数据集的信息越明确,
    信息熵(Entropy)案例
    赌马比赛中,有两组赛马共八匹,获胜的概率如下:
    在这里插入图片描述
    在比赛前,对于第一组而言,我们只知道A/B/C/D获胜的概率是一样的,我们 是判断不出来任何偏向的;但是对于第二组而言,我们很清楚的就能够判断A会获胜。
    第一组比第二组的概率分布越不有序,所以第一组的信息熵比第二组的信息熵要大,所以我们从第二组的信息熵中可以获得更多的信息。
    1.2、条件熵
    给定条件X的情况下,随机变量Y的信息熵就叫做条件熵。
    在这里插入图片描述
    我们可以求得
    H ( X ) = 0.5 l o g 2 ( 0.5 ) + 0.25 l o g 2 ( 0.25 ) + 0.25 l o g 2 ( 0.25 ) = 1.5 H(X)=0.5*log_2(0.5)+0.25*log_2(0.25)+0.25*log_2(0.25)=1.5
    同理
    H ( Y ) = 1 H(Y)=1
    那么条件熵可以分解为各个条件下的
    当专业(X)为数学的时候,Y的信息熵的值为:H(Y|X=数学)
    在这里插入图片描述
    在这里插入图片描述
    给定条件X的情况下,所有不同x值情况下Y的信息熵的平均值叫做条件熵。
    1.3信息熵增益
    在这里插入图片描述
    事件(X,Y)发生所包含的熵,减去事件X单独发生的熵,即为在事件X发生的前提 下,Y发生“新”带来的熵,这个也就是条件熵本身的概念。
    在这里插入图片描述
    Gain为A特征对训练数据集D的信息增益,它为集合D的经验熵H(D)与特征A给 定条件下D的经验条件熵H(D|A)之差,代表我们选择特征A可以对总体数据的混乱度下降多少。
    1.4 ID3决策树构建
    ①构建方法
    ID3算法是决策树的一个经典的构造算法,内部使用信息熵以及信息增益来进行构建;每次迭代选择信息增益最大的特征属性作为分割属性
    在这里插入图片描述
    ②停止条件
    类别中的样本数低于某个阈值或者信息熵增益低于某个阈值,则停止迭代并将其中实例数最大的类作为该节点的类标记。
    优点:
  • 决策树构建速度快;实现简单;
    缺点:
  • 计算依赖于特征数目较多的特征,而属性值最多的属性并不一定最优(比如x1和x2,x1有100个特征,而x2只有3个,那么进行划分时,优先选x1进行划分)
  • ID3算法不支持连续变量
  • ID3算法对于缺失值是敏感的
  • ID3算法是单变量决策树,主要考虑一个变量的影响,并不会考虑变量之间的相互影响
  • ID3算法是单变量决策树,对于特征属性之间的关系不会考虑 ,抗噪性差 只适合小规模数据集,需要将数据放到内存中
    1.5 例子
    例子:
    我们以一个是否能偿还贷款的例子来分析决策树的问题
    在这里插入图片描述
    设这几个变量分别为X1,X2,X3,Y
    是否能偿还贷款总的信息熵为0.88
    在这里插入图片描述
    (1)计算第一个指标是否有房产,对信息熵增益的影响
    有房产与无房产下Y的条件信息熵的如下:
    在这里插入图片描述
    选择房产的信息增益如下:
    在这里插入图片描述
    (2)计算第二个指标婚姻状态、
    在这里插入图片描述
    (3)计算第三个指标收入
    一般来说,ID3算法是不支持对连续值进行信息熵的计算的,因为会因为值太多而导致选择连续值的可能性较大,例如如果我们对收入进行信息熵的计算的话,其公式为:
    在这里插入图片描述
    其次我们在对连续变量进行划分时也很容易导致过拟合,比如对收入来说,我们可能将其划分为(收入=60,75,85…等等子空间)。这样会将样本量大大的减少,很容易产生过拟合(因为划分的子空间太小了)。为此我们选择二分划分,每次选择信息增益率最小的值来进行连续变量的划分
    所以一般情况下我们会对连续变量选择划分点进行划分,选择的公式为信息增益率(这里其实是用cs4.5的划分方式,按道理说这个例子不太合适)
    在这里插入图片描述可以看出,对于连续值来说,这样的计算方式不合理(因为相当于连续变量永远只有两个类别,所以我们采用信息增益率这个指标来进行划分,你的类别越少熵也越小,类别越多熵也越多。平衡变量中取值的影响)
    在这里插入图片描述
    所以选择信息增益率的话可以有效的防止,变量因字段过多而强制对其选择。
    所以第一次划分我们选择收入,下一次划分的时候,采取同样的方式继续划分直到所有的数据样本都被划分。
    在这里插入图片描述
    总结:ID3算法只适用于变量是离散的变量,如果既有离散变量又有连续变量选择信息熵增益,对连续变量采用二分遍历。且离散变量使用一次以后不能划分了,因为划分后的自己的H(该变量)=0(因为多分类会使变量的纯度提的十分高),但是离散变量由于是二分化,所以是可以再次划分的。
    2、c4.5
    在ID3算法的基础上,进行算法优化提出的一种算法(C4.5);现在C4.5已经是特别经典的一种决策树构造算法;使用信息增益率来取代ID3算法中的信息增益, 在树的构造过程中会进行剪枝操作进行优化;能够自动完成对连续属性的离散化处理;C4.5算法在选中分割属性的时候选择信息增益率最大的属性,涉及到的公式为:
    总结:
    1、cs4.5用信息增益率代替了信息增益(这样就解决了ID3变量划分更倾向于属性较多的变量,因为属性多的变量熵值也比较大,这样就消除了信息增益的变化)
    补充cs4.5对于连续属性的划分:
    当属性类型为连续型,则需要对数据进行离散化处理。C4.5算法针对连续属性的离散化处理,核心思想:将属性A的N个属性值按照升序排列;通过二分法将属性A的所有属性值分成两部分(共有N-1种划分方法,二分的阈值为相邻两个属性值的中间值);计算每种划分方法对应的信息增益率,选取信息增益率最大的划分方法的阈值作为属性A二分的阈值。具体算法流程如下:
    1、对特征的取值进行升序排序
    2、两个特征取值之间的中点作为可能的分裂点,将数据集分成两部分,计算每个可能的分裂点的信息增益(InforGain)。优化算法就是只计算分类属性发生改变的那些特征取值。
    3、选择信息增益(InforGain)最大的分裂点作为该特征的最佳分裂点
    4、计算最佳分裂点的信息增益率(Gain Ratio)作为特征的Gain Ratio。
    补充CS4.5对于缺失值的处理,进行缺失值操作时相当于不理会缺失值,只对非缺失的部分进行划分,由于选取了信息增益率,并不会太受样本及分类个数的影响。
    2、树的构造过程中会进行减枝操作
    在这里插入图片描述
    H(A)代表该特征的熵值。
    优点:
    产生的规则易于理解 准确率较高 实现简单
    缺点:
    (1)C4.5生成的是多叉树,即一个父节点可以有多个节点。很多时候,在计算机中二叉树模型会比多叉树运算效率高。如果采用二叉树,可以提高效率。
    (2)对于离散变量只能进行一次划分
    (3) C4.5只能用于分类,如果能将决策树用于回归的话可以扩大它的使用范围。
    (4)C4.5由于使用了熵模型,里面有大量的耗时的对数运算,如果是连续值还有大量的排序运算。如果能够加以模型简化可以减少运算强度但又不牺牲太多准确性的话,那就更好了。
    3、cart算法
    使用基尼系数作为数据纯度的量化指标来构建的决策树算法就叫做 CART(Classification And Regression Tree,分类回归树)算法。CART算法使用 GINI增益作为分割属性选择的标准,选择GINI增益最大的作为当前数据集的分割属性;可用于分类和回归两类问题。强调备注:CART构建是二叉树
    在这里插入图片描述
    CART算法构建的一定是二叉树,ID3和C4.5构建的不一定是二叉树.
    即cart树可以重复利用特征.
    例:以统计学习方法上面的例子为例
    在这里插入图片描述
    在这里插入图片描述
    cart其实就是每次选择特征A条件下的集合D的基尼系数进行切割。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    生成的决策树为:
    在这里插入图片描述
    优点:
    1、特征可以被多次选择
    2、即适用于离散变量又适用于连续变量,不过衡量方式不同
    离散采用gini增益率来判断,连续采用均方误差来判断
    缺点:
    没有考虑到变量之间的相互影响
    四、三种算法总结
    在这里插入图片描述
    可以看出三者之间还是有显著的区别,最主要的是:
    ID3只能处理离散值,对缺失值比较敏感,cs4.5能处理连续值和离散值,也能处理缺失值,但是只能用于分类,(选用信息增益率来进行)
    cart是采用二分树的做法来进行特征选择,特征可以选择很多次,采用条件基尼系数来进行决策,特征选择的标准为基尼系数与均方差。支持回归和分类。
    详细流程如下:
    在这里插入图片描述
    决策树python的各个参数,
  • criterion,选择划分的是gini还是信息熵。
  • split,数据划分的方式,best,选择最优的特征划分,random,随机划分
    选择随机的结点划分(因为划分的特征最优是在当前训练集上,但不一定在别的训练集上也是最优的,random有时随机选择特征划分,这样使得决策树的泛化能力加强)
  • max_depth:最大深度,生成决策树的深度,相当于进行减枝(因为不一定层次越多越好,树越深越容易过拟合)
    五、剪枝优化
    决策树过渡拟合一般情况是由于节点太多导致的,剪枝优化对决策树的正确率影响是比较大的。所以常见的优化方式有两个,一个是进行剪枝优化,另一个是利用随机森林对数据进行预测。
    1、决策树的剪枝
    前置剪枝:在构建决策树的过程中,提前停止。结果是决策树一般比较小,实践证明这种 策略无法得到比较好的结果。
    后置剪枝:在决策树构建好后,然后再开始裁剪,一般使用两种方式:1)用单一叶子节点 代替整个子树,叶节点的分类采用子树中最主要的分类;2)将一个子树完全替代另外一棵子树;(什么意思,比如我们的预测结果是二分类,那么我们最终要裁剪的子树中肯定含有很多样本分别是0或者1,这时我们选择比例最高的作为裁剪后的结果)
    决策树剪枝过程
    对于给定的决策树T0
  • 计算所有内部非叶子节点的剪枝系数
  • 查找最小剪枝系数的节点,将其子节点进行删除操作,进行剪枝得到决策树Tk;如果存在 多个最小剪枝系数节点,选择包含数据项最多的节点进行剪枝操作
  • 重复上述操作,直到产生的剪枝决策树Tk只有1个节点
  • 得到决策树T0T1T2…Tk 使用验证样本集选择最优子树Ta (以损失函数最小为原则)
    2、决策树剪枝损失函数及剪枝系数
    1、ID3决策树减枝
    在这里插入图片描述
    在这里插入图片描述
    计算每一个叶子节点的损失函数总和。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    这个的意思是从叶子节点开始回朔寻找,计算每个叶子节点裁剪前和裁剪后的损失函数值,如果裁剪后比裁剪前要小,则进行减枝,否则不进行减枝。不断向上进行减枝,直到损失函数不再变化。
    每次计算
    L o s s = C α ( T A ) C α ( T B ) Loss=C_α(T_A)-C_α(T_B) ,如果loss小于0,代表减枝后损失函数更小,那么计算出所有的叶子节点的loss,选择loss绝对值最大的进行减枝,如果loss大于0,则不考虑减枝,所有loss大于0减枝结束,如果多个loss的值相等,选择子树数据最多的进行减枝

2、cart决策树减枝
1、算法思路
到了这基本就可以确定算法的思路了,对于原始的CART树 A 0 A_0 ,先剪去一棵子树,生成子树 A 1 A_1 ,然后再从 A 1 A_1 剪去一棵子树生成 A 2 A_2 ,直到最后剪到只剩一个根结点的子树 A n A_n ,于是得到了 A 0 A N A_0-A_N 一共n+1棵子树。
然后再用n+1棵子树预测独立的验证数据集,谁的误差最小就选谁,大致的思路就是这样。
剪枝算法:
在这里插入图片描述
cart决策树减枝分两个步骤:
这里先解释第一步:
怎么计算要对哪个内部节点进行剪枝
对于任意的一刻子树Tt,其损失函数为:
在这里插入图片描述
在这里插入图片描述
可以看出我们的损失函数不仅要考虑模型的损失函数变化也要考虑模型的复杂度,叶子节点的个数。
那么对于一个内部的子节点
对于一个内部的子节点,如果
在这里插入图片描述
在这里插入图片描述
那么为什么选择最小的α呢,因为通过慢慢减枝可以使生成的子树最完整,否则你一次减至根节点,后面就不需要做了。(这里一定要注意两个损失指的是什么)
第一步总结:
(1)按照上述计算方式,对决策树内部的每一个内部节点计算g(t),每次选择最小的子树进行裁剪
(2)按照上述步骤不断裁剪,每次记录下裁剪后的子树。
(3)从产生的整体的树 T 0 T_0 的最底端开始不断剪枝,直至剪到整个树 T 0 T_0 的根结点为止,从而形成了一个子树序列 T 0 , T 1 , T 2 . . . . T n {T_0,T_1,T_2....T_n}
第二步:
通过交叉验证法在独立的验证数据集上对子树序列进行测试,从中选出最优子树。

在这里插入图片描述

五、分类树和回归树的区别
分类树采用信息增益、信息增益率、基尼系数来评价树的效果,都是基于概率值 进行判断的;而分类树的叶子节点的预测值一般为叶子节点中概率最大的类别作 为当前叶子的预测值。
在回归树种,叶子节点的预测值一般为叶子节点中所有值的均值来作为当前叶子节点的预测值。所以在回归树中一般采用MSE作为树的评价指标,即均方差
在这里插入图片描述
一般情况下,只会使用CART算法构建回归树
例:
如我希望通过决策树以你有无房产这个特征判断该给你放贷多少钱
比如
在这里插入图片描述
这时再采用加权的方式,将两者的均方误差加起来,算出总的均方误差。以均方误差判断最优特征的选择。
sklearn 中Tree的包可以实现决策树的操作,以及决策树可视化的操作。

四、决策树总结
1、决策树和回归树的区别
在这里插入图片描述
2、决策树的构建过程
在这里插入图片描述
3、决策树分裂属性选择方式
在这里插入图片描述
鲁棒性是稳定性的意思,抽取的样本有的特征的分布不要一样,这样随机抽取相当于随机的选择要划分的局部样本,有随机的成分更科学。
4、决策树的过拟合与欠拟合
在这里插入图片描述
5、效果评估
混淆矩阵、交叉验证。
6、决策树的优点:
(1)简单直观,生成的决策树很直观。
(2)基本不需要预处理,不需要提前归一化,处理缺失值。
(3)既可以处理离散值也可以处理连续值。很多算法只是专注于离散值或者连续值。
(5)可以处理多维度输出的分类问题。
(6)相比于神经网络之类的黑盒分类模型,决策树在逻辑上可以得到很好的解释
(7) 对于异常点的容错能力好,健壮性高。
 我们再看看决策树算法的缺点:
(1)决策树算法非常容易过拟合,导致泛化能力不强。可以通过设置节点最少样本数量和限制决策树深度来改进。
(2)决策树会因为样本发生一点点的改动,就会导致树结构的剧烈改变。这个可以通过集成学习之类的方法解决。
(3)寻找最优的决策树是一个NP难的问题,我们一般是通过启发式方法,容易陷入局部最优。可以通过集成学习之类的方法来改善。
(4)有些比较复杂的关系,决策树很难学习,比如异或。这个就没有办法了,一般这种关系可以换神经网络分类方法来解决。
(5)如果某些特征的样本比例过大,生成决策树容易偏向于这些特征。这个可以通过调节样本权重来改善。

猜你喜欢

转载自blog.csdn.net/weixin_41611045/article/details/90300458