硬件环境
完整代码:https://download.csdn.net/download/pythonyanyan/87390405
LenovoLegionY7000P2020H(16GBDDR4),IntelCorei7‐10750H
Windows10,Chineseversion
软件环境
VisualStudioCode1.55.2
实验目的
利用已有的数据集 winedata 实现决策树
利用 k=10 折交叉验证评估决策树
决策树可视化
实验记录
1C4.5 决策树
C4.5 算法是用于生成决策树的一种经典算法,是 ID3 算法的一种延伸和优化。
C4.5 算法对 ID3 算法主要做了一下几点改进:
1.通过信息增益率选择分裂属性,克服了 ID3 算法中通过信息增益倾向于选择拥有多个属性值的属性作为分裂属性的不足。
2.能够处理离散型和连续型的属性类型,即将连续型的属性进行离散化处理。
3.构造决策树之后进行剪枝操作。
4.能够处理具有缺失属性值的训练数据。
通过读取 ex6Data.csv 的数据,可以发现 11 个特征均为连续型属性,且整体数据量庞大需要剪枝操作,因此本次实验选用 C4.5 决策树是十分合适的。
1.1 分裂属性的选择:信息增益率
分裂属性选择的评判标准是决策树算法之间的根本区别。区别于 ID3 算法通过信息增益选择分裂属性,C4.5 算法通过信息增益率选择分裂属性。
设 D 是类标记元组训练集,类标号属性具有 m 个不同值,m 个不同类 Ci,i=1,2,.....,m,D 是 D 中 C'类的元组的集合,|D| 和 |C'D| 分别是是 D 和 C'D 中的元组个数,对于一个数据集合 D,其信息熵是
现在假定按照属性 A 划分 D 中的元组,划分为 V 的不同的类,新的信息熵为
由此得到按照属性 A 划分 D 所获得的信息增益为原熵与新熵之差
信息增益率使用“分裂信息”值将信息增益规范化。分类信息类似于 Info*(*D),定义为
由此定义信息增益率为
过上述计算,最终选择具有最大信息增益率的属性作为分裂属性。
(a)熵
(b)信息增益
1.2 连续型属性的离散化处理
当属性类型为离散型,无须对数据进行离散化处理;当属性类型为连续型,则需要对数据进行离散化处理。
C4.5 算法针对连续属性的离散化处理的核心思想是:
1.将属性 A 的 N 个属性值按照升序排列,得到属性 A 的属性值取值序列
2.在序列
中共有 N1 种二分方法,产生 N1 种分隔阈值,对于第 i 种二分方法,其阈值
,它将该节点上的数据集划分为 2 个子数据集
3.计算每种划分方法对应的信息增益,选取信息增益最大的划分方法的阈值作为属性 A 二分的阈值。
1.3 剪枝
由于决策树的建立完全是依赖于训练样本,因此该决策树对训练样本能够产生完美的拟合效果。但这样的决策树对于测试样本来说过于庞大而复杂,可能产生较高的分类错误率。这种现象就称为过拟合。因此需要将复杂的决策树进行简化,即去掉一些节点解决过拟合问题,这个过程称为剪枝。剪枝方法分为预剪枝和后剪枝两大类。预剪枝是在构建决策树的过程中,提前终止决策树的生长,从而避免过多的节点产生。预剪枝方法虽然简单但实用性不强,因为很难精确的判断何时终止树的生长。后剪枝是在决策树构建完成之后,对那些置信度不达标的节点子树用叶子结点代替,该叶子结点的类标号用该节点子树中频率最高的类标记。
2 K 折交叉验证
将训练集数据划分为 K 部分,利用其中的 K**1 份做为训练,剩余的一份作为测试,最后取平均测试误差做为泛化误差。K 折交叉验证利用了无重复抽样技术的好处:每次迭代过程中每个样本点只有一次被划入训练集或测试集的机会。
3 可视化决策树
由于我个人的决策树实现不能像 sklearn 库中的那么完美,最终成型的决策树过于庞大, 但是经过 10 折交叉验证,准确率有 83%
结论与分析
C4.5 决策树算法优缺点分析
优点:
- 通过信息增益率选择分裂属性,克服了 ID3 算法中通过信息增益倾向于选择拥有多个 属性值的属性作为分裂属性的不足。
2.能够处理离散型和连续型的属性类型,即将连续型的属性进行离散化处理。
3.构造决策树之后进行剪枝操作。
- 能够处理具有缺失属性值的训练数据
缺点:
- 算法的计算效率较低,特别是针对含有连续属性值的训练样本时表现的尤为突出。
- 算法在选择分裂属性时没有考虑到条件属性间的相关性,只计算数据集中每一个条件 属性与决策属性之间的期望信息,有可能影响到属性选择的正确性。