《老饼讲解机器学习》https://www.bbbdata.com/text/10
目录
能来看算法原理的,估计都对决策树有一些初步理解了。
决策树算法原理其实非常简单, 但由于网上杂文过多,往往把概念弄得非常混乱,造成原理理解困难。
本文对原理进行简单介绍与梳理 。
一. 学习决策树原理的顺序
决策树算法有CART,ID3,C4.5 几种,如果把多种算法原理概念混在一起,必然很难理解。
思想起源来自于ID3,所以一般会先介绍ID3,但我建议不要从ID3入手,学习路线线最好如下安排:
理解CART分类树---->理解CART回归树--->理解ID3算法---->理解C4.5算法。
为什么先理解CART分类树
(1) matlab,python的sklearn都只实现CART算法,没有ID3,C4.5算法。
(2)CART和ID3(c4.5)是两条支线。现在人们所说的决策树,现在基本都是暗指CART,而非ID3,C4.5,所以没有必要纠结着ID3,C4.5不放。
重要的事说三遍, 先理解CART,先理解CART,先理解CART,再理解ID3,C4.5。
CART更加成熟,更加合理,更加实用,更加容易理解,越不成熟,越不合理的东西越难理解。
(3)CART(classification and regression tree)望文思义就是分类与回归树,使用得更多的是分类树,而回归树是在分类树的基础上的改动成适用于回归问题。
二.CART分类树
(一)分类树模型结构
CART分类树的结构就是一棵二叉树,每个节点有一个变量与一个判断值,该变量<=值,则判为左节点,否则为右节点。
树的训练则是指构建这样一棵树,使它能够较好的预测新样本。
(二).分类树构建过程
构建过程是逐节点构建的方式,直到所有样本都分配到叶子节点,即完成树的构建。
构建树的核心问题是:
(1)节点是作为叶子,还是继续分裂(即叶子准则)。
(2)如果分裂,该选择哪个变量作为判断值,变量的阈值是多少。
(3)叶子节点的所属类别是哪个。
所以,构建树是一个while循环过程,例如一开始根节点是150个样本,则开始while循环,
如图所示,根据分裂准则,确定了变量与阈值,则可把根节点分为左右两个子节点,假设现在50个分配到左节点,100个分配到右节点。
再根据叶子准则,判断到左节点是叶子,不再分裂。右节点不是叶子,则继续把这100个样本分裂...直到所有样本都落在叶子节点。
现在,只要确定以上三个核心问题即可。
1.叶子准则
(1) 节点样本<min_samples_split则作为叶子
(2) 超过了树分枝最大深度max_depth,则作为叶子
(3) 其它类似的条件。2.确定节点变量与阈值
分裂选择哪个变量,和阈值是多少?
这个问题极其简单,先定一个分裂收益评估函数,把所有变量和阈值的可能组合都代进去算一遍,哪个收益大,就用哪组[变量,阈值],
怎么比较哪种分裂效果更好?主要评估子节点的清晰度。如果左节点上全是A类,那左节点就很清晰了。如果左节点上A,B两类各占50%,那就还不是很明朗。
也即是,从节点中任意抽取两个样本,这两个样本不属同一类的概率
(这概率的怎么来的后面会放链接)越小说明节点分得越清晰,这个概率称为基尼系数(GINI)。
分裂后有左右两个节点,取两个节点的加权概率即可
G越小,就代表分得越清晰。(如果是定义收益函数,收益函数需要越大越好,则取上式相反数)
通过比较每种分裂的GINI系数,最后取GINI系数(即在左/右节点随机抽两个样本,两个样本不属同一类的概率)最小的分裂对应的[特征-阈值] 即可。3.叶子节点类别判定
叶子节点上的样本,哪类样本最多,叶子就属于哪一类。
在构建完树后,预测时只要判断新样本落在哪个叶子,就预测为哪一类。
至此,CART回归树的建树原理就结束了。
(二).剪枝(防止过拟合)
剪枝分为预剪枝和后剪枝,
1.预剪枝
预剪枝就是在构建树过程设定一个条件,防止节点分度分裂,好家伙,其实就是叶子准则,设严此,就是预剪枝了。2.后剪枝
后剪枝就是在树构建完后再剪掉一些叶子节点。通常使用的是CCP(Cost Complexity Pruning)后剪枝法。
损失函数定义为树的代价+复杂度:其中
:叶子节点个数
:所有样本个数
:第 i 个叶子节点上的样本数
: 第i个叶子节点的损失函数(常用的有:错误占比,GINI系数,和熵。)
α :待定系数,用于惩罚节点个数,引导模型用更少的节点。然后根据损失函数进行剪枝,使 L最小。
后剪枝是使用者的后期操作,所以程序一般只提供一条 \alphaα的所有可能取值,与对应的叶子加权损失函数的值,供使用者自行选择α 。
具体计算方法参考《决策树后剪枝原理:CCP剪枝法》。
三. CART回归树模型
决策树用于回归
回归与分类的不同,在于回归的输出变量y为连续数值变量。
整体算法类似于分类树,关键有以下两点修改:
(1)叶子节点输出的不是类别,而是节点上所有y的均值。
(2)构树过程中节点分割评估不用基尼指数,改用 平方差
至此,CART回归树也就讲完了。信息熵呢?信息增益比呢?怎么没有讲?那是ID3,C4.5的概念。所以说不要混在一起~!
四. ID3算法
ID3与CART分类树的差异:
1.树结构不同:ID3决策树模型也是一棵树。输入变量必须全是枚举型。每个节点选择一个变量,按该变量所有可能取值分叉。
2.输入变量不同:CART是连续变量,用阈值切割,而ID3输入变量必须全是枚举型。按变量所有可能取值分叉。
3.分叉依据不同:ID3是全分叉,因此没有阈值一说,仅需比较不同变量的分叉质量即可。
分叉依据的是信息增益(Gain):
: 分叉子节点个数
: 所有子节点的总样本数(也即父节点的样本数)
: 第 i 个子节点上样本个数
:第 i 个子节点上第k类样本的个数
:父节点上第 k 类样本的个数
其中称为熵。
4.没有剪枝:对,ID3是较原始的一个算法,没有剪枝。
五.C4.5算法
C4.5就是对ID3的补充,就是对ID3打补丁
(一) ID3的缺陷
(1)变量偏好多枚举值:
ID3更偏好优先分叉枚举值多的变量。因为ID3用信息增益评估分叉质量,该评估函数会更偏好枚举值多的变量。
(如果变量A有2个枚举,B有10个枚举,肯定就偏好B了,因为B一下子把节点分叉成10个子节点,而A只分成2个子节点。分成10个子节点的确定性肯定比2个会更强些。)
(2) ID3容易过拟合。
(3) ID3不支持连续变量。
(4) 不支持数据有缺失值。
(二) C4.5打上补丁
(1) 变量偏好纠正:使用信息增益比
信息增益比:
分子就是ID3中的信息增益, 分母则是全体样本中变量v的熵
分母符号说明:
: 全体样本(划重点,是全体样本)变量v的枚举个数
: 全体样本个数。
:全体样本变量v第k个枚举值的样本个数。
(2) 过拟合处理:添加剪枝
剪枝方法就是CART中所说的CCP,与CART不同的是,损失函数中节点的损失用熵函数,而不是GINI。
(3) 连续变量处理:与CART类似。
(4)变量有缺失值的处理:很复杂和别扭。
六.决策树演进与对比
1.树结构:ID3不是二叉树,C4.5在输入是连续变量时是二叉树,CART一定是二叉树。非二叉树都可以用二叉树替代,统一用二叉树更加简单优雅。
2.分裂依据:ID3分裂时用熵,C4.5用熵增益,CART用GINI。GINI很容易理解,就是抽出两个样本不属同一类的概率。GINI没有log,计算也方便。(熵也可迁移到CART中用,但CART更偏向用GINI)。
3.特征数据类型:ID3的输入变量是枚举类型,C4.5是枚举与数值兼容,CART是数值类型。完全抛弃了枚举,是因为枚举型问题可以转化为数值类型问题。
4.缺失值支持:ID3不支持缺失值,C4.5支持缺失值,CART不支持缺失值。最后抛弃了缺失值的兼容,是缺失值处理极其复杂与不够优雅。统一在入模前把缺失问题处理,更加清晰,可控。
5.剪枝:ID3没有剪枝,C4.5有剪枝,CART有剪枝。
备注:一般软件包(python,matlab)只支持CART,不支持ID3,C4.5
相关文章