机器学习笔记(7)——C4.5决策树中的缺失值处理

缺失值处理是C4.5决策树算法中的又一个重要部分,前面已经讨论过连续值和剪枝的处理方法:

机器学习笔记(5)——C4.5决策树中的连续值处理和Python实现

机器学习笔记(6)——C4.5决策树中的剪枝处理和Python实现

现实任务中,通常会遇到大量不完整的样本,如果直接放弃不完整样本,对数据是极大的浪费,例如下面这个有缺失值的西瓜样本集,只有4个完整样本。

在构造决策树时,处理含有缺失值的样本的时候,需要解决两个问题:

(1)如何在属性值缺失的情况下选择最优划分属性?

(2)选定了划分属性,若样本在该属性上的值是缺失的,那么该如何对这个样本进行划分?

以上两个问题在周志华老师的《机器学习》书中有详细的讲解。但是还有一个问题:

(3)决策树构造完成后,如果测试样本的属性值不完整,该如何确定该样本的类别?

书中没有介绍,好在昆兰在1993年发表的文章中提供了解决方案。下面我们对以上3个问题逐一讨论。

1. 选择最优划分属性

之前的算法中,我们选择信息增益最大的属性作为最优划分属性,那么对于有缺失值的属性,其信息增益就是无缺失值样本所占的比例乘以无缺失值样本子集的信息增益。

Gain(D,a)=\rho \times Gain(\tilde{D},a)

其中\rho是属性a上无缺失值样本所占的比例;\tilde{D}是属性a上无缺失值的样本子集。回顾一下ID3算法中,信息增益的计算方法:

Ent(D)=-\sum_{k=1}^{|Y|}p_klog_2p_k        Gain(D,a)=Ent(D)-\sum_{v=1}^{V}\frac{|D^v|}{|D|}Ent(D^v)

色泽:

Ent(\tilde{D})=-(\frac{6}{14}log_2\frac{6}{14}+\frac{8}{14}log_2\frac{8}{14})=0.985

\tilde{D}^1,\tilde{D}^2,\tilde{D}^3分别表示“色泽”属性上取值为“青绿”、“乌黑”、“浅白”的样本子集。

Ent(\tilde{D^1})=-(\frac{2}{4}log_2\frac{2}{4}+\frac{2}{4}log_2\frac{2}{4})=1

Ent(\tilde{D^2})=-(\frac{4}{6}log_2\frac{4}{6}+\frac{2}{6}log_2\frac{2}{6})=0.918

Ent(\tilde{D^3})=-(\frac{0}{4}log_2\frac{0}{4}+\frac{4}{4}log_2\frac{4}{4})=0

Gain(\tilde{D},a) = 0.985-\left (\frac{4}{14}\times1+ \frac{6}{14}\times0.918+\frac{4}{14}\times0\right ) = 0.306

Gain(D,a)=\rho \times Gain(\tilde{D},a) = \frac{14}{17}\times0.306=0.252

同样可以计算出其他几个属性的信息增益:

属性色泽根蒂敲声纹理脐部触感
信息增益0.2520.1710.1450.4240.2890.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,对于无缺失值的样本,划分到子节点时其权重保持不变。

样本有了权重,我们需要对信息增益的计算公式做一些改进。

Gain(D,a)=\rho \times Gain(\tilde{D},a)=\rho \times \left ( Ent( \tilde{D} ) -\sum_{v=1}^{V} \tilde{r}_vEnt( \tilde{D}^v ) \right )

Ent(\tilde{D})=-\sum_{k=1}^{|Y|}\tilde{p}_klog_2\tilde{p}_k

\rho =\frac {\sum_{x\in \tilde{D}}w_x }{\sum_{x\in D}w_x}   (无缺失值样本所占的比例,样本的个数按权重w_x来计算)

\tilde{p}_k =\frac {\sum_{x\in \tilde{D}_k}w_x }{\sum_{x\in \tilde{D}}w_x}(无缺失值样本中第k类所占的比例,样本的个数按权重w_x来计算)

\tilde{r}_v =\frac {\sum_{x\in \tilde{D}^v}w_x }{\sum_{x\in \tilde{D}}w_x}(无缺失值样本中属性a上取值为a^v的样本所占的比例,样本个数按权重w_x来计算)

下面我们再以“纹理=清晰”这个分支为例,看看下一步将如何划分:

色泽:

\rho =\frac {\sum_{x\in \tilde{D}}w_x }{\sum_{x\in D}w_x}=\frac{5+2\times\frac{7}{15}}{7+2\times\frac{7}{15}}=0.748

\tilde{p}_1 =\frac {\sum_{x\in \tilde{D}_1}w_x }{\sum_{x\in \tilde{D}}w_x}=\frac{4+\frac{7}{15}}{5+2\times\frac{7}{15}}=0.753    (无缺失值样本中,好瓜的比例)

\tilde{p}_2 =\frac {\sum_{x\in \tilde{D}_2}w_x }{\sum_{x\in \tilde{D}}w_x}=\frac{1+\frac{7}{15}}{5+2\times\frac{7}{15}}=0.247    (无缺失值样本中,坏瓜的比例)

\tilde{r}_1 =\frac {\sum_{x\in \tilde{D}^1}w_x }{\sum_{x\in \tilde{D}}w_x}=\frac{3+\frac{7}{15}}{5+2\times\frac{7}{15}}=0.584    (无缺失值样本中,“色泽=乌黑”的样本的比例)

\tilde{r}_2 =\frac {\sum_{x\in \tilde{D}^2}w_x }{\sum_{x\in \tilde{D}}w_x}=\frac{2+\frac{7}{15}}{5+2\times\frac{7}{15}}=0.416    (无缺失值样本中,“色泽=青绿”的样本的比例)

Ent(\tilde{D})=-\sum_{k=1}^{|Y|}\tilde{p}_klog_2\tilde{p}_k=-0.753 \times log_20.753-0.247 \times log_20.247 = 0.806

Ent(\tilde{D^1})=-(\frac{2.467}{3.467}log_2\frac{2.467}{3.467}+\frac{1}{3.467}log_2\frac{1}{3.467})=0.867    (“色泽=乌黑”)

Ent(\tilde{D^2})=-(\frac{2}{2.467}log_2\frac{2}{2.467}+\frac{0.467}{2.467}log_2\frac{0.467}{2.467})=0.700    (“色泽=青绿”)

Gain(D,a)=\rho \times \left ( Ent( \tilde{D} ) -\sum_{v=1}^{V} \tilde{r}_vEnt( \tilde{D}^v ) \right )

                     =0.748 \times \left ( 0.806-0.584\times 0.867- 0.416 \times 0.700\right )=0.006

根蒂:

无缺失值,\rho =1

无缺失值样本中,正负样本所占比例:

\tilde{p}_1 =\frac{6+\frac{7}{15}}{7+2\times\frac{7}{15}}=0.815    \tilde{p}_2 =\frac{1+\frac{7}{15}}{7+2\times\frac{7}{15}}=0.185

属性值为“蜷缩”、“稍蜷”、“硬挺”的样本比例:

\tilde{r}_1 =\frac{5}{7+2\times\frac{7}{15}}=0.630     \tilde{r}_2 =\frac{2+\frac{7}{15}}{7+2\times\frac{7}{15}}=0.311    \tilde{r}_3 =\frac{\frac{7}{15}}{7+2\times\frac{7}{15}}=0.059

Ent(\tilde{D})=-0.815 \times log_20.815-0.185 \times log_20.185 = 0.691

Ent(\tilde{D^1})=-(\frac{5}{5}log_2\frac{5}{5}+\frac{0}{5}log_2\frac{0}{5})=0    

Ent(\tilde{D^2})=-(\frac{1.467}{2.467}log_2\frac{1.467}{2.467}+\frac{1}{2.467}log_2\frac{1}{2.467})=0.974    

Ent(\tilde{D^3})=-(\frac{0}{0.467}log_2\frac{0}{0.467}+\frac{0.467}{0.467}log_2\frac{0.467}{0.467})=0

Gain(D,a)=1 \times \left ( 0.691-0.630\times 0- 0.311 \times 0.974-0.059 \times 0\right )=0.388

敲声:

\rho =\frac{6+2\times\frac{7}{15}}{7+2\times\frac{7}{15}}=0.874

无缺失值样本中,正负样本所占比例:

\tilde{p}_1 =\frac{5+\frac{7}{15}}{6+2\times\frac{7}{15}}=0.856    \tilde{p}_2 =\frac{1}{6+2\times\frac{7}{15}}=0.144

属性值为“浊响”、“沉闷”、“清脆”的样本比例:

\tilde{r}_1 =\frac{4+\frac{7}{15}}{6+2\times\frac{7}{15}}=0.644     \tilde{r}_2 =\frac{2}{6+2\times\frac{7}{15}}=0.288    \tilde{r}_3 =\frac{\frac{7}{15}}{6+2\times\frac{7}{15}}=0.067

Ent(\tilde{D})=-0.856 \times log_20.856-0.144 \times log_20.144 = 0.595

Ent(\tilde{D^1})=-(\frac{3.467}{4.467}log_2\frac{3.467}{4.467}+\frac{1}{4.467}log_2\frac{1}{4.467})=0.767    

Ent(\tilde{D^2})=-(\frac{2}{2}log_2\frac{2}{2}+\frac{0}{2}log_2\frac{0}{2})=0    

Ent(\tilde{D^3})=-(\frac{0}{0.467}log_2\frac{0}{0.467}+\frac{0.467}{0.467}log_2\frac{0.467}{0.467})=0

Gain(D,a)=0.874 \times \left ( 0.595-0.644\times 0.767- 0.288 \times 0-0.067 \times 0\right )=0.088

脐部:

\rho =\frac{5+2\times\frac{7}{15}}{7+2\times\frac{7}{15}}=0.748

无缺失值样本中,正负样本所占比例:

\tilde{p}_1 =\frac{5+\frac{7}{15}}{5+2\times\frac{7}{15}}=0.921    \tilde{p}_2 =\frac{\frac{7}{15}}{5+2\times\frac{7}{15}}=0.079

属性值为“凹陷”、“稍凹”、“平坦”的样本比例:

\tilde{r}_1 =\frac{5}{5+2\times\frac{7}{15}}=0.843     \tilde{r}_2 =\frac{\frac{7}{15}}{5+2\times\frac{7}{15}}=0.079    \tilde{r}_3 =\frac{\frac{7}{15}}{5+2\times\frac{7}{15}}=0.079

Ent(\tilde{D})=-0.921 \times log_20.921-0.079 \times log_20.079 = 0.399

Ent(\tilde{D^1})=-(\frac{5}{5}log_2\frac{5}{5}+\frac{0}{5}log_2\frac{0}{5})=0    

Ent(\tilde{D^2})=-(\frac{0.467}{0.467}log_2\frac{0.467}{0.467}+\frac{0}{0.467}log_2\frac{0}{0.467})=0    

Ent(\tilde{D^3})=-(\frac{0}{0.467}log_2\frac{0}{0.467}+\frac{0.467}{0.467}log_2\frac{0.467}{0.467})=0

Gain(D,a)=0.748 \times \left ( 0.399-0.843\times 0- 0.079 \times 0-0.079 \times 0\right )=0.298

 触感:

\rho =\frac{6+2\times\frac{7}{15}}{7+2\times\frac{7}{15}}=0.874

无缺失值样本中,正负样本所占比例:

\tilde{p}_1 =\frac{5+\frac{7}{15}}{6+2\times\frac{7}{15}}=0.856    \tilde{p}_2 =\frac{1 +\frac{7}{15}}{6+2\times\frac{7}{15}}=0.212

属性值为“硬滑”、“软粘”的样本比例:

\tilde{r}_1 =\frac{4+\frac{7}{15}}{6+2\times\frac{7}{15}}=0.644     \tilde{r}_2 =\frac{2+\frac{7}{15}}{6+2\times\frac{7}{15}}=0.356    

Ent(\tilde{D})=-0.856 \times log_20.856-0.212 \times log_20.212 = 0.666

Ent(\tilde{D^1})=-(\frac{4.467}{4.467}log_2\frac{4.467}{4.467}+\frac{0}{4.467}log_2\frac{0}{4.467})=0    

Ent(\tilde{D^2})=-(\frac{1}{2.467}log_2\frac{1}{2.467}+\frac{1.467}{2.467}log_2\frac{1.467}{2.467})=0.974    

Gain(D,a)=0.874 \times \left ( 0.666-0.644\times 0- 0.356 \times 0.974\right )=0.279

因此,根蒂作为最优划分属性,继续划分。

对每个分支递归构建出决策树如下:

2. 如何对有缺失值的样本分类

对于问题3,决策树构造完成后,如果测试样本的属性值不完整,该如何确定该样本的类别?昆兰的文章中给出如下解决方案:

如果分类进入某个属性值未知的分支节点时,探索所有可能的分类结果并把所有结果结合起来考虑。这样,会存在多个路径,分类结果将是类别的分布而不是某一类别,从而选择概率最高的类别作为预测类别。

那么如果是使用上面构造的决策树,仍然无法确定测试样本在每条路径上的概率,因此需要对以上树结构稍作改进。这里我们使用昆兰原著中的数据集,能够更好的体现算法的原理。

用前面的计算过程,会得到一个决策树,我们先看一下每个样本在树节点中的分布情况:

然后我们对树的结构做个改进,给每个叶子节点加个数值,例如(N/E),N表示该叶节点中所包含的总样本数,E表示与该叶节点的类别不同的样本数,然后就可以得到这样的树结构。

现在我们使用这个决策树对测试样本分类,样本的属性值为:ountlook=sunny, temperature=70, humidity=?, windy=false.

测试样本进入左侧第一个分支,但是humidity属性值未知,因此两个分支的可能性都会考虑:

  • 如果humidity<=75,类别是play。
  • 如果humidity>75,类别是Don‘t play的概率为3/3.4(88%),play的概率是0.4/3.4(12%)。

那么,总的类别分布情况是:

play:2/5.4 \times 100\% + 3.4/5.4 \times 12\%=44\%

Don't\ play:3.4/5.4 \times 88\% =56\%

因此,该样本的类别判定为Don't play。

总结

至此,对于决策树中缺失值的处理就有了完整的解决方案,主要解决了3个问题,1是如何选择最优划分属性,2是有缺失值的训练样本如何划分到分支中,3是测试样本如有缺失值该如何判断其类别。Python代码实现以后的文章中会补充。


代码资源下载地址(留言回复可能不及时,请您自行下载):

https://download.csdn.net/download/leaf_zizi/10867159


参考:

周志华《机器学习》

J.Ross Quinlan C4.5: Programs For Machine Learning

  • 54
    点赞
  • 114
    收藏
  • 打赏
    打赏
  • 27
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页
评论 27

打赏作者

赵赵赵颖

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值