目录
第四章 决策树
4.1 基本流程
决策树(decision tree)就是基于树结构进行决策的一种机器学习方法,进行决策时从根节点经过一系列判断从而得出最终决策。
function TreeGenerate(D, A):# D:训练集,A:属性集
生成结点node
# 预处理,筛选掉无法递归的情况
if D中样本全属于同一类:
将node标记为C类叶结点
return
if A=空集 or D中样本在A上取值相同:
将node标记为叶结点,其类别标记为D中样本数最多的类
return
select() # 筛选方法。从A中选择最优划分属性a*。
for a*的每一个值a*i: # 对每一个属性若不能达到花粉效果则变其为叶子(Di=空)
为node生成一个分支
令Di表示D中在a*上取值为a*i的样本子集
if Di为空:
将分支结点标记为叶结点,其类别标记为D中样本最多的类 # 样本最多,样本最多,样本最多
return
else:
TreeGenerate(Di, A-{a*}) # 以此时分直接点为node,递归进行TreeGenerate方法
return 以node为根节点的一颗决策树
该算法中,有三种情形会导致递归返回:
(1)当前结点包含的样本全属于同一类别
(2)当前属性集为空(没有更多属性可以用来测试)或者所有样本在所有属性上取值相同
(3)当前结点包含的样本集合为空。
在第(2)种情形下,把结点标记为叶结点并将其类别设定为该节点所含样本最多的类别;在(3)种情形下,把结点标记为叶结点并将其类别设定为父节点所含样本最多的类别。
4.2 划分选择
决策树学习的目的是为了产生一颗泛化能力强的决策树。从根节点到每个叶子结点,我们都希望经过每个结点之后,分类结果会越来越清晰。例如在根节点时所有样本共有5类,经过第一个中间结点后,衍生了两个子结点,两个子结点的样本类别分别包含3类,换句话来说就是经过第一个中间结点,在一定程度上把部分不同类别的结点分开了,两个子结点中的样本类别纯度变高了。
让结点的“纯度”越来越高,就是划分选择问题的准则。
4.2.1 信息增益
信息熵(information entropy)是衡量样本集合纯度最常用的一种指标,信息熵越小则纯度越高,假设当前样本集合D中第k类样本所占的比例为(k=1,2,...,|y|),则D的信息熵定义为
假定离散属性a有V个可能的取值{},若使用a来对样本集D进行划分,则会产生V个分支结点,第v个分支结点包含了D中所有在属性a上取值为
的样本,记为
。我们也可以对该子集
计算它的信息熵。同时为了考虑每个分支结点包含样本数的不同,我们在计算
时乘熵权重系数
,即样本数越多的分支节点的影响越大,于是可计算出用属性a对样本集D进行划分所获得的信息增益
信息增益就是指在某个条件下,该信息不确定性减小的多少。用公式来表达就是:信息增益=信息熵-条件熵。信息增益越大,意味着在当前条件下,信息的不确定性减小的越多,不确定性越低,在本场景中就是样本的纯度越高。
4.2.2 增益率
信息增益在一定程度上存在问题。例如集合D一共有100个样本,我们将样本从1-100进行编号。假如我们把编号也考虑进入属性划分选择,那么毫无疑问,编号带来的信息增益是特别高的。因为可想而知:一个样本一个编号,这个时候每个分支结点都只有一个样本,这已经是纯度最高的情况了。也即信息增益倾向于可取数目较多的属性。
C4.5决策树算法不直接使用信息增益,而是使用增益率来选择最优划分属性,增益率定义为
其中属性固有值定义为
属性a的可能取值数目越多(即V越大),则IV(a)的值通常会越大。属性固有值在分母,显然增益率倾向于可取数目较少的属性。因此综合信息增益和增益率,得出了一种较均匀的划分原则:先从候选划分属性中找出信息增益高于平均水平的属性,再从中找出增益率最高的。
4.2.3 基尼系数
CART决策树使用基尼系数来选择划分属性,数据集D的纯度可用基尼值来度量:
基尼值反应了从数据集中抽取两个样本,其类别不一致的概率。因此基尼系数越大,则表示样本集合的纯度越低。我们在候选属性集合中,选择那个使得基尼系数最小的作为最优划分属性。
4.3 剪枝处理
为了防止过拟合,需要对决策树进行剪枝处理,基本策略有预剪枝和后剪枝两种。
剪枝处理是为了提升系统泛化性能,如何判断系统泛化性能是否提升呢?我们可以通过留出法来对泛化性能进行评估。将样本集合分为训练集和验证集。在基于前面提到的几种属性划分选择的基础上,对比划分前后的验证集的准确率来进行泛化性能的评估。如果经过划分后,验证集的准确率提高了,则认为当前结点的划分对于泛化性能的提升是有意义的,否则不计划分。
4.3.1 预剪枝
预剪枝(prepruning)是指在决策树生成过程中,对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶结点。
可以根据划分前后的验证集精度(样本被正确分类的比例)决定是否进行划分。预剪枝不仅降低了过拟合的风险,还减少了训练时间和测试时间;但另一方面,由于预剪枝是基于“贪心”本质,只会着眼当前最优的情况,不会考虑对当前表现提升不大而对后续表现有较大提升的划分,且预剪枝会有欠拟合的风险。
4.3.2 后剪枝
后剪枝(post-pruning)是从训练集生成一棵完整的决策树,然后自底向上对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化性能提升,则将该子树替换为叶结点。
一般情况下,后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树,但后剪枝过程是在生成完全决策树之后进行的,并且要自底向上对所有非叶结点逐一考察,因此训练时间开销要比未剪枝决策树和预剪枝决策树要大得多。
4.4 连续与缺失值
4.4.1 连续值处理
之前讨论的是基于离散属性生成决策树,现在讨论连续值(回归)问题。最简单的策略就是采用二分法对连续属性进行处理。
给定样本集D和连续属性a,假定属性a在D上有n个取值,并且将取值从小到大排序,记为
{}。二分法的思想就是设定一个划分点t,将D划分为两个子集
和
,
是包含哪些在属性a上取值不大于t的样本,是包含那些在属性A上取值大于t的样本,因为t取在
和
之间的任意一点所产生的的划分效果都是一样的,我们不妨让
。基于这种划分方法,划分点t共有n-1个候选点,该候选划分点集合为
,对这n-1个划分点对应进行考察,选取最优的划分点。
其中Gain(D,a,t)是样本集D基于划分点t二分后的信息增益。于是,我们就可选择使Gain(D,a,t)最大化的划分点。
将当前属性集中所有的属性和划分点对应的信息增益求出,就可以选择获得最大信息增益的属性及其划分点来划分当前结点。
需注意的是,与离散属性不同,若当前结点划分属性为连续属性,该属性还可作为其后代结点的划分属性。
4.4.2 缺失值处理
如果缺失属性样本较多的话,并且不做任何处理,简单的放弃不完整样本的话,显然对数据信息是极其浪费的。样本不能放弃,但是属性缺失我们不得不放弃,因为本身就缺失,我们不可能凭空随便插入一个值,所以我们只能在划分过程中进行处理,减小划分误差。总的来说需要我们考虑的问题有两个:
(1)如何在属性值缺失的情况下进行划分属性选择?
(2)给定划分属性,若样本在该属性上的值缺失,如何对样本进行划分?
我们为每个样本x赋予一个权重,并定义
表示无缺失值样本所占的比例,
表示无缺失值样本中第k类所占的比例,
表示无缺失值样本中属性a上取值为
的样本所占的比例。
对于(1):通过在样本集D中选取在属性α上没有缺失值的样本子集,计算在该样本子集上的信息增益,最终的信息增益等于该样本子集划分后信息增益乘以样本子集占样本集的比重。即:
对于(2):若该样本子集在属性α上的值缺失,则将该样本以不同的权重(即每个分支所含样本比例)划入到所有分支节点中。即让同一样本以不同概率划入到不同子结点当中去。
4.5 多变量决策树
把每个属性视为坐标空间中的一个坐标轴,则d个属性描述的样本就对应了d维空间中的一个数据点,对样本分类则意味着在坐标空间中寻找分类边界,且分类边界均与坐标轴平行。
虽然轴平行的分类边界有很好的解释性,但在实际运用中,真实分类边界比较复杂时,必须使用很多段才能获得较好的近似,此时决策树会很复杂,预测时间开销会很大,故可以进行斜的边界划分,即在每个非叶结点对属性的线性组合进行测试而不是测试单个属性,多变量决策树(multivariate decision tree)就是这样为每个非叶结点建立一个合适的线性分类器。
总结
参考博客
https://blog.csdn.net/black_shuang/article/details/80666520