机器学习 第2章-模型评估与选择
2.1 经验误差与过拟合
通常我们把分类错误的样本数占样本总数的比例称为“错误率”(errorrate),即如果在m个样本中有a个样本分类错误,则错误率
E
=
a
/
m
E=a/m
E=a/m;相应的
1
−
a
/
m
1-a/m
1−a/m称为“精度”(accuracy),即“精度= 1-错误率”.
常写为百分比形式
(
1
−
a
m
)
×
100
(1-{a\over m})×100%
(1−ma)×100
更一般地,我们把学习器的实际预测输出与样本的真实输出之间的差异称为“误差”(error),学习器在训练集上的误差称为“训练误差”(trainingerror)或“经验误差”(empirical error)。在新样本上的误差称为“泛化误差”(generalizationerror).
显然,我们希望得到泛化误差小的学习器.然而,我们事先并不知道新样本是什么样,实际能做的是努力使经验误差最小化.在很多情况下,我们可以学得一个经验误差很小、在训练集上表现很好的学习器。例如甚至对所有训练样本都分类正确,即分类错误率为零,分类精度为100%,但这是不是我们想要的学习器呢?遗憾的是,这样的学习器在多数情况下都不好。
我们实际希望的,是在新样本上能表现得很好的学习器.为了达到这个目的,应该从训练样本中尽可能学出适用于所有潜在样本的“普遍规律”,这样才能在遇到新样本时做出正确的判别.然而,当学习器把训练样本学得“太好”了的时候,很可能已经把训练样本自身的一些特点当作了所有潜在样本都会具有的一般性质,这样就会导致泛化性能下降.这种现象在机器学习中称为“过拟合”(overftting).与“过拟合”相对的是“欠拟合”(underftting),这是指对训练样本的一般性质尚未学好.图2.1给出了关于过拟合与欠拟合的一个便于直观理解的类比
有多种因素可能导致过拟合,其中最常见的情况是由于学习能力过于强大以至于把训练样本所包含的不太一般的特性都学到了,而欠拟合则通常是由于学习能力低下而造成的.欠拟合比较容易克服,例如在决策树学习中扩展分支、在神经网络学习中增加训练轮数等,而过拟合则很麻烦.在后面的学习中我们将看到,过拟合是机器学习面临的关键障碍,各类学习算法都必然带有一些针对过拟合的措施:然而必须认识到,过拟合是无法彻底避免的,我们所能做的只是“缓解”,或者说减小其风险
2.2 评估方法
通常,我们可通过实验测试来对学习器的泛化误差进行评估并进而做出选择.为此,需使用一个“测试集”(testing set)来测试学习器对新样本的判别能力,然后以测试集上的“测试误差”(testing error)作为泛化误差的近似.
2.2.1 留出法
“留出法”(hold-out)直接将数据集 D D D划分为两个互斥的集合,其中一个集合作为训练集 S S S,另一个作为测试集 T T T,即 D = S ⋃ T D=S⋃T D=S⋃T, S ∩ T = Ø S∩T=Ø S∩T=Ø.在 S S S上训练出模型后,用 T T T来评估其测试误差,作为对泛化误差的估计。
需注意的是,训练/测试集的划分要尽可能保持数据分布的一致性,避免困数据划分过程引入额外的偏差而对最终结果产生影响。
2.2.2 交叉验证法
“交叉验证法”(cross validation)先将数据集 D D D划分为 k k k个大小相似的互斥子集,即 D = D 1 ⋃ D 2 ⋃ . . . ⋃ D k , D i ⋂ D j = Ø ( i ≠ j ) D=D_1⋃D_2⋃...⋃D_k, D_i⋂D_j=Ø(i≠ j) D=D1⋃D2⋃...⋃Dk,Di⋂Dj=Ø(i=j).每个子集 D i D_i Di都尽可能保持数据分布的一致性,即从 D D D中通过分层采样得到.然后,每次用 k − 1 k-1 k−1个子集的并集作为训练集,余下的那个子集作为测试集;
这样就可获得k组训练/测试集,从而可进行 k k k次训练和测试,最终返回的是这 k k k个测试结果的均值.显然,交叉验证法评估结果的稳定性和保真性在很大程度上取决于 k k k的取值,为强调这一点,通常把交叉验证法称为“ k k k折交叉验证”(k-fold crossvalidation).
如图2.2所示
2.2.3 自助法
我们希望评估的是用 D D D训练出的模型.但在留出法和交叉验证法中,由于保留了一部分样本用于测试,因此实际评估的模型所使用的训练集比 D D D小,这必然会引入一些因训练样本规模不同而导致的估计偏差.留一法受训练样本规模变化的影响较小,但计算复杂度又太高了.有没有什么办法可以减少训练样本规模不同造成的影响,同时还能比较高效地进行实验估计呢?
“自助法”(bootstrapping)是一个比较好的解决方案,它直接以自助采样法(bootstrap sampling)为基础.给定包含 m个样本的数据集
D
D
D,我们对它进行采样产生数据集
D
′
D'
D′:每次随机从
D
D
D中挑选一个样本,将其拷贝放入
D
′
D'
D′,然后再将该样本放回初始数据集
D
D
D中,使得该样本在下次采样时仍有可能被采到;这个过程重复执行
m
m
m次后,我们就得到了包含
m
m
m个样本的数据集
D
’
D’
D’这就是自助采样的结果.显然,
D
D
D中有一部分样本会在
D
′
D'
D′中多次出现,而另一部分样本不出现.可以做一个简单的估计,样本在
m
m
m次采样中始终不被采到的概率是
(
1
−
1
m
)
m
(1-{1\over m})^m
(1−m1)m,取极限得到
l
i
m
m
→
∞
(
1
−
1
m
)
m
→
1
e
≈
0.368
lim_{m→∞}(1-{1\over m})^m→{1\over e}≈0.368
limm→∞(1−m1)m→e1≈0.368
即通过自助采样,初始数据集D中约有 36.8%的样本未出现在采样数据集
D
D
D中.于是我们可将
D
′
D'
D′用作训练集,KaTeX parse error: Undefined control sequence: \D at position 2: D\̲D̲'用作测试集; 这样,实际评估的模型与期望评估的模型都使用
m
m
m个训练样本,而我们仍有数据总量约 1/3 的、没在训练集中出现的样本用于测试.这样的测试结果,亦称“包外估计”(out-of-bagestimate).
2.2.4 调参与最终模型
大多数学习算法都有些参数(parameter)需要设定,参数配置不同,学得模型的性能往往有显著差别.因此,在进行模型评估与选择时,除了要对适用学习算法进行选择,还需对算法参数进行设定,这就是通常所说的“参数调节”或简称“调参”(parameter tuning)
可能马上想到,调参和算法选择没什么本质区别:对每种参数配置都训练出模型,然后把对应最好模型的参数作为结果.这样的考虑基本是正确的,但有一点需注意:学习算法的很多参数是在实数范围内取值,因此,对每种参数配置都训练出模型来是不可行的.现实中常用的做法,是对每个参数选定一个范围和变化步长,例如在[0,0.2]范围内以 0.05 为步长,则实际要评估的候选参数值有5个,最终是从这5个候选值中产生选定值.显然,这样选定的参数值往往不是“最佳”值,但这是在计算开销和性能估计之间进行折中的结果,通过这个折中,学习过程才变得可行.
另外,需注意的是,我们通常把学得模型在实际使用中遇到的数据称为测试数据,为了加以区分,模型评估与选择中用于评估测试的数据集常称为“验证集”(validation set).例如,在研究对比不同算法的泛化性能时,我们用测试集上的判别效果来估计模型在实际使用时的泛化能力,而把训练数据另外划分为训练集和验证集,基于验证集上的性能来进行模型选择和调参.
2.3 性能度量
对学习器的泛化性能进行评估,不仅需要有效可行的实验估计方法,还需要有衡量模型泛化能力的评价标准,这就是性能度量(performance measure).性能度量反映了任务需求,在对比不同模型的能力时,使用不同的性能度量往往会导致不同的评判结果;这意味着模型的“好坏”是相对的,什么样的模型是好的,不仅取决于算法和数据,还决定于任务需求,
2.3.1 错误率与精度
错误率是分类错误的样本数占样本总数的比例,精度则是分类正确的样本数占样本总数的比例.对样例集
D
D
D,分类错误率定义为
E
(
f
;
D
)
=
1
m
∑
i
=
1
m
Ⅱ
(
f
(
x
i
)
≠
y
i
)
E(f;D)={1\over m}∑^m_{i=1}Ⅱ(f(x_i)≠y_i)
E(f;D)=m1i=1∑mⅡ(f(xi)=yi)
精度则定义为
a
c
c
(
f
;
D
)
=
1
m
∑
i
=
1
m
Ⅱ
(
f
(
x
i
)
=
y
i
)
=
1
−
E
(
f
;
D
)
acc(f;D)={1\over m}∑^m_{i=1}Ⅱ(f(x_i)=y_i)=1-E(f;D)
acc(f;D)=m1i=1∑mⅡ(f(xi)=yi)=1−E(f;D)
2.3.2 查准率、查全率与Fl
错误率和精度虽常用,但并不能满足所有任务需求.以西瓜问题为例,假定瓜农拉来一车西瓜,我们用训练好的模型对这些西瓜进行判别,显然,错误率衡量了有多少比例的瓜被判别错误.但是若我们关心的是“挑出的西瓜中有多少比例是好瓜”,或者“所有好瓜中有多少比例被挑了出来”,那么错误率显然就不够用了,这时需要使用其他的性能度量.
类似的需求在信息检索、Web搜索等应用中经常出现,例如在信息检索中,我们经常会关心“检索出的信息中有多少比例是用户感兴趣的”“用户感兴趣的信息中有多少被检索出来了”.“査准率”(precision)与“查全率”(recall)是更为适用于此类需求的性能度量。
对于二分类问题,可将样例根据其真实类别与学习器预测类别的组合划分为真正例(true positive)、假正例(false positive)、真反例(true negative)、假反例(false negative)四种情形,令TP、FP、TN、FN 分别表示其对应的样例数,则显然有TP+FP+TN+FN=样例总数.分类结果的“混淆矩阵”(confusion matrix)如表 2.1所示
查准率P定义为:
P
=
T
P
T
P
+
F
P
P={TP \over {TP+FP}}
P=TP+FPTP
查全率R定义为:
R
=
T
P
T
P
+
F
N
R={TP \over {TP+FN}}
R=TP+FNTP
2.3.3 ROC与AUC
很多学习器是为测试样本产生一个实值或概率预测,然后将这个预测值与一个分类阈值(threshold)进行比较,若大于阈值则分为正类,否则为反类.例如,神经网络在一般情形下是对每个测试样本预测出一个[0.0,1.0]之间的实值然后将这个值与0.5进行比较,大于0.5 则判为正例,否则为反例.
这个实值或概率预测结果的好坏,直接决定了学习器的泛化能力.实际上,根据这个实值或概率预测结果,我们可将测试样本进行排序,“最可能”是正例的排在最前面“最不可能”是正例的排在最后面.这样,分类过程就相当于在这个排序中以某个“截断点”(cut point)将样本分为两部分,前一部分判作正例,后一部分则判作反例.
在不同的应用任务中,我们可根据任务需求来采用不同的截断点,例如若我们更重视“查准率”,则可选择排序中靠前的位置进行截断;若更重视“查全率”,则可选择靠后的位置进行截断.因此,排序本身的质量好坏,体现了综合考虑学习器在不同任务下的“期望泛化性能”的好坏,或者说,“一般情况下”泛化性能的好坏.ROC曲线则是从这个角度出发来研究学习器泛化性能的有力工具.
ROC全称是“受试者工作特征”(ReceiverOperating Characteristic)曲线,它源于“二战”中用于敌机检测的雷达信号分析技术,二十世纪六七十年代开始被用于一些心理学、医学检测应用中,此后被引入机器学习领域.
与前面介绍的P-R曲线相似,我们根据学习器的预测结果对样例进行排序,按此顺序逐个把样本作为正例进行预测,每次计算出两个重要量的值,分别以它们为横、纵坐标作图,就得到了“ROC曲线”与P-R曲线使用查准率、查全率为纵、横轴不同,ROC曲线的纵轴是“真正例率”(True Positive Rate,简称 TPR),横轴是“假正例率”(False PositiveRate,简称 FPR),基于表 2.1中的符号,两者分别定义为
T
P
R
=
T
P
T
P
+
F
N
TPR={TP \over TP+FN}
TPR=TP+FNTP
F
P
R
=
F
P
T
N
+
F
P
FPR={FP \over TN+FP}
FPR=TN+FPFP
显示ROC 曲线的图称为 “ROC图”,如图2.4所示
进行学习器的比较时,与P-R图相似,若一个学习器的ROC曲线被另个学习器的曲线完全“包住”,则可断言后者的性能优于前者;若两个学习器的 ROC 曲线发生交叉,则难以一般性地断言两者孰优孰劣.此时如果一定要进行比较,则较为合理的判据是比较 ROC曲线下的面积,即AUC(Area UnderROC Curve),如图 2.4 所示
从定义可知,AUC可通过对ROC曲线下各部分的面积求和而得,假定 ROC 曲线是由坐标为
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
.
.
.
,
(
x
m
,
y
m
)
{(x_1,y_1),(x_2,y_2),...,(x_m,y_m)}
(x1,y1),(x2,y2),...,(xm,ym)的点按序连接而形成
(
x
1
=
0
,
x
m
=
1
)
(x_1= 0,x_m =1)
(x1=0,xm=1),参见图 2.4(b),则 AUC 可估算为
A
U
C
=
1
2
∑
i
=
1
m
−
1
(
x
i
+
1
−
x
i
)
⋅
(
y
i
+
y
i
+
1
)
AUC={1\over 2}∑^{m-1}_{i=1}(x_{i+1}-x_i)·(y_i+y_{i+1})
AUC=21i=1∑m−1(xi+1−xi)⋅(yi+yi+1)
形式化地看,AUC 考虑的是样本预测的排序质量,因此它与排序误差有紧密联系.给定
m
+
m^+
m+个正例和
m
−
m^-
m−个反例,令
D
+
D^+
D+和
D
−
D^-
D−分别表示正、反例集合则排序“损失”(loss)定义为
l
r
a
n
k
=
1
m
+
m
−
∑
x
+
∈
D
+
∑
x
−
∈
D
−
(
Ⅱ
(
f
(
x
+
)
<
f
(
x
−
)
)
+
1
2
Ⅱ
(
f
(
x
+
)
=
f
(
x
−
)
)
)
l_{rank}={1\over m^+m^-}∑_{x^+∈D^+}∑{x^-∈D^-}(Ⅱ(f(x^+)<f(x^-))+{1\over2}Ⅱ(f(x^+)=f(x^-)))
lrank=m+m−1x+∈D+∑∑x−∈D−(Ⅱ(f(x+)<f(x−))+21Ⅱ(f(x+)=f(x−)))
即考虑每一对正、反例,若正例的预测值小于反例,则记一个“罚分”,若相等,则记 0.5 个“罚分”.容易看出,
l
r
a
n
k
l_{rank}
lrank 对应的是 ROC 曲线之上的面积: 若一个正例在 ROC 曲线上对应标记点的坐标为
(
x
,
y
)
(x,y)
(x,y),则
x
x
x恰是排序在其之前的反例所占的比例,即假正例率.因此有
A
U
C
=
1
−
l
r
a
n
k
AUC=1-l_{rank}
AUC=1−lrank
2.3.4 代价敏感错误率与代价曲线
以二分类任务为例,我们可根据任务的领域知识设定一个“代价矩阵”(cost matrix),如表 2.2所示
其中
c
o
s
t
i
j
cost_{ij}
costij,表示将第
i
i
i类样本预测为第
j
j
j类样本的代价.一般来说,
c
o
s
t
i
i
=
0
cost_{ii}=0
costii=0;若将第0类判别为第1类所造成的损失更大,则
c
o
s
t
01
>
c
o
s
t
10
cost_{01}>cost_{10}
cost01>cost10;损失程度相差越大,
c
o
s
t
01
cost_{01}
cost01与
c
o
s
t
10
cost_{10}
cost10值的差别越大.
在非均等代价下,ROC曲线不能直接反映出学习器的期望总体代价,而“代价曲线”可达到这个目的,代价曲线的横轴定义为取值为 [ 0, 1 ]的正例概念代价:
P
(
+
)
c
o
s
t
=
p
×
c
o
s
t
01
p
×
c
o
s
t
01
+
(
1
−
p
)
c
o
s
t
10
P(+)cost={p×cost_{01}\over p×cost_{01}+(1-p)cost_{10}}
P(+)cost=p×cost01+(1−p)cost10p×cost01
其中p是样例为正例的概率;纵轴是取值为 [0,1] 的归一化代价
c
o
s
t
n
o
r
m
=
F
N
R
×
p
×
c
o
s
t
01
+
F
P
R
×
(
1
−
p
)
×
c
o
s
t
10
p
×
c
o
s
t
01
+
(
1
−
p
)
c
o
s
t
10
cost_{norm}={FNR×p×cost_{01}+FPR×(1-p)×cost_{10}\over p×cost_{01}+(1-p)cost_{10}}
costnorm=p×cost01+(1−p)cost10FNR×p×cost01+FPR×(1−p)×cost10
其中 FPR 是式(2.19)定义的假正例率,FNR=1-TPR是假反例率.代价曲线的绘制很简单:ROC曲线上每一点对应了代价平面上的一条线段,设ROC曲线上点的坐标为(TPR,FPR),则可相应计算出FNR,然后在代价平面上绘制条从(0,FPR)到(1,FNR)的线段,线段下的面积即表示了该条件下的期望总体代价;如此将ROC曲线上的每个点转化为代价平面上的一条线段,然后取所有线段的下界,围成的面积即为在所有条件下学习器的期望总体代价,如图 2.5 所示.
2.4 比较检验
统计假设检验(hypothesis test)为我们进行学习器性能比较提供了重要依据.基于假设检验结果我们可推断出,若在测试集上观察到学习器A比B好则A的泛化性能是否在统计意义上优于B,以及这个结论的把握有多大.
这一部分参考考研数一概率论的内容更通俗易懂一些。
这一块的新内容比如:McNemar检验、Friedman检验和Nemenyi后续检验。现在也没搞清楚,后面再来填坑。
2.5 偏差与方差
对学习算法除了通过实验估计其泛化性能,人们往往还希望了解它“为什么”具有这样的性能.“偏差-方差分解”(bias-variance decomposition)是解释学习算法泛化性能的一种重要工具。
偏差-方差分解试图对学习算法的期望泛化错误率进行拆解.我们知道,算法在不同训练集上学得的结果很可能不同,即便这些训练集是来自同一个分布对测试样本
x
x
x,令
y
D
y_D
yD为
x
x
x在数据集中的标记,
y
y
y为
x
x
x的真实标记,
f
(
x
;
D
)
f(x;D)
f(x;D)为训练集D上学得模型
f
f
f在上的预测输出.以回归任务为例,学习算法的期望预测为:
f
ˉ
(
x
)
=
E
D
[
f
(
x
;
D
)
]
\bar f(x)=E_D[f(x;D)]
fˉ(x)=ED[f(x;D)]
使用样本数相同的不同训练集产生的方差为
v
a
r
(
x
)
=
E
D
[
(
f
(
x
;
D
)
−
f
ˉ
(
x
)
)
2
]
var(x)=E_D[(f(x;D)-\bar f(x))^2]
var(x)=ED[(f(x;D)−fˉ(x))2]
噪声为
ε
2
=
E
D
[
(
y
D
−
y
)
2
]
ε^2=E_D[(y_D-y)^2]
ε2=ED[(yD−y)2]
期望输出与真实标记的差别称为偏差(bias),即
b
i
a
s
2
(
x
)
=
(
f
ˉ
(
x
)
−
y
)
2
bias^2(x)=(\bar f(x)-y)^2
bias2(x)=(fˉ(x)−y)2
为便于讨论,假定噪声期望为0,即
E
D
[
y
D
−
y
]
=
0
E_D[y_D-y] =0
ED[yD−y]=0. 通过简单的多项式展开合井,可对算法的期望泛化误差进行分解,最后得到
E
(
f
;
D
)
=
b
i
a
s
2
(
x
)
+
v
a
r
(
x
)
+
ε
2
E(f;D)=bias^2(x)+var(x)+ε^2
E(f;D)=bias2(x)+var(x)+ε2
也就是说,泛化误差可分解为偏差、方差与噪声之和.
一般来说,偏差与方差是有冲突的,这称为偏差-方差窘境(bias-variancedilemma).图 2.9给出了一个示意图.给定学习任务,假定我们能控制学习算法的训练程度,则在训练不足时,学习器的拟合能力不够强,训练数据的扰动不足以使学习器产生显著变化,此时偏差主导了泛化错误率:随着训练程度的加深学习器的拟合能力逐渐增强,训练数据发生的扰动渐渐能被学习器学到,方差逐渐主导了泛化错误率:在训练程度充足后,学习器的拟合能力已非常强,训练数据发生的轻微扰动都会导致学习器发生显著变化,若训练数据自身的、非全局的特性被学习器学到了,则将发生过拟合.