第2章:模型评估与选择
- 2.1 经验误差与过拟合
- 2.1.1 一些概念
- 2.1.2 过拟合与欠拟合
- 2.2 学习器泛化误差评估方法
- 2.2.1 留出法
- 2.2.2 交叉验证法
- 交叉验证法的特例:留一法
- 2.2.3 自助法(适合小数据集)
- 2.2.4 调参与最终模型
- 训练集,测试集,验证集
- 2.3 性能度量(衡量模型泛化能力的标准)
- 2.3.1 错误率与精度
- 2.3.2 查准率、查全率与F1
- 查准率-查全率曲线(P-R曲线)
- 2.3.3 ROC与AUC
- 2.3.4 代价敏感错误率和代价曲线
- 代价曲线的绘制:
- 2.4 比较检验
- 2.4.1 假设检验
- 2.4.2 交叉验证t检验
- 2.5 方差与偏差
- 本节重要结论
2.1 经验误差与过拟合
2.1.1 一些概念
- 错误率(error rate):分类错误的样本占样本总数的比例
- 精度(accuracy):1 - 错误率
- 误差(error):学习器的实际预测输出与样本的真实输出之间的差异
- 训练误差(training error) | 经验误差(empirical error):学习器在训练集上的误差
- 泛化误差(generalization error):在新样本上的误差
2.1.2 过拟合与欠拟合
我们希望得到的是泛化误差小的学习器。
但是,实际上我们能做的是先让经验误差最小化,而且通常我们也能得到一个经验误差很小,在训练集上表现很好的学习器。例如甚至对训练集数据做到100%的精度,但这样的学习在多数情况下都不好。因为实际上我们想要的是在新样本上表现得很好的学习器,即前面提到的泛化误差小的学习器。
所以,我们想要学习器获得的是训练集数据的“普遍规律”和一般性质,而不是把样本的一些自身特点也学习到,这样会导致泛化性能下降,这种现象就是过拟合。
与过拟合相对应的就是欠拟合,指的是学习器连训练集的一般性质都没有学习到
西瓜书上的例子就很生动地解释了过拟合和欠拟合的概念
欠拟合:由学习能力低下造成。相对过拟合而言更容易克服(如:决策树扩展分支,神经网络增加训练轮数)
过拟合:由学习能力太过于强大造成。要克服过拟合比较麻烦,过拟合是机器学习面临的关键障碍,各类机器学习算法都带有针对过拟合的措施,但过拟合是无法彻底避免的,我们所能做的只是缓解过拟合。
2.2 学习器泛化误差评估方法
这里主要指的是对学习器的泛化误差的评估。
通常,我们用一个测试集(testing set)来测试学习器对新样本的分类能力,并以测试集上的测试误差作为该学习器泛化误差的近似
通常我们假设测试集也是从样本真实分布中独立同分布采样而得,且测试集
应尽量与训练集互斥,否则会使我们获得虚低的泛化误差。
我们主要讨论的,便是如何从当前所拥有的数据集进行划分得到训练集和测试集,主要有以下几种方法:
2.2.1 留出法
采用留出法将数据集划分为训练集和测试集时的要求如下:
- 划分方式:分层采样
- 划分次数:多次划分分别计算
- 划分数量
留出法:
- 划分方式:保持数据分布的一致性,避免因数据划分过程引入额外的偏差而对最终结果产生影响。
以分类任务为例,我们需要保证训练集和测试集中样本类别的比例相似。从采样的角度看,这种保持样本类别比例的采样方式称为分层采样(stratified sampling)。若训练集和测试集的样本类别比例差别太大,则误差估计会由于它们的数据分布差异而产生偏差
- 划分次数:采用若干次随机划分、重复进行实验评估后取平均值作为留出法的评估结果。
在1的前提下,我们仍然有多种划分方式将数据集划分为不同的训练集/测试集,而不同的训练集/测试集会使得训练的模型评估结果有所不同。可见,单次留出法的评估结果不够稳定可靠。故采用若干次随机划分、重复进行实验评估后取平均值作为留出法的评估结果。如进行100次随机划分,每次产生一个训练集/测试集用于评估,100次后就得到100个结果,而留出法返回的就是这100个结果的平均。
- 划分数量:将大约 2 3 至 4 5 \dfrac{2}{3}至\dfrac{4}{5} 32至54的样本用于训练,剩余样本用于测试。
此为留出法在划分训练集和测试集数量时的一个窘境。若训练集过小,则评估结果偏差大;若测试集过小,则评估结果方差大(一般而言,测试集至少要有30个样本)
2.2.2 交叉验证法
交叉验证法(cross validation)的具体步骤:
- 通过分层采样的方法将数据集 D D D划分为 k k k个大小相似的互斥子集(注意分层采样之后的每个子集数据分布具有一致性)
- 每次用 k − 1 k-1 k−1个子集的并集作为训练集,余下的那个子集作为测试集。显然,这样就可以获得 k k k组不同的训练集+测试集组合,从而进行 k k k次训练和测试,最终返回的是这 k k k个测试结果的均值。
- 同留出法,将数据集 D D D划分为 k k k组有多种不同的方式。为减少由于数据集划分的不同而引入的差别, k k k折交叉验证通常要随机使用不同的划分重复 p p p次,最终的结果是这 p p p次 k k k折交叉验证结果的平均值(常见的为10次10折交叉验证)。
交叉验证法评估结果的稳定性和保真性在很大程度上取决于 k k k的取值,通常把交叉验证法称为“ k k k折交叉验证”(k-fold cross validation)。最常用的取值为10(还有5、20等),此时称为10折交叉验证。
交叉验证法的特例:留一法
假定数据集 D D D中包含 m m m个样本,若令 k = m k=m k=m,则得到了交叉验证法的一个特例:留一法(Leave-One-Out,简称LOO)。显然,留一法的独特之处在于它不受样本随机划分的影响,因为 m m m个样本只能划分成 m m m个数据子集,即每一个样本就为一个子集(也即不需要像其它的交叉验证法那样需要 p p p次随机划分数据集进行 p p p次的实验)。
由于留一法的训练集只比整个数据集少一个样本,故往往认为留一法的评估结果比较准确(但不一定准确)。但是,它的缺陷也十分棘手:
- 可以看出,留一法需要训练的模型数量为 m m m个。当样本规模 m m m很大时,这显然会带来难以忍受的计算开销(如有一百万个样本,则需训练一百万个模型,再考虑上调参,计算开销十分恐怖)
- 留一法的估计结果未必永远比其他评估方法准确(No free lunch在这里同样适用)
2.2.3 自助法(适合小数据集)
背景:
我们希望评估的模型是用数据集 D D D训练的,但是对于之前的留出法和交叉验证法,我们都保留了一部分作为测试集,这样会引入样本规模不同导致的估计偏差。而留一法虽然相对来说样本规模带来的影响较小(训练集只少一个样本),但是计算复杂度太高。
基于以上背景问题,我们想要一种既能减少样本规模不同带来的影响,又能高效地进行实验估计的方法。而自助法(bootstrapping)是一个比较好的解决方案。
自助法直接以自助采样法(bootstrap sampling)为基础,即以有放回采样的方式采样出训练集 D ′ D' D′。
训练集
D
′
D'
D′显然可能会有重复的样本,且只采样了数据集
D
D
D中的部分数据。可这样做一个估计:样本在
m
m
m次采样后始终不被采样到的概率是
(
1
−
1
m
)
m
(1-\dfrac{1}{m})^m
(1−m1)m,对
m
m
m取极限得:
即通过自助采样,
D
D
D中大约有36.8%的样本未出现在
D
′
D'
D′中。于是我们用
D
′
D'
D′做训练集,用
D
D
D \
D
′
D'
D′做测试集。
由于 D ′ D' D′中可能有重复样本,它改变了初始数据集的分布,故引入了估计偏差。所以,自助法一般只有在数据集很小(一般为20个以下)时才会使用。当数据量足够时,留出法和交叉验证法更常用一些。
值得注意的是,自助法能从初始数据集中产生多个不同的训练集,这对集成学习等方法有很大的好处。
2.2.4 调参与最终模型
在进行模型评估与选择时,除了要对适用的学习算法进行选择,还需对算法参数进行设定,即调参。
机器学习涉及两类参数:
- 算法的参数,即超参数,数目常在10以内
- 模型的参数,数目可能很多
学习算法的很多参数是在实值范围内取值,因此对每种参数配置都训练出一个模型是不可行的。现实中的常见做法是在某个范围内以某个步长进行取值,则有若干个候选参数。显然,这样做得到的候选参数不是理论上的最优参数,这只是计算开销和性能估计之间的一种折中。而且即使是在这样的情况下,计算开销依旧很大。
强大的学习算法往往有很多参数需要设定,这将导致极大的调参工程量,以至于在不少应用任务中,参数调得好不好往往对最终模型的性能有关键性影响。
在模型选择完成后,学习算法和参数配置已选定,此时应该用数据集D重新训练模型。这个模型在训练过程中使用了全部的样本,这才是我们最终提交的模型。
训练集,测试集,验证集
对于数据集的划分,之前我们提到的是划分为训练集和测试集。我们用测试集上的泛化误差作为模型在面对新样本的误差的近似。对于训练集,我们这里再把它分出一部分数据作为验证集,基于验证集上的性能来做模型选择和调参。
2.3 性能度量(衡量模型泛化能力的标准)
前面节讲的是估计泛化误差的方法,而这一节讲的是衡量模型泛化能力的标准,这两个部分是对学习器泛化性能进行评估所必需的。
在对比不同模型的性能时,使用不同的性能度量往往会导致不同的评判结果,这意味着模型的评价是相对性能度量而言的。而性能度量则是根据任务需求来选择的。
即模型的评价不仅取决于算法和数据,还决定于任务需求。
如在预测任务中,要评估学习器的性能,就要把预测结果和真实标记进行比较。回归任务常用的性能度量是均方误差。
以下是对分类任务中常用的性能度量:
2.3.1 错误率与精度
对于数据集D:
错误率:
2.3.2 查准率、查全率与F1
错误率和精度虽然常用但不能满足所有任务的需求。如对于“挑出的西瓜有多少比例是好瓜”,“所有好瓜中有多少比例被挑出来了”,“检索出的信息有多少比例是用户感兴趣的”,“用户感兴趣的有多少被检索出来的了”等任务,错误率显然无法满足需求,需要其他的性能度量。
查全率(recall)和查准率(precision)是更为适用于此类需求的性能度量。
对于二分类问题,在对样本进行分类之后,产生了以下四种类型的样本:
- 真正例 T P TP TP
- 假正例 F P FP FP
- 真反例 T N TN TN
- 假反例
F
N
FN
FN
则查准率 P P P和查全率 R R R分别定义为:
查准率 P P P:所有预测为正例的样本中真正例的比例
查全率 R R R:所有真实标记为正例的样本( T P + F N TP+FN TP+FN)中被预测为正例的比例
一般来说,查全率高时,查准率往往偏低;查准率高时,查全率往往偏低。
可以这么想:
- 追求高查全率时,被预测为正例的样本数就偏多,极端情况是将所有样本都预测为正例,则查全率时100%
- 追求高查准率时,只将有把握的样本预测为正例,则会漏掉一些正例样本,使得查全率降低,极端情况是只选择最优把握的一个样本预测为正例,则查准率为100%
通常只有在一些简单的任务中,才可能使查全率和查准率都很高。
查准率-查全率曲线(P-R曲线)
按正例可能性将样本排序,依次将排序的样本作为正例计算出查全率和查准率,依次做P-R曲线图
上面的图和书中的图的主要区别在于曲线的两个端点,除非正例在样本占的比例极小,才有可能像书中的图一样最右查准率趋于0:
上图的每条曲线代表一个学习器,即根据每个学习器的分类结果绘制出各自的P-R曲线,可凭借以下两种方法比较学习器的性能优劣:
- 若曲线A包住了曲线B,则对应的学习器A性能优于学习器B
- 若曲线A和曲线B是交叉的情况,则计算曲线下的面积,更大的则对应的学习器性能更优,但这个值不太容易估算,故我们用一个综合考虑查准率和查全率的性能度量:平衡点(BEP),它是查准率=查全率时的取值,更大者对应的学习器更优。(对应上图学习器A优于学习器B)
但其实BEP还是过于简化了,更常用的是F1度量:
F1是基于查准率和查全率的调和平均定义的:
1
F
=
1
2
(
1
P
+
1
R
)
\dfrac{1}{F}=\dfrac{1}{2}(\dfrac{1}{P}+\dfrac{1}{R})
F1=21(P1+R1)
但是在一些应用中,我们对查准率查全率的重视程度不同,此时F1则不满足我们对查准率或查全率的偏好。
如:
- 推荐商品时希望在尽可能少打扰客户的前提下推荐的商品是用户感兴趣的,此时查准率更重要
- 逃犯信息检索系统中,更希望尽可能少漏掉逃犯,此时查全率更重要
F1度量的一般形式——
F
β
F_\beta
Fβ,能让我们表达出对查准率/查全率的偏好:
F
β
F_\beta
Fβ是加权调和平均
1
F
β
=
1
1
+
β
2
(
1
P
+
β
2
R
)
\dfrac{1}{F_\beta}=\dfrac{1}{1+\beta^2}(\dfrac{1}{P}+\dfrac{\beta^2}{R})
Fβ1=1+β21(P1+Rβ2)
β
>
0
\beta>0
β>0度量了查全率对查准率的相对重要性:
- β = 1 \beta=1 β=1退化成了标准F1
- β < 1 \beta<1 β<1则偏好于查准率
-
β
>
1
\beta>1
β>1则偏好于查全率
注:与算术平均和几何平均相比,加权调和平均更注重较小值
以上是针对于只有一个二分类混淆矩阵(只针对一个数据集进行了一次分类操作)的情况进行的讨论,在现实任务中,我们有以下情况会希望在多个二分类混淆矩阵上综合考察查准率和查全率:
- 多次进行训练/测试
- 在多个数据集上进行训练/测试,希望估算算法的全局性能
- 多分类任务,每两两类别的组合都对应一个混淆矩阵
面对多个二分类混淆矩阵,主要有以下两种做法:
-
先在各个混淆矩阵上计算出查准率和查全率,记为 ( P 1 , R 1 ) ( P 2 , R 2 ) , . . . , ( P n , R n ) (P_1,R_1)(P_2,R_2),...,(P_n,R_n) (P1,R1)(P2,R2),...,(Pn,Rn),再计算平均值,这样得到的即为宏查准率(macro-P),宏查全率(macro-R),以及对应的宏F1(macro-F1):
-
先将各个混淆矩阵的元素进行平均,得到 T P , F P , T N , F N TP,FP,TN,FN TP,FP,TN,FN的平均值 T P ‾ , F P ‾ , T N ‾ , F N ‾ \overline{TP}, \overline{FP},\overline{TN},\overline{FN} TP,FP,TN,FN,再基于这些平均值算出微查准率(micro-P),微查全率(micro-R),微F1(micro-F1)
2.3.3 ROC与AUC
我们通过学习器可得到样本对应的预测实值或概率值,将这个预测值与一个分类阈值进行比较,大于阈值为正类,小于则为反类。
根据预测实值或概率值,我们可将样本排序,于是越有可能是正例的样本排在越前面。分类过程就相当于在这个排序中以某个截断点(即阈值)将样本分为两部分,前一部分判作正例,后一部分判作反例。
根据任务需求我们对查准率和查全率有不同的偏好,对此我们采取不同的截断点:
- 偏好查准率:选择靠前的位置进行截断
- 偏好查全率:选择靠后的位置进行截断
ROC(Receiver Operating Characteristic)全称是“受试者工作特征”曲线,与P-R曲线相似,我们根据预测值进行排序,按此顺序逐个把样本作为正例进行预测,每次计算出真正例和假正例,以它们为坐标作图。
ROC图的横坐标轴为假正例率,纵坐标轴为真正例率
逐个将样本作为正例进行计算,更改的步长为
1
m
+
和
1
m
−
\dfrac{1}{m^+}和\dfrac{1}{m^-}
m+1和m−1,具体步骤如下:
- 初始时假正例率和真正例率都为0
- 然后依次将每个样本作为正例:若当前样本为真正例,则
真
正
例
率
+
1
m
+
真正例率+\dfrac{1}{m^+}
真正例率+m+1,也即对应标记点变为
(
x
,
y
+
1
m
+
)
(x,y+\dfrac{1}{m^+})
(x,y+m+1);若当前样本为假正例,则
假
正
例
率
+
1
m
−
假正例率+\dfrac{1}{m^-}
假正例率+m−1,即对应标记点坐标变为
(
x
+
1
m
−
,
y
)
(x+\dfrac{1}{m^-},y)
(x+m−1,y)
例子如下:
通过ROC曲线对学习器进行比较的判别标准与P-R曲线类似: - 曲线A包住曲线B,则学习器A优于学习器B
- 若两曲线交叉,则比较ROC曲线下的面积,即AUC
注:该公式就是在计算每一个个小矩形之和,从而求出AUC的大小
注: - m + m − m^+m^- m+m−:所有正反例组合对的组合数量
- 正例对应的预测值应该大于反例对应的预测值,故有公式所示的罚分(其实也是根据ROC曲线之上的面积才有的罚分);显然, l r a n k l_{rank} lrank越小越好
- 对于式(2.22)可以这样理解AUC:任取一对正例反例,正例预测值大于反例预测值的概率;显然,AUC越大越好
2.3.4 代价敏感错误率和代价曲线
之前介绍的性能度量大都隐式地假设了均等代价,如错误率是直接计算错误次数,而没有考虑不同错误所造成的不同后果
为衡量不同错误类型所造成的不同损失,可为错误赋予“非均等代价”(unequal cost);在非均等代价下,我们不再简单地希望最小化错误次数,而是最小化总体代价
同样的,在非均等代价下,ROC曲线显然也不满足总体代价的要求,于是引入代价曲线:
- 横轴:取值为[0,1]的正例概率代价 P ( + ) c o s t P(+){cost} P(+)cost
- 纵轴:取值为[0,1]的均一化代价 c o s t n o r m cost_{norm} costnorm
横轴为正例概率代价
P
(
+
)
c
o
s
t
P(+){cost}
P(+)cost:
注:对于式(2.25)的推导:
代价曲线的绘制:
要点:ROC曲线上的每一点对应了代价曲线上的一条线段
- 设ROC曲线上的点坐标为(FPR,TPR),则可相应计算出FNR,于是它对应的线段为从(0,FPR)到(1,FNR)的线段,线段下的面积则表示了该条件下的期望总体代价
- 按照1将ROC曲线上的所有点都绘制出对应的每条线段
- 所有线段的下界围成的面积即为所有条件下的期望总体代价
2.4 比较检验
前面讲述的是实验评估方法和性能度量,但是单凭这两个就相对学习器进行性能评估还是不够的,原因在于:
- 我们要评估的是学习器的泛化能力,而通过实验评估方法得到的是测试集上的性能,两者的对比结果可能未必相同
- 测试集上的性能与测试集的选择有很大的关系,不同的测试集测试结果不一样
- 很多学习器本身具有随机性,运行多次结果也会不同
这里,我们可以运用统计假设检验(hypothesis test)来佐证我们的性能评估结果
例如,我们在测试集上观察到学习器A性能优于学习器B,则基于统计假设检验结果我们可以推断出A的泛化性能是否在统计意义上优于B,以及这个结论的把握有多大
以下是两种最基本的假设检验方法(性能度量默认为错误率):
2.4.1 假设检验
假设检验中的假设是对学习器泛化错误率分布的某种判断或猜想。这里,虽然我们只能得到测试集上的测试错误率而不是泛化错误率,但是相差很远的可能性较小,相差很近的可能性较大(这种思路很值得学习),所以我们可以用测试错误率估算推出泛化误差率的分布
2.4.2 交叉验证t检验
2.5 方差与偏差
我们可以通过实验估计学习算法的泛化性能,同时我们也希望了解为什么该算法具有这样的性能
偏差-方差分解(bias-variance decomposition)是解释学习算法泛化性能的一种重要工具。具体操作是将学习算法的期望泛化错误率进行拆解
以下是推导过程:
注:不考虑噪声,偏差很大可以认为是欠拟合引起的;方差很大可以认为是过拟合引起的
对算法的期望误差进行分解:
式(2.41)的推导不难,以下主要是对其中的两处“最后项为0”进行推导:
也就是说,泛化误差可分解为方差、偏差与噪声之和
回顾偏差、方差和噪声的含义:
- 偏差(2.40)度量了学习算法的期望预测与真实结果的偏离程度,即刻画了学习算法本身的拟合能力
- 方差(2.38)度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动所造成的影响
- 噪声(2.39)则表达了在当前任务上任何学习算法所能达到的期望泛化误差的下界,即刻画了学习问题本身的难度
本节重要结论
泛化误差可分解为偏差、方差与噪声之和
偏差-方差分解说明,泛化性能是由学习算法的能力、数据的充分性和学习任务本身的难度所共同决定的
给定学习任务,为了取得较好的泛化性能,需使方差较小(即使得数据扰动产生的影响小),需使偏差较小(即能够充分拟合数据)
由泛化误差的分解可以看出,我们只需使得偏差和方差都尽量小即可获得较优的泛化性能。但是,一般来说,偏差和方差是有冲突的(不考虑噪声,偏差很大可以认为是欠拟合引起的;方差很大可以认为是过拟合引起的),即偏差-方差窘境。
注:泛化误差为最上面那条曲线
上图的意思是:假设我们能控制算法的训练程度,当训练程度不足(欠拟合),此时由偏差主导了泛化误差率;随着训练程度加深,学习器的拟合能力逐渐增强,训练数据发生的扰动能被学习器学习到,方差逐渐主导了泛化误差率(不考虑噪声,偏差很大可以认为是欠拟合引起的;方差很大可以认为是过拟合引起的)