机器学习之决策树(ID3,C4.5,CART)

https://zhuanlan.zhihu.com/p/85731206

目录

1 ID3算法

 ID3优缺点

2 C4.5算法

C4.5相比ID3进行的改进有如下4点:

 C4.5优缺点

3 CART算法

算法步骤

CART树在C4.5基础上进行了如下改进:

优缺点

4. 总结,三者对比


什么是决策树呢?决策树是一种监督学习方法,既可以用来处理分类问题也可以处理回归问题。

决策树的学习过程包括:特征选择、决策树生成、决策树剪枝 。

1 ID3算法

 

ID3使用信息增益作为特征选择的度量,使用自顶向下的贪心算法遍历决策树空间。具体的:

  1. 计算数据集合的信息熵,以及各个特征的条件熵。选择信息增益最大的作为本次划分节点。
  2. 删除上一步使用的特征,更新各个分支的数据集和特征集。
  3. 重复1,2步,知道子集包含单一特征,则为分支叶结点。

ID3使用信息增益作为特征选择的度量。那么什么是信息增益呢?信息增益表示得知特征 A 的信息而使得样本集合不确定性减少的程度。

信息增益 = 信息熵 - 条件熵:

 

如果信息增益越大,那么就是指分完之后的信息熵越小,那也就意味着分完之后的数据趋向于有序,而越有序的数据,意味着我们能更好地预测数据

 ID3优缺点

  • ID3算法没有进行决策树剪枝,容易发生过拟合
  • ID3算法没有给出处理连续数据的方法,只能处理离散特征
  • ID3算法不能处理带有缺失值的数据集,需对数据集中的缺失值进行预处理
  • 信息增益准则对可取值数目较多的特征有所偏好,类似“编号”的特征其信息增益接近于 1(信息增益反映的给定一个条件以后不确定性减少的程度,必然是分得越细的数据集确定性更高,也就是条件熵越小,信息增益越大)

2 C4.5算法

C4.5主要是克服ID3使用信息增益进行特征划分对取值数据较多特征有偏好的缺点。使用信息增益率进行特征划分。

C4.5相比ID3进行的改进有如下4点

  • 引入剪枝策略,使用悲观剪枝策略进行后剪枝
  • 使用信息增益率代替信息增益,作为特征划分标准
  • 连续特征离散化
    • 需要处理的样本或样本子集按照连续变量的大小从小到大进行排序
    • 假设该属性对应的不同的属性值一共有N个,那么总共有N−1个可能的候选分割阈值点,每个候选的分割阈值点的值为上述排序后的属性值中两两前后连续元素的中点,根据这个分割点把原来连续的属性分成两类
  • 缺失值处理
    • 对于具有缺失值的特征,用没有缺失的样本子集所占比重来折算信息增益率,选择划分特征
    • 选定该划分特征,对于缺失该特征值的样本,将样本以不同的概率划分到不同子节点

使用信息增益率,信息增益率表示如下:

Ha(D) 称为特a征 A 的固有值。

决策树剪枝的目的是为了防止过拟合。

C4.5采用后剪枝对决策树进行剪枝。具体方法为:

在决策树构造完成后,自底向上对非叶节点进行评估,如果将其换成叶节点能提升泛化性能,则将该子树换成叶节点。后剪枝决策树欠拟合风险很小,泛化性能往往优于预剪枝决策树。但训练时间会大很多。

 C4.5优缺点

  • C4.5只能用于分类
  • C4.5 在构造树的过程中,对数值属性值需要按照其大小进行排序,从中选择一个分割点,所以只适合于能够驻留于内存的数据集,当训练集大得无法在内存容纳时,程序无法运行。
  • 在构造树的过程中,需要对数据集进行多次的顺序扫描和排序,算法低效。

3 CART算法

相比ID3和C4.5算法,CART算法使用二叉树简化决策树规模,提高生成决策树效率。

D3中使用了信息增益选择特征,增益大优先选择。C4.5中,采用信息增益比选择特征,减少因特征值多导致信息增益大的问题。CART分类树算法使用基尼系数来代替信息增益比,基尼系数代表了模型的不纯度,基尼系数越小,不纯度越低,特征越好。这和信息增益(比)相反。

CART分类树建立算法流程,之所以加上建立,是因为CART分类树算法有剪枝算法流程。

算法步骤

  算法输入训练集D,基尼系数的阈值,样本个数阈值。

  输出的是决策树T。

  算法从根节点开始,用训练集递归建立CART分类树。

  (1)、对于当前节点的数据集为D,如果样本个数小于阈值或没有特征,则返回决策子树,当前节点停止递归。

  (2)、计算样本集D的基尼系数,如果基尼系数小于阈值,则返回决策树子树,当前节点停止递归。

  (3)、计算当前节点现有的各个特征的各个特征值对数据集D的基尼系数,对于离散值和连续值的处理方法和基尼系数的计算见第二节。缺失值的处理方法和C4.5算法里描述的相同。

  (4)、在计算出来的各个特征的各个特征值对数据集D的基尼系数中,选择基尼系数最小的特征A和对应的特征值a。根据这个最优特征和最优特征值,把数据集划分成两部分D1和D2,同时建立当前节点的左右节点,做节点的数据集D为D1,右节点的数据集D为D2。

  (5)、对左右的子节点递归的调用1-4步,生成决策树。

  对生成的决策树做预测的时候,假如测试集里的样本A落到了某个叶子节点,而节点里有多个训练样本。则对于A的类别预测采用的是这个叶子节点里概率最大的类别。

CART树在C4.5基础上进行了如下改进:

  • CART使用二叉树来代替C4.5的多叉树,提高了生成决策树效率
  • C4.5只能用于分类,CART树可用于分类和回归
  • CART 使用 Gini 系数作为变量的不纯度量,减少了大量的对数运算
  • CART 采用代理测试来估计缺失值,而 C4.5 以不同概率划分到不同节点中
  • CART 采用“基于代价复杂度剪枝”方法进行剪枝,而 C4.5 采用悲观剪枝方法
  • ID3 和 C4.5 层级之间只使用一次特征,CART 可多次重复使用特征

优缺点

(1)、无论ID3,C4.5,CART都是选择一个最优的特征做分类决策,但大多数,分类决策不是由某一个特征决定,而是一组特征。这样得到的决策树更加准确,这种决策树叫多变量决策树(multi-variate decision tree)。在选择最优特征的时,多变量决策树不是选择某一个最优特征,而是选择一个最优的特征线性组合做决策。代表算法OC1。

(2)、样本一点点改动,树结构剧烈改变。这个通过集成学习里面的随机森林之类的方法解决。

 

4. 总结,三者对比

最后通过总结的方式对比下 ID3、C4.5 和 CART 三者之间的差异。

除了之前列出来的划分标准、剪枝策略、连续值确实值处理方式等之外,我再介绍一些其他差异:

  • 划分标准的差异:ID3 使用信息增益偏向特征值多的特征,C4.5 使用信息增益率克服信息增益的缺点,偏向于特征值小的特征,CART 使用基尼指数克服 C4.5 需要求 log 的巨大计算量,偏向于特征值较多的特征。
  • 使用场景的差异:ID3 和 C4.5 都只能用于分类问题,CART 可以用于分类和回归问题;ID3 和 C4.5 是多叉树,速度较慢,CART 是二叉树,计算速度很快;
  • 样本数据的差异:ID3 只能处理离散数据且缺失值敏感,C4.5 和 CART 可以处理连续性数据且有多种方式处理缺失值;从样本量考虑的话,小样本建议 C4.5、大样本建议 CART。C4.5 处理过程中需对数据集进行多次扫描排序,处理成本耗时较高,而 CART 本身是一种大样本的统计方法,小样本处理下泛化误差较大 ;
  • 样本特征的差异:ID3 和 C4.5 层级之间只使用一次特征,CART 可多次重复使用特征;
  • 剪枝策略的差异:ID3 没有剪枝策略,C4.5 是通过悲观剪枝策略来修正树的准确性,而 CART 是通过代价复杂度剪枝。
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
决策树是一种常见的机器学习算法,其中ID3C4.5和CART是三种常见的决策树分类算法。下面是它们的Python代码介绍: 1. ID3算法代码: ``` def ID3(data, labels): # 计算数据集的信息熵 entropy = calcEntropy(data) # 如果数据集的信息熵为0,则直接返回该数据集的类别 if entropy == 0: return data[0][-1] # 如果特征集为空,则返回数据集中出现次数最多的类别 if len(labels) == 0: return majorityClass(data) # 选择最优划分特征 bestFeature = chooseBestFeature(data, labels) # 根据最优特征生成决策树 decisionTree = {bestFeature: {}} # 从特征集中删除已经使用的特征 labels.remove(bestFeature) # 获取最优特征的所有取值 featureValues = set([example[bestFeature] for example in data]) # 遍历最优特征的所有取值,生成子树 for value in featureValues: subLabels = labels[:] decisionTree[bestFeature][value] = ID3(splitData(data, bestFeature, value), subLabels) return decisionTree ``` 2. C4.5算法代码: ``` def C45(data, labels): # 计算数据集的信息熵 entropy = calcEntropy(data) # 如果数据集的信息熵为0,则直接返回该数据集的类别 if entropy == 0: return data[0][-1] # 如果特征集为空,则返回数据集中出现次数最多的类别 if len(labels) == 0: return majorityClass(data) # 选择最优划分特征 bestFeature = chooseBestFeature(data, labels) # 根据最优特征生成决策树 decisionTree = {bestFeature: {}} # 从特征集中删除已经使用的特征 labels.remove(bestFeature) # 获取最优特征的所有取值 featureValues = set([example[bestFeature] for example in data]) # 遍历最优特征的所有取值,生成子树 for value in featureValues: subLabels = labels[:] # 计算每个取值的信息增益率 subData = splitData(data, bestFeature, value) ratio = calcRatio(subData, entropy) # 如果信息增益率高于平均水平,则生成子树 if ratio >= averageRatio(data, bestFeature): decisionTree[bestFeature][value] = C45(subData, subLabels) # 否则返回数据集中出现次数最多的类别 else: decisionTree[bestFeature][value] = majorityClass(subData) return decisionTree ``` 3. CART算法代码: ``` def CART(data, labels): # 如果数据集中只有一个类别,则直接返回该类别 if len(set([example[-1] for example in data])) == 1: return data[0][-1] # 如果特征集为空,则返回数据集中出现次数最多的类别 if len(labels) == 0: return majorityClass(data) # 选择最优划分特征 bestFeature, bestValue, bestScore = chooseBestSplit(data) # 根据最优特征生成决策树 decisionTree = {bestFeature: {}} # 从特征集中删除已经使用的特征 labels.remove(bestFeature) # 生成左子树和右子树 leftData = [example for example in data if example[bestFeature] <= bestValue] rightData = [example for example in data if example[bestFeature] > bestValue] decisionTree[bestFeature]['left'] = CART(leftData, labels) decisionTree[bestFeature]['right'] = CART(rightData, labels) return decisionTree ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值