【机器学习基础】系列博客为参考周志华老师的《机器学习》一书,自己所做的读书笔记。
本文为原创文章,未经本人允许,禁止转载。转载请注明出处。
1.连续值处理
到目前为止我们仅讨论了基于离散属性来生成决策树。本节我们来讨论在决策树学习中如何使用连续属性。
可将连续属性离散化,最简单的策略是二分法(C4.5决策树算法中采用的机制)。
给定样本集D和连续属性a,假定a在D上出现了n个不同的取值,将这些值从小到大进行排序,记为{a1,a2,…,an}。基于划分点t可将D分为子集D−t和D+t,其中D−t包含那些在属性a上取值不大于t的样本,而D+t则包含那些在属性a上取值大于t的样本。显然,对相邻的属性取值ai与ai+1来说,t在区间[ai,ai+1)中取任意值所产生的划分结果相同。因此,对连续属性a,我们可考察包含n-1个元素的候选划分点集合:
Ta={ai+ai+12|1⩽i⩽n−1}即把区间[ai,ai+1)的中位点ai+ai+12作为候选划分点。
将信息增益的公式加以改造:
Gain(D,a)=maxt∈TaGain(D,a,t)=maxt∈TaEnt(D)−∑λ∈{−,+}∣Dλt∣∣D∣Ent(Dλt)举个例子,假设我们有如下西瓜数据集:
以连续属性“密度”为例,将17个属性值从小到大排列:0.243、0.245、0.343、0.360、0.403、0.437、0.481、0.556、0.593、0.608、0.634、0.639、0.657、0.666、0.697、0.719、0.774。根据式1.1,得到该属性的16个候选划分点:0.244、0.294、0.351、0.381、0.420、0.459、0.518、0.574、0.600、0.621、0.636、0.648、0.661、0.681、0.708、0.746。计算每个候选分割点的信息增益:
t | D−t | D+t | Gain |
---|---|---|---|
0.244 | 10 | 1,2,3,4,5,6,7,8,9,11,12,13,14,15,16,17 | 0.056 |
0.294 | 10,11 | 1,2,3,4,5,6,7,8,9,12,13,14,15,16,17 | 0.118 |
0.351 | 10,11,12 | 1,2,3,4,5,6,7,8,9,13,14,15,16,17 | 0.186 |
0.381 | 10,11,12,15 | 1,2,3,4,5,6,7,8,9,13,14,16,17 | 0.262 |
0.420 | 6,10,11,12,15 | 1,2,3,4,5,7,8,9,13,14,16,17 | 0.093 |
0.459 | 6,8,10,11,12,15 | 1,2,3,4,5,7,9,13,14,16,17 | 0.030 |
0.518 | 6,7,8,10,11,12,15 | 1,2,3,4,5,9,13,14,16,17 | 0.004 |
0.574 | 5,6,7,8,10,11,12,15 | 1,2,3,4,9,13,14,16,17 | 0.002 |
0.600 | 5,6,7,8,10,11,12,15,16 | 1,2,3,4,9,13,14,17 | 0.002 |
0.621 | 4,5,6,7,8,10,11,12,15,16 | 1,2,3,9,13,14,17 | 0.004 |
0.636 | 3,4,5,6,7,8,10,11,12,15,16 | 1,2,9,13,14,17 | 0.030 |
0.648 | 3,4,5,6,7,8,10,11,12,13,15,16 | 1,2,9,14,17 | 0.006 |
0.661 | 3,4,5,6,7,8,10,11,12,13,14,15,16 | 1,2,9,17 | 0.001 |
0.681 | 3,4,5,6,7,8,9,10,11,12,13,14,15,16 | 1,2,17 | 0.024 |
0.708 | 1,3,4,5,6,7,8,9,10,11,12,13,14,15,16 | 2,17 | 0.000 |
0.746 | 1,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 | 2 | 0.067 |
根据式1.2取信息增益的最大值0.262,对应于划分点0.381。同理,可得连续属性“含糖率”的信息增益为0.349,对应于划分点0.126。
⚠️与离散属性不同,若当前结点划分属性为连续属性,该属性还可作为其后代结点的划分属性。例如在父结点上使用了“密度⩽0.381”,不会禁止在子结点上使用“密度⩽0.294”。
2.缺失值处理
假设我们有含缺失值的西瓜数据集见下:
如果直接舍弃含有缺失值的数据,那么仅有4、7、14、16四个样本可用,显然是对数据信息极大的浪费。
我们需解决两个问题:
- 如何在属性值缺失的情况下进行划分属性选择?
- 给定划分属性,若样本在该属性上的值缺失,如何对样本进行划分?
👉解决问题1:
给定训练集D和属性a,令˜D表示D中在属性a上没有缺失值的样本子集。我们可仅根据˜D来判断属性a的优劣。假定属性a有V个可取值{a1,a2,…,aV},令˜Dv表示˜D中在属性a上取值为av的样本子集,˜Dk表示˜D中属于第k类(k=1,2,…,∣y∣)的样本子集,则显然有˜D=∪∣y∣k=1˜Dk,˜D=∪Vv=1˜Dv。假定我们为每个样本x赋予一个权重wx,并定义:
ρ=∑x∈˜Dwx∑x∈Dwx ˜pk=∑x∈˜Dkwx∑x∈˜Dwx(1⩽k⩽∣y∣) ˜rv=∑x∈˜Dvwx∑x∈˜Dwx(1⩽v⩽V)在决策树学习开始阶段,根结点中各样本的权重初始化为1。
直观地看,对属性a,ρ表示无缺失值样本所占的比例,˜pk表示无缺失值样本中第k类所占的比例,˜rv则表示无缺失值样本中在属性a上取值av的样本所占的比例。显然,∑∣y∣k=1˜pk=1,∑Vv=1˜rv=1。
根据上述定义,将信息增益推广为:
Gain(D,a)=ρ×Gain(˜D,a)=ρ×(Ent(˜D)−V∑v=1˜rvEnt(˜Dv))其中,
Ent(˜D)=−∣y∣∑k=1˜pklog2˜pk👉解决问题2:
若样本x在划分属性a上的取值已知,则将x划入与其取值对应的子结点,且样本权值在子结点中保持为wx。若样本x在划分属性a上的取值未知,则将x同时划入所有子结点,且样本权值在与属性值av对应的子结点中调整为˜rv⋅wx。
C4.5算法使用了上述解决方案。
以上述含缺失值的西瓜数据集为例。该数据集一共包含17个样例,各样例的权值均为1。以属性“色泽”为例,有14个样例无缺失值,˜D的信息熵为:
Ent(˜D)=−2∑k=1˜pklog2˜pk=−(614log2614+814log2814)=0.985令˜D1,˜D2,˜D3分别表示在属性“色泽”上取值为“青绿”“乌黑”以及“浅白”的样本子集,有:
Ent(˜D1)=−(24log224+24log224)=1.000 Ent(˜D2)=−(46log246+26log226)=0.918 Ent(˜D3)=−(04log204+44log244)=0.000因此,样本子集˜D上属性“色泽”的信息增益为:
Gain(˜D,色泽)=0.985−(414×1.000+614×0.918+414×0.000)=0.306于是,样本集D上属性“色泽”的信息增益为:
Gain(D,色泽)=ρ×Gain(˜D,色泽)=1417×0.306=0.252同理可计算出所有属性在D上的信息增益:
- Gain(D,色泽)=0.252
- Gain(D,根蒂)=0.171
- Gain(D,敲声)=0.145
- Gain(D,纹理)=0.424
- Gain(D,脐部)=0.289
- Gain(D,触感)=0.006
因此,选择属性“纹理”对根结点进行划分。样例1,2,3,4,5,6,15进入“纹理=清晰”分支,样例7,9,13,14,17进入“纹理=稍糊”分支,样例11,12,16进入“纹理=模糊”分支,且样本在各子结点中的权重依旧保持为1。
⚠️样例8在属性“纹理”上出现了缺失值,因此它将同时进入三个分支,但权重在三个子结点中分别调整为715,515,315。
最终生成的决策树见下: