缺失值处理是C4.5决策树算法中的又一个重要部分,前面已经讨论过连续值和剪枝的处理方法:
机器学习笔记(5)——C4.5决策树中的连续值处理和Python实现
机器学习笔记(6)——C4.5决策树中的剪枝处理和Python实现
现实任务中,通常会遇到大量不完整的样本,如果直接放弃不完整样本,对数据是极大的浪费,例如下面这个有缺失值的西瓜样本集,只有4个完整样本。
在构造决策树时,处理含有缺失值的样本的时候,需要解决两个问题:
(1)如何在属性值缺失的情况下选择最优划分属性?
(2)选定了划分属性,若样本在该属性上的值是缺失的,那么该如何对这个样本进行划分?
以上两个问题在周志华老师的《机器学习》书中有详细的讲解。但是还有一个问题:
(3)决策树构造完成后,如果测试样本的属性值不完整,该如何确定该样本的类别?
书中没有介绍,好在昆兰在1993年发表的文章中提供了解决方案。下面我们对以上3个问题逐一讨论。
1. 选择最优划分属性
之前的算法中,我们选择信息增益最大的属性作为最优划分属性,那么对于有缺失值的属性,其信息增益就是无缺失值样本所占的比例乘以无缺失值样本子集的信息增益。
其中是属性a上无缺失值样本所占的比例;
是属性a上无缺失值的样本子集。回顾一下ID3算法中,信息增益的计算方法:
色泽:
另分别表示“色泽”属性上取值为“青绿”、“乌黑”、“浅白”的样本子集。
同样可以计算出其他几个属性的信息增益:
属性 | 色泽 | 根蒂 | 敲声 | 纹理 | 脐部 | 触感 |
信息增益 | 0.252 | 0.171 | 0.145 | 0.424 | 0.289 | 0.006 |
因此,选择“纹理”作为根节点进行划分。编号为{1,2,3,4,5,6,15}的7个样本进入“纹理=清晰”的分支,编号为{7,9,13,14,17}的5个样本进入“纹理=稍糊”的分支,编号为{11,12,16}的3个样本进入“纹理=模糊”的分支。
那么选定了划分属性,若样本在该属性上的值是缺失的,那么该如何对这个样本进行划分?(也就是问题2)
重点来了:对于编号为8和10的缺失值样本,将分别以7/15、5/15、3/15的权重划分到以上3个分支。也就是说,将缺失值样本按不同的概率划分到了所有分支中,而概率则等于无缺失值样本在每个分支中所占的比例。
这里引入了权重的概念,在学习开始时,样本的默认权重为1,对于无缺失值的样本,划分到子节点时其权重保持不变。
样本有了权重&