为什么id3和c4.5采用多叉树而cart采用二叉树?
ID3 和 C4.5 采用的多叉树虽然在对训练样本集的学习中可以尽可能多地挖掘信息,但是其生成的决策树分支、规模都比较大,训练特别慢,CART 算法的二分法可以简化决策树的规模,提高生成决策树的效率。
决策树优点
可解释性
训练和测试快
特征类型
数值特征:离散特征和连续特征。连续特征的划分只能划分为二叉形式(二分法),离散特征的划分可以划分为二叉(=)或多叉(> <)
类别特征:取值不为数值,类别很少时,用one-hot,但是类别很多时(比如身份证),用one-hot会导致切分的子树及其不平衡,统计信息不准确,划分没意义,增益几乎为0。lightgbm对类别特征支持比较好。
剪枝方法
先剪枝
1 最大高度
2 叶子节点最小样本数
3 叶子节点属于同一类
4 增益最小阈值
5 所有特征都已经用于分割
缺点:它是基于“贪心”策略,会带来欠拟合风险。先剪枝有可能会过早停止决策树的生长,而继续生成有可能模型效果更好。
后剪枝
优缺点:后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树。但同时其训练时间会大的多。
由完全成长的树剪去子树而形成。通过删除节点的分枝并用树叶来替换它。树叶一般用子树中最频繁的类别来标记。可以在训练集(悲观剪枝)或测试集或交叉验证集上来剪枝过后准确率有所提升,则进行剪枝。 相比于预剪枝,后剪枝方法通常可以得到泛化能力更强的决策树,但时间开销会更大。
id3
连续特征
不能处理连续特征,只能处理离散特征,根据离散特征的取值将结点分为多叉。
信息熵
信息熵对属性值很多的属性有偏好,比如身份证id,分裂后每个节点只有一个样本,条件熵为0。其中,条件熵包含权重(否则有可能偏向不平衡划分,不平衡的划分没意义,比如一个节点10000多个样本,一个节点3个样本,相当于没有划分)
缺点:
没有剪枝策略,容易过拟合
信息增益对取值较多的属性有偏好(会导致分支数变多,每个分支的样本数量减少,模型变复杂,容易过拟合)
不能处理离散分布的特征
没有对缺失值进行妥善处理(直接丢弃会导致损失大量信息)
只能用于分类问题而不能用于回归问题(信息熵只能对分类问题算)
二叉树效率低
熵模型有大量的对数运算,很耗时间
c4.5
也是多叉树,不过可以处理连续特征
处理连续特征
在id3点基础上进行改进,可以处理连续特征,排序后取相邻样本值的均值作为待选切分点,寻找最优切分点,同时该连续属性也可以作为后代结点的划分属性,比如父节点上使用了“密度小于等于0.381”,不会禁止在左子节点上使用“密度小于等于0.294”的。值得注意的是,将连续特征作为切分点,则只有两个子节点。
信息增益率
信息增益率 = 信息增益/属性熵(计算公式和信息熵一致),对取值少的属性有偏好(导致分支变少,容易欠拟合),为了解决这个问题,c4.5先将信息增益小于平均水平的属性丢弃掉(偏好属性取值较多的),然后再选择信息增益率最大的(偏好属性取值较少的),这样的话两方面都有了兼顾。
缺失值处理:概率权重的方法
- 对于缺失值的处理可以分为两个子问题:1. 在特征值缺失的情况下进行划分特征的选择?(即如何计算特征的信息增益率)2. 选定该划分特征,对于缺失该特征值的样本如何处理?(即到底把这个样本划分到哪个结点里)
- 针对问题一,C4.5 的做法是:对于具有缺失值特征,用没有缺失的样本子集所占比重来折算对应的信息增益;
- 针对问题二,C4.5 的做法是:将缺失样本同时划分到所有子节点,不过要调整样本的权重值,其实也就是以不同概率划分到不同节点中。
- 测试时遇到缺失值则探索所有可能的分类结果并把所有结果结合起来考虑。这样,会存在多个路径,分类结果将是类别的分布而不是某一类别,从而选择概率最高的类别作为预测类别。
机器学习笔记(7)——C4.5决策树中的缺失值处理_c4.5处理缺失值_赵赵赵颖的博客-CSDN博客
剪枝
为什么要剪枝,没剪枝的树很容易过拟合,泛化性能很差。剪枝一般分为先剪枝和后剪枝。
c4.5采用悲观剪枝(Pessimistic Error Pruning)的方法,即认为所有节点都纯净,都需要剪枝,所以至上而下
利用训练集合,至上而下(不包括根节点和叶子节点),比较剪枝前后的误分类率和置信度来决定是否剪枝(包含对叶子节点的正则项)。当进行剪枝时,如果剪枝后的正确率比不剪枝的正确率低,但是差距不是很大,那么也可以进行剪枝。c4.5使用了标准差来计算未剪枝前的置信度。标准差反映了数据的离散程度,标准差越大,数据波动性越大,置信度就越低。
决策树算法--C4.5算法 - 知乎
优点
改善了id3中信息增益对取值比较多的属性的偏好问题
支持对缺失值的处理
可以处理连续值属性
可以剪枝,防止过拟合
缺点
二叉树效率低
只能分类不能回归
熵模型有大量的对数运算,很耗时间;连续值还有排序运算;排序时需要数据集常驻内存,训练集合太大时容易爆内存。
cart
同c4.5,可以处理连续特征和离散特征,不过是二叉树。采用分裂后基尼系数(分类树)/误差的平方(回归树)最小的那个分割点。
基尼系数的意义
从数据集D中随机抽取两个样本,其类别不同的概率。直觉地,基尼指数越小,则数据集D的纯度越高。采用基尼系数的原因是可以衡量数据集的纯度并且运算简单,不用复杂的对数运算。
剪枝(较难)
至下而上,从底端不断剪枝,过程中的树生成一个树集合,用交叉验证的方法对树集合进行测试,从而选择最优的子树。
CART生成与剪枝算法 – 月来客栈
缺失值处理:概率权重和代理特征分割
- 对于缺失值的处理可以分为两个子问题:1. 在特征值缺失的情况下进行划分特征的选择?(即如何计算特征的信息增益率)2. 选定该划分特征,对于缺失该特征值的样本如何处理?(即到底把这个样本划分到哪个结点里)
- 针对问题一,Cart 的做法是:对于具有缺失值特征,用没有缺失的样本子集所占比重来折算对应的信息增益;
- 针对问题二,Cart的做法是:按照选取的特征进行分裂并遇到缺失值时那么我们需要遍历剩余的特征,剩余的特征中如果有也存在缺失值的特征,那么这些特征忽略,仅仅在完全没有缺失值的特征上进行选择,我们选择其中能够与最佳增益的缺失特征分裂之后增益最接近的特征进行分裂,当 CART 树中遇到缺失值时,这个实例划分到左边还是右边是决定于其排名最高的代理,如果这个代理的值也缺失了,那么就使用排名第二的代理,以此类推,如果所有代理值都缺失,那么默认规则就是把样本划分到较大的那个子节点。
- 对测试中存在的缺失值处理方式存疑。
优点
既能处理分类问题也能处理回归问题
基尼系数大大减少了计算量
可以处理缺失值
可以剪枝
使用二叉树而不是多叉树可以缓解过拟合
lightgbm和xgboost都是将有缺失值的样本分配给增益最大的节点,测试时,如果在训练集中有相同的分割,则和训练集一样,如果没有,那么默认将有缺失值的样本分割左节点。