持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情
大连海事大学机器学习C4.5决策树实验:实现基本的C4.5提升算法。C4.5是一个基本的决策树分类算法,对于树模型的理解入门有一些参考价值。
一. 算法描述
C4.5算法基本思想:
1. 计算类别信息熵
类别信息熵表示的是所有样本中各种类别出现的不确定性之和。根据信息熵的概念,熵越大,不确定性就越大,把事情搞清楚所需要的信息量就越多。
2. 计算每个属性的 条件 熵
每个属性的信息熵相当于一种条件熵。他表示的是在某种属性的条件下,各种类别出现的不确定性之和。属性的信息熵越大,表示这个属性中拥有的样本类别越复杂。
3. 计算增益
信息增益的 = 类别信息熵 - 属性条件熵,它表示的是信息不确定性减少的程度。如果一个属性的信息增益越大,就表示用这个属性进行样本划分可以更好的减少划分后样本的不确定性,当然,选择该属性就可以更快更好地完成我们的分类目标。
4.计算属性分裂信息度量
用分裂信息度量来考虑某种属性进行分裂时分支的数量信息和尺寸信息,我们把这些信息称为属性的内在信息。计算流程等同于计算类别信息熵。
5.计算信息增益率
信息增益率=信息增益 / 分裂信息度量 ,这样会使属性的重要性随着内在信息的增大而减小(也就是说,如果这个属性本身不确定性就很大,那我就越不倾向于选取它),这样算是对单纯用信息增益有所补偿。
while (当前节点未到达叶子节点)
(1)计算当前节点的类别信息熵Info(D) (以类别取值计算)
(2)计算当前节点各个属性的信息熵Info(Ai) (以属性取值下的类别取值计算)
(3)计算各个属性的信息增益Gain(Ai)=Info(D)-Info(Ai)
(4)计算各个属性的分类信息度量H(Ai) (以属性取值计算)
(5)计算各个属性的信息增益率IGR(Ai)=Gain(Ai)/H(Ai)
end while
当前节点设置为叶子节点
二. 数据描述
数据类别标签为离散数值,属性值为连续数值。
实验所用五个数据集维度分别为:
| liver | 345 *7 |
|---|---|
| iris | 150*5 |
| glasss | 214*10 |
| heart | 270*14 |
| cleveland | 297*14 |
三. 实验流程
1. 数据集连续值的离散化:
对每个属性的各值进行遍历,并以其为阈值进行划分并计算信息增益,选择信息增益最大的阈值进行数据离散化。为了方便后续的处理将其转换为csv文件。
2. 读取数据并将类别标签和属性值分别存入lables,data列表
3. 计算标签决定属性的信息熵:
4. 计算各个属性的条件熵,并求其信息增益
条件熵:
信息增益:
5. 计算分裂信息量并求信息增益率:
6. 找出信息增益率最大的属性作为决策树的下一节点:
7. 选出此属性的下的各个类别并进行筛选,然后开始递归:
8.如果达到叶子节点,或者属性遍历完毕强制达到叶子节点。
四. 实验结果
对五个数据集进行C4.5构建决策树规则后计算正确率,结果如图:
| 数据集 | 准确率 |
|---|---|
| liver | 0.7130434782608696 |
| iris | 0.7333333333333333 |
| glasss | 0.7710280373831776 |
| heart | 0.9814814814814815 |
| cleveland | 0.9629629629629629 |
五. 讨论
通过实验结果我们可以发现决策树C4.5算法对于很多数据集来说表现并不好,只有70多的准确率。但是对于后两个数据集准确率确实惊人的高,表现非常亮眼。
数据集维度与准确率:
| 数据集 | 维度 | 准确率 |
|---|---|---|
| liver | 345 *7 | 0.7130434782608696 |
| iris | 150*5 | 0.7333333333333333 |
| glasss | 214*10 | 0.7710280373831776 |
| heart | 270*14 | 0.9814814814814815 |
| cleveland | 297*14 | 0.9629629629629629 |
通过对实验的五个数据集维度与准确率的比对发现,数据集的属性越多(列数)决策树相应的准确率会有一定的提升,但是数据集的数据越多其表现效果反而会有一定的下降。