数据挖掘导论学习笔记 第四章 分类:基本概念、决策树与模型评估

4.1预备知识

  • 分类任务的输入数据是记录的集合
  • 每条记录也称实例或者样例,用元组(x,y)(x,y)表示,xx是属性的集合,y是样例的类标号(也成为分类属性或目标属性)
  • 类标号必须是离散的,但属性值可以是连续的
  • 分类(classfication)的任务就是得到一个目标函数,将每个属性集映射到一个y上
  • 目标函数也称分类模型
  • 分为描述性建模和预测性建模两种

4.2解决问题的一般方法

分类法的例子:决策树分类法、基于规则的分类法、神经网络、支持向量机、朴素贝叶斯分类法
混淆矩阵 (confusion matrix):用fijf_{ij}表示实际类标号为类ii但却被预测为类jj的记录数。混淆矩阵用来衡量分类模型的性能

预测的类
类=1 类=0
实际的类 类=1 f11f_{11} f10f_{10}
类=0 f10f_{10} f00f_{00}

(accuracy)= 准确率(accuracy)=\frac{正确预测数}{预测总数}

4.3 决策树归纳(decision tree)

4.3.1决策树原理

三种结点的定义

  • 根结点(root node)没有入边,但有零或多条出边
  • 内部结点(internal node)恰有一条入边和两条或多条出边
  • 叶结点(leaf node)或终结点,恰有一条入边,无出边,每个叶结点都赋予一个类标号

非终结点都有一个属性测试条件,用来选择分支

4.3.2 如何建立决策树

最优决策树需要指数级的计算往往不可取,因此采取一系列局部最优决策来构造决策树。

1.Hunt 算法

DtD_t是与结点t相关联的训练记录集,{yc}\{y_c\}是类标号,hunt算法定义如下:

  1. 如果DtD_t中所有记录都属于同一个类yty_t,则t是叶结点,用yty_t标记
  2. 如果属于多个类,那就选择一个属性测试条件(attribute test condition),将记录划分成较小的子集。对于测试条件的每一个输出穿紧固件一个子女结点,,将DtD_t中的记录分配,对每个子女结点,递归的调用hunt算法。
2.决策树归纳的设计问题
  1. 算法必须为不同类型的属性指定测试条件的方法,并且提供评估每种测试条件的客观度量
  2. 如何停止分裂过程

4.3.3表示属性测试条件的方法

  1. 二元属性 二元属性的测试条件产生两个可能的输出
  2. 标称属性 多路划分(有几个分几个)或者二元划分(k个属性值,2k12^{k-1}-11种方法)
  3. 序数属性 二元划分或多路划分,但二元划分不能打乱原有的顺序,比如{1,2,3,4}不能分成{1,3}{2,4}
  4. 连续属性 二元划分或多路划分。对于二元划分必须选好划分点。多路划分要选好区间,如果区间保持有序性,那么相邻的区间还可以聚集成较宽的区间。

4.3.4 选择最佳划分的度量

p(it)p(i|t)表示给定结点tt中属于类ii的记录所占的比例,有时省略t,直接用p(i)p(i)表示。选择最佳划分的度量通常根据划分后子女结点不纯性的程度。不纯性程度越低,类分布(p1,,pi)(p_1,\cdots,p_i)就越倾斜。
不纯性度量的例子包括:
Entropy(t)=i=0c1p(it)log2p(it)Gini(t)=1i=0c1[p(it)]2Classificationerror(t)=1maxi[p(it)]熵 Entropy(t)=-\sum_{i=0}^{c-1}p(i|t)log_2p(i|t)\\ \\ Gini(t)=1-\sum_{i=0}^{c-1}[p(i|t)]^2\\ Classification\quad error(t)=1-\max_i[p(i|t)]
其中c是类的个数,不同的度量变化趋势是一致的,但值不同。
父结点与子女结点的不纯程度之差越大,测试条件的效果就越好。增益Δ\Delta可以用来确定划分效果:
Δ=I(parent)j=1kN(vi)NI(vj)\Delta=I(parent)-\sum_{j=1}^{k}\frac{N(v_i)}{N}I(v_j) 其中I(.)I(.)是给定结点的不纯性度量,NN是父结点上的记录总数,k是属性值个数,N(vj)N(v_j) 是与子女结点vjv_j相关联的记录个数。
I(parent)I(parent)是不变的,所以最大化增益等价于最小化子女结点的不纯性度量的加权平均值
当选择熵作为不纯性度量时,
熵的差就是信息增益(information gain)Δinfo\Delta_{info}

属性的划分

数据划分的不纯性指标的加权平均值越小,数据划分越合适。多路划分往往比二元划分更合适,二元划分可以看做是多路划分合并了某些输出得到的。
在对连续性属性划分时,为了选取划分点,节约时间,我们不使用穷举法,而是先将所有属性值排序,把两个相邻的属性值的中间值作为候选划分点,进一步简化,我们不必考虑相同类标号之间的划分点。

增益率

对于像顾客ID这样的划分,每个样本在属性上的值都是唯一的,每个划分相关联的记录太少,以至于不能做出可靠的预测。解决这个问题的策略有两种。

  1. 指定限制测试条件只能是二元划分,如CART决策树算法
  2. 修改评估划分的标准,把属性测试条件产生的输出也考虑进去,例如决策树算法C4.5采用称作增益率(gain ratio)的划分标准来评估划分:
    Gain ratio=ΔinfoSplit InfoGain\ ratio=\frac{\Delta_{info}}{Split\ Info}
    其中划分信息Split Info=i=1kP(vi)log2P(vi)Split\ Info=-\sum_{i=1}^kP(v_i)log_2P(v_i),k是划分的总数。如果每个属性值具有相同的记录数,则划分信息等于log2klog_2k.这说明如果某个属性产生了大量的划分,它的划分信息将会很大,从而降低了增益率

4.3.5决策树归纳算法

Tree Growth
1:if    stopping_cond(E,F)=ture then        %判断是否终止决策树的增长,通过检查所有记录是否都属于同一类或者都具有相同的属性值或者记录数小于某个阈值
2:		leaf=createNode()                         %创建一个结点,这个结点可能是一个测试条件,也可能是一个类标号
3:		leaf.label=Classify(E)                    %为叶结点确定类标号leaf.label=argmax p(i|t)返回最大化p(i|t)的参数值i
4:else
6:		root=creatNode()       %创建一个根结点
7:		root.test_cond=find_best_solit(E,F)             %选择最适的属性最为测试条件
8:		令V={v|v是root.test_cond的一个可能的输出}
9:		for 每个v∈V do
10:	E_v={e|root.test_cond(e)=v,并且e∈E}         %E是一个训练记录集,F表示属性集
11:	child=TreeGrowth(E_v,F)
12:		将child作为root的派生结点添加到树中,,并将(root→child)标记为v
13:	end for
14:end if
15:return root

4.3.7决策树归纳的特点

  1. 不需要任何假设
  2. 寻找最佳决策树是NP完全问题
  3. 计算代价低。未知样本分类快,最坏情况下时间复杂度是O(w),w是树的最大深度
  4. 简单的数据集上,决策树可以与其他分类算法媲美
  5. 决策树是学习得到离散值函数的典型代表。但是对于特定的布尔问题,会产生2d2^d个结点,不适用
  6. 对于噪声的干扰具有相当好的鲁棒性
  7. 冗余属性不会产生不利性影响,但是不相关属性可能会在构造过程中偶然被选中,这需要特征选择技术处理
  8. 子树可能重复多次
  9. 测试条件每次只涉及一个属性会受到决策边界限制,对复杂关系建模的表达能力较低,所以需要以下的几种方法解决
斜决策树(oblique decision tree)

允许测试条件涉及多个属性,如x+y<1x+y<1,产生更紧凑的决策树到那时计算会变得很复杂

构造归纳(constructive induction)

创建复合属性,代表已有属性的算术或逻辑组合。在决策树构造之前就增广到数据集里。花费很低,但会产生冗余属性。

10.树剪枝(tree—pruning)减少决策树规模,防止过拟合。

4.4模型的过分拟合

分类模型的误差分为两种,训练误差和泛化误差。训练误差随着模型复杂度升高而降低,泛化误差则先降低后升高。

4.4.1噪声导致的过拟合

4.4.2缺乏代表性样本导致的过拟合

当决策树的叶结点没有足够的代表性样本时,,很可能做出错误的预测,即错误的生成子女结点。

4.4.3过拟合与多重比较过程

T0T_0是初始决策树,TxT_x是插入属性x的内部结点后的决策树。原则上,如果观察到Δ(T0,Tx)\Delta(T_0,T_x)大于某个预先设定的阈值,就可以将x添加到树中。但是在实践中可能会有很多个x, {x1,,xk}\{x_1, \cdots ,x_k\},因此其实是在测试Δ(T0,Tmax)\Delta(T_0,T_{max})。随着候选个数k的增加,Δ>α\Delta>\alpha的机率也在增大。除非根据k修改增益函数Δ\Delta或者α\alpha,否则算法会在不经意间增加一些欺骗性的结点导致过分拟合。
当选择属性xmaxx_{max}的训练记录很小时,Δ(T0,Tmax)\Delta(T_0,T_{max})方差会很大。找到Δ(T0,Tmax)>α\Delta(T_0,T_{max})>\alpha的机率也就增大了。决策树增长到一定深度时就会发生这种情况,降低结点所覆盖的记录数,提高了增加不必要结点的可能性。大量候选属性和少量训练记录都会导致过分拟合。

4.4.4泛化误差估计

1.再带入估计

假设训练数据集可以很好的代表整体数据,即训练误差等于泛化误差

2.结合模型复杂度

定义 奥卡姆剃刀:给定两个具有相同泛化误差的模型,较简单的模型比复杂的模型更可取

所有的事情都应该尽可能简单,但不是简化
\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad ——爱因斯坦

下面介绍两种把模型复杂度与分类模型评估结合在一起的方法
悲观误差评估(pessimistic error estimate)
决策树T的悲观误差估计eg(T)e_g(T)表示为
eg(T)=i=1k[e(ti)+Ω(ti)]i=1kn(ti)=e(T)+Ω(T)Nte_g(T)=\frac{\sum_{i=1}^k[e(t_i)+\Omega(t_i)]}{\sum_{i=1}^kn(t_i)}=\frac{e(T)+\Omega(T)}{N_t}其中n(t)n(t) 是结点t分类的训练记录数, e(t)e(t)是被误分类的记录数。k是决策树的叶结点数,e(T)e(T)是决策树的总训练误差,NtN_{t}是训练记录数,Ω(ti)\Omega(t_i)是每个结点tit_i对应的罚项。
对于二叉树来说,如果罚项为1,那么说明,除非增加一个结点能够减少一个以上的误分类,否则就不再增加结点。

最小描述长度原则(minimum description length MDL)
通过已知的A建模并传送类标号给B,传输的总代价是
=+总代价=模型编码的开销+误分类记录编码的开销
具体开销方法不唯一,自查。

3.估计统计上界

泛化误差也可以用训练误差的统计修正来估计。统计修正通常是计算训练误差的上界,考虑到达决策树一个特定叶结点的训练记录数。
在决策树算法C4.5中,假设每个叶结点上的错误服从二项分布。用正态分布近似二项分布eupper(N,e,α)=e+zα/222N+zα/2e(1e)N+zα/224N21+zα/22Ne_{upper}(N,e,\alpha)=\frac{e+\frac{z_{\alpha /2}^2}{2N}+z_{\alpha /2}\sqrt{\frac{e(1-e)}{N}+\frac{z_{\alpha /2}^2}{4N^2}}}{1+\frac{z_{\alpha /2}^2}{N}}
其中α\alpha是置信水平,zα/2z_{\alpha /2}是标准正态分布的标准化值,N是计算e的训练记录总数

4.使用确认集

将训练集分成两个较小的子集,一个用于训练,另一个叫做确认集,用于估计泛化误差。
该方法通过控制参数得到不同的模型,直到达到最低的错误率。

4.4.5处理决策树归纳中的过分拟合

前面介绍的是估计分类模型泛化误差的方法,来防止过拟合。下面介绍两种在决策树归纳上避免过分拟合的策略
先剪枝(提前终止规则):通过设定一些阈值来提前终止,但阈值往往很难确定,既不能太高也不能太低。
后剪枝:先生成最大规模的树,然后自下而上剪枝。剪枝有两种做法(1)子树提升(subtree rasing):用新的叶结点替换子树,该结点的类标号 由子树下记录中的多数类确定。 (2)子树替换(subtree replacement)用子树中最常使用的分支代替子树。后剪枝的结果优于先剪枝但会消耗较多的计算量,而且剪枝后,一部分计算量被浪费了。

4.5评估分类器的性能

这一节回顾了一些常用的评估分类器性能的方法

保持方法

一部分训练,一部分检验。局限性在于:(1)训练样本减少,模型不如使用全部记录好(2)模型可能依赖训练集和检验集的构成,一方面训练集越小,方差越大,另一方面,在一个子集中超出比例的类在另一个子集中就低于比例,反之亦然。

随机二次抽样

即多次重复保持方法。缺陷在于训练集减少,和没有控制每个记录用于训练和检验的次数,因此有些用于训练的记录使用的频率可能比其他记录高得多

交叉验证

一分为多,每一个子集检验,剩下的训练。k折交叉检验.缺点是开销很大。

自助法

之前的方法都是不放回抽样,自助法(bootstrap)是有放回的抽样。
原始数据有N个记录,一个记录被抽到的概率是0.632,没有被抽到的做检验集,得到的自主样本准确率的一个估计εi\varepsilon_i.抽样b次,产生b个自主样本。总准确率计算如下
accboot=1bi=1b(0.632×εi+0.368×accs){acc}_{boot}=\frac{1}{b} \sum_{i=1}^{b}(0.632 \times \varepsilon_i+0.368\times acc_s)

4.6比较分类器的方法

4.6.1估计准确度的置信区间

预测检验预测类标号的任务可以被看做二项式实验。给定一个N个记录的检验集。N充分大时用正态分布近似,推导出准确率的置信区间
P(Zα/2<=accpp(1p)/N<=Z1α/2)=1αP(-Z_{\alpha /2}<=\frac{acc-p}{\sqrt{p(1-p)/N}}<=Z_{1-\alpha/2})=1-\alpha
Z是在置信水平(1α)(1-\alpha)下的置信界限,acc表示准确率,p表示检验正确的概率。通过查表可知不同置信水平下的Zα/2Z_{\alpha/2}

4.6.2比较两个模型的性能

考虑一对模型M1M_1M2M_2,他们两个独立的检验集D1D_1D2D_2上进行评估,令 nin_iDiD_i中的记录数,M1M_1D1D_1的错误率为e1e_1,目标是检验e1e_1e2e_2 的观测差是否统计显著
设检验集充分大,可以用正态分布近似,,令d=e1e2d=e_1-e_2.d的方差为
σd2σ^d2=e1(1e1)n1+e2(1e2)n2\sigma^2_d\approx \hat{\sigma}^2_d=\frac{e_1(1-e_1)}{n_1}+\frac{e_2(1-e_2)}{n_2}
最后在置信水平(1α)%(1-\alpha)\%下,dtd_t的置信区间由下式:dt=d±zα/2σ^d2d_t=d\pm z_{\alpha/2}\hat{\sigma}^2_d

4.6.3比较两种分类法的性能

假设我们想用k折交叉验证的方法比较两种分类法的性能。MijM_{ij}表示分类计数LiL_i在第j次迭代产生的模型,观察的差的总方差用下式进行估计:
σ^dcv2=j=1k(djdˉ)k(k1)\hat{\sigma}^2_{d^{cv}}=\frac{\sum_{j=1}^{k}(d_j-\bar{d})}{k(k-1)}
其中dˉ\bar{d}是平均差。对于这个方法我们需要用tt分布计算dcvd^{cv}的置信区间:
dcv=dˉ±t(1α),k1σ^dcv2d^{cv}=\bar{d}\pm t_{(1-\alpha),k-1}\hat{\sigma}^2_{d^{cv}}
系数t(1α),k1t_{(1-\alpha),k-1}可以通过两个参数(置信水平(1-a)和自由度k-1)查概率表得到

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章