目录
一、什么是决策树
二、决策树的学习过程
三、划分选择
1.信息增益 - ID3算法
信息熵
信息增益
2.增益率 - C4.5算法
3.基尼指数 - CART决策树
基尼指数
本节总结
四、剪枝处理
1.预剪枝(prepruning)
2.后剪枝(post-pruning)
本节总结
五、决策树的三种常用算法
1.ID3算法/基本决策树
2.C4.5算法
3.CART算法
CART分类树算法
CART回归树算法
优缺点
本节总结
六、多变量决策树
前言
1、首先,在了解树模型之前,自然想到树模型和线性模型有什么区别呢?
其中最重要的是,树形模型是一个一个特征进行处理,线性模型是所有特征给予权重相加得到一个新的值。决策树与逻辑回归的分类区别也在于此,逻辑回归是将所有特征变换为概率后,通过大于某一概率阈值的划分为一类,小于某一概率阈值的为另一类;而决策树是对每一个特征做一个划分。另外逻辑回归只能找到线性分割(输入特征x与logit之间是线性的,除非对x进行多维映射),而决策树可以找到非线性分割。
而树形模型更加接近人的思维方式,可以产生可视化的分类规则,产生的模型具有可解释性(可以抽取规则)。树模型拟合出来的函数其实是分区间的阶梯函数。
2、了解决策树前,还需了解熵。
物理学上,熵 Entropy 是“混乱”程度的量度。
熵:表示随机变量不确定性的度量
熵如何度量呢 --- 熵的量化
比如定义一个事件的不确定性相当于抛几次银币的不确定性。抛一次硬币,出现正面的情况是50%,反面也是50%,记作抛一次硬币的不确定性记为1bit。
抛硬币的次数与结果不确定性是呈指数关系。
抛硬币次数 | 结果情况的种数 |
1 | 2 |
2 | 4 |
3 | 8 |
n | 2^n |
熵的量化分为两种情况:
公式:n = log_2 m
解释:8个等概率的不确定性情况,相当于抛3个硬币,熵为3bit
公式:
所谓决策树,就是一个类似于流程图的树形结构,树内部的每一个节点代表的是对一个特征的测试,树的分支代表该特征的每一个测试结果,而树的每一个叶子节点代表一个类别。树的最高层是就是根节点。下图即为一个决策树的示意描述,内部节点用矩形表示,叶子节点用椭圆表示。
输入:训练集D={(x1,y1),(x2,y2),…(xm,ym)};
属性集A={a1,a2,…ad}.
过程:函数TreeGenerate(D,A)
输出:以node为根结点的一棵决策树
决策树学习的关键其实就是选择最优划分属性,希望划分后,分支结点的“纯度”越来越高。那么“纯度”的度量方法不同,也就导致了学习算法的不同。
“信息熵”是度量样本集合纯度(purity)的最常用的指标。信息熵 --- 不纯度(impurity)
假定当前样本集合 D 中第 k 类样本所占的比例为 pk ,则 D 的信息熵定义为
或者这样表示
Ent(D)的值越小,则D的纯度越高。
离散属性 a 有 V 个可能的取值 {a1,a2,…,aV};
若使用a对样本集D进行划分,则会产生V个分支结点,其中第v个分支结点包含了D中属性 a 上取值为 av 的样本集合,记为 Dv。
考虑到不同分支结点所含样本数不同,给分支结点赋予权重|Dv| / |D|。
用属性 a 对样本集 D 进行划分所获得的“信息增益”,如下表示
或者这样表示
简单来说就是父结点与子结点的信息熵的差,就是信息增益。
信息增益越大,使用属性a来划分所获得的“纯度提升”越大。
另外,信息增益还可以用基尼系数来计算。
用属性 a 对样本集 D 进行划分所获得的“增益率”,如下表示
公式:
其中IV(a)称为属性a的“固有值”
信息增益准则对可取值数目较多的属性有所偏好(比如把“编号”作为一个划分属性,则将产生实例数这么多的分支,每个分支结点仅包含一个样本,这些分支结点的纯度已达最大,但这样的决策树显然不具有泛化能力),为减少这种偏好带来的不利影响,C4.5决策树算法使用“增益率”来选择最优划分属性。
增益率准则对可取数目较少的属性有所偏好(属性a的可能取值数目越多(即V越大),则IV(a)的值通常会越大。例如 IV(触感) = 0.874 ( V = 2 )、IV(色泽) = 1.580 ( V = 3 )、IV(编号) = 4.088 ( V = 17)),因此C4.5算法不是直接选择增益率最大的候选划分属性,而是使用一个启发式:先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的。
数据集D的纯度也可用基尼值来度量。
GINI系数就是不纯度(impurity)
基尼值Gini(D)反应了从数据集D中随机抽取两个样本,其类别标记不一致的概率。
Gini(D)越小,则数据集D的纯度越高。
属性a的基尼指数定义为
于是,我们在候选属性集A中,选择使得划分后基尼指数最小的属性作为最优划分属性,即a*=argmin Gini_index(D,a)
1、数据集的纯度可以用“信息熵”、“基尼值”来进行度量
2、信息增益可以用信息熵计算,也可以用基尼值来计算。(注意:度量值不一样)
由于噪声等因素的影响,会使得样本某些特征的取值与样本自身的类别不相匹配的情况,基于这些数据生成的决策树的某些枝叶会产生一些错误;尤其是在决策树靠近枝叶的末端,由于样本变少,这种无关因素的干扰就会突显出来;由此产生的决策树可能存在过拟合的现象。树枝修剪就是通过统计学的方法删除不可靠的分支,使得整个决策树的分类速度和分类精度得到提高。
剪枝策略:预剪枝、后剪枝(判断剪枝后能否提升性能,来决定“预剪枝”是否划分、“后剪枝”是否剪枝)
那么如何判断决策树泛化性能是否提升呢?性能评估方法有很多,比如留出法,即预留一部分数据作“验证集”以进行性能评估。
预剪枝是指在决策树生成的过程中,对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶结点。
后剪枝则是先从训练集生成一颗完成的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化性能提升,则将该子树替换为叶结点。
预剪枝优缺点:
1、使决策树很多分支没有“展开”,降低过拟合的风险,减少决策树训练时间和测试时间开销
2、有欠拟合的风险(分支的当前划分可能不能提高泛化性能,但是基于其后的分支可能提升性能)
后剪枝优缺点:
1、欠拟合的风险很小,泛化性能往往优于预剪枝决策树
2、训练时间开销大
ID3算法是最早提出的一种决策树算法,ID3算法的核心是在决策树各个节点上应用信息增益准则来选择特征,递归的构建决策树。
具体方法是:从根节点开始,对节点计算所有可能的特征的信息增益,选择信息增益最大的特征作为节点的特征,由该特征的不同取值建立子节点:再对子节点递归的调用以上方法,构建决策树:直到所有的特征信息增益均很小或没有特征可以选择为止。
C4.5算法与ID3算法决策树的生成过程相似,C4.5算法对ID3算法进行了改进。它是用信息增益率(比)来选择特征。
这里的改进主要是针对样本特征来作。
(1)基本决策树要求特征A取值为离散值,如果A是连续值,假如A有v个取值,则对特征A的测试可以看成是对v-1个可能条件的测试,其实可以把这个过程看成是离散化的过程,只不过这种离散的值间隙会相对小一点;当然也可以采用其他方法,比如将连续值按段进行划分,然后设置哑变量;
(2)特征A的每个取值都会产生一个分支,有的时候会导致划分出来的子集样本量过小,统计特征不充分而停止继续分支,这样在强制标记类别的时候也会带来局部的错误。针对这种情况可以采用A的一组取值作为分支条件;或者采用二元决策树,每一个分支代表一个特征取值的情况(只有是否两种取值)。
(3)某些样本在特征A上值缺失,针对这种空值的情况,可以采用很多方法,比如用其他样本中特征A出现最多的值来填补空缺,比如采用均值、中值等,甚至在某些领域的数据中可以采用样本内部的平滑来补值,当样本量很大的时候也可以丢弃这些有缺失值的样本。
(4)随着数据集的不断减小,子集的样本量会越来越小,所构造出的决策树就可能出现碎片、重复、复制等总是。这时可以利用样本的原有特征构造新的特征进行建模;
(5)信息增益法会倾向于选择取值比较多的特征(这是信息熵的定义决定了的),针对这一问题,人们提出了增益比率法(gain ratio),将每个特征取值的概率考虑在内,及gini索引法,χ2χ2条件统计表法和G统计法等。
参考:决策树--CART树详解
既可以做分类,也可以做回归。只能形成二叉树。
分支条件:二分类问题
分支方法:对于连续特征的情况:比较阈值,高于某个阈值就属于某一类,低于某个阈值属于另一类。对于离散特征:抽取子特征,比如颜值这个特征,有帅、丑、中等三个水平,可以先分为帅和不帅的,不帅的里面再分成丑和中等的。
得分函数(y):对于分类树取得是分类最多的那个结果(也即众数),对于回归树取得是均值。
损失函数:其实这里的损失函数,就是分类的准则,也就是求最优化的准则
对于分类树(目标变量为离散变量):同一层所有分支假设函数的基尼系数的平均。
对于回归树(目标变量为连续变量):同一层所有分支假设函数的平方差损失
分裂准则:
对于分类树(目标变量为离散变量):使用基尼系数作为分裂规则。比较分裂前的gini和分裂后的gini减少多少,减少的越多,则选取该分裂规则
对于回归树(目标变量为连续变量):使用最小方差作为分裂规则。只能生成二叉树。
CART分类树算法对于连续特征和离散特征处理的改进:
对于CART分类树连续值的处理问题,其思想和C4.5是相同的,都是将连续的特征离散化。唯一的区别在于在选择划分点时的度量方式不同,C4.5使用的是信息增益比,则CART分类树使用的是基尼系数。
具体的思路如下,比如m个样本的连续特征A有m个,从小到大排列为a1,a2,...,am,则CART算法取相邻两样本值的平均数,一共取得m-1个划分点,其中第i个划分点表示为:。对于这m-1个点,分别计算以该点作为二元分类点时的基尼系数。选择基尼系数最小的点作为该连续特征的二元离散分类点。比如取到的基尼系数最小的点为,则小于的值为类别1,大于的值为类别2,这样我们就做到了连续特征的离散化。
要注意的是,与离散属性不同,若当前结点划分属性为连续属性,该属性还可作为其后代结点的划分属性。(不管是C4.5,还是CART)
对于CART分类树离散值的处理问题,采用的思路是不停的二分离散特征。
回忆下ID3或者C4.5,如果某个特征A被选取建立决策树节点,如果它有A1,A2,A3三种类别,我们会在决策树上一下建立一个三叉的节点,这样导致决策树是多叉树。但是CART分类树使用的方法不同,他采用的是不停的二分,还是这个例子,CART分类树会考虑把A分成{A1}和{A2,A3}, {A2}和{A1,A3}, {A3}和{A1,A2}三种情况,找到基尼系数最小的组合,比如{A2}和{A1,A3},然后建立二叉树节点,一个节点是A2对应的样本,另一个节点是{A1,A3}对应的节点。同时,由于这次没有把特征A的取值完全分开,后面我们还有机会在子节点继续选择到特征A来划分A1和A3。这和ID3或者C4.5不同,在ID3或者C4.5的一棵子树中,离散特征只会参与一次节点的建立。
CART回归树和CART分类树的建立算法大部分是类似的,所以这里我们只讨论CART回归树和CART分类树的建立算法不同的地方。
首先,我们要明白,什么是回归树,什么是分类树。两者的区别在于样本输出,如果样本输出是离散值,那么这是一颗分类树。如果果样本输出是连续值,那么那么这是一颗回归树。
除了概念的不同,CART回归树和CART分类树的建立和预测的区别主要有下面两点:
1)连续值的处理方法不同
2)决策树建立后做预测的方式不同。
对于连续值的处理,我们知道CART分类树采用的是用基尼系数的大小来度量特征的各个划分点的优劣情况。这比较适合分类模型,但是对于回归模型,我们使用了常见的和方差的度量方式,CART回归树的度量目标是,对于任意划分特征A,对应的任意划分点s两边划分成的数据集D1和D2,求出使D1和D2各自集合的均方差最小,同时D1和D2的均方差之和最小所对应的特征和特征值划分点。表达式为:
其中,c1为D1数据集的样本输出均值,c2为D2数据集的样本输出均值。
对于决策树建立后做预测的方式,上面讲到了CART分类树采用叶子节点里概率最大的类别作为当前节点的预测类别。而回归树输出不是类别,它采用的是用最终叶子的均值或者中位数来预测输出结果。
主要缺点如下:
1、应该大家有注意到,无论是ID3, C4.5还是CART,在做特征选择的时候都是选择最优的一个特征来做分类决策,但是大多数,分类决策不应该是由某一个特征决定的,而是应该由一组特征决定的。这样决策得到的决策树更加准确。这个决策树叫做多变量决策树(multi-variate decision tree)。在选择最优特征的时候,多变量决策树不是选择某一个最优特征,而是选择最优的一个特征线性组合来做决策。这个算法的代表是OC1,这里不多介绍。
2、如果样本发生一点点的改动,就会导致树结构的剧烈改变。这个可以通过集成学习里面的随机森林之类的方法解决。
下表给出了ID3,C4.5和CART的一个比较总结。
算法 | 支持模型 | 树结构 | 特征选择(分支方式) | 连续值处理 | 缺失值处理 | 剪枝 | 备注 |
ID3 | 分类 | 多叉树 | 信息增益 | 不支持 | 不支持 | 不支持 | 只能处理离散属性,不能处理缺失值 |
C4.5 | 分类 | 多叉树 | 信息增益比 | 支持 | 支持 | 支持 | 解决了ID3分支中喜欢偏向属性值较多的属性 |
CART | 分类,回归 | 二叉树 | 基尼系数,均方差 | 支持 | 支持 | 支持(后剪枝) | 可进行分类和回归,只能是二叉树 |
但在学习任务的真实分类边界比较复杂时,必须使用很多段划分才能获得较好的近似。多变量决策树使用斜的划分边界,在此类决策树中,非叶结点不再是仅对某个属性,而是对属性的线性组合进行测试。
参考资料:
机器学习算法(3)之决策树算法_不曾走远的博客-CSDN博客_决策树算法
机器学习算法------(4.1 决策树算法简介、4.2 决策树分类原理(信息增益、信息增益率、基尼值和基尼指数))_程序猿-凡白的博客-CSDN博客_基尼指数原理