1. 模型评估与选择
sklearn手册
1.1. 经验误差与过拟合
-
错误率:分类错误的样本占样本总数的比例(m
个样本中的a个样本分类错误,则错误率E=a/m)
-
精度:1−a/m,即精度=1-错误率
-
误差(期望):学习器的实际预测输出与样本的真是输出之间的差异
- 训练(经验)误差:训练集上
- 测试误差:测试集
- 泛化误差:除训练集外所有样本
-
过拟合(不可避免):学习器把训练样本本身特点当做所有潜在样本都会具有的一般性质,导致泛化性能降低(学习能力过于强大)
不可能避免的原因

-
欠拟合:训练样本的一般性质尚未被学习器学好(学习能力底下)
1.2. 评估方法
-
评估考虑的主要因素:
现实任务中往往会对学习器的泛化性能、时间开销、存储开销、可解释性等方面的因素进行评估并做出选择
-
评估样本选取原则:
我们假设测试集是从样本真实分布中独立采样获得,将测试集上的“测试误差”作为泛化误差的近似,所以测试集要和训练集中的样本互斥。
-
单一数集分类方法
包含m个样例的数据集D={(x1,y1),(x2,y2),…,(xm,ym)}
- 留出去(hold-out)
- 直接将数据集划分为两个互斥集合,训练集S和测试集T,即D=S∪T,S∩T=∅
- 在S上训练,在T上来评估其测试误差,作为对泛化误差的估计
- 训练/测试集划分要尽可能保持数据分布的一致性
- 一般若干次随机划分、重复实验取平均值
- 训练/测试样本比例通常为2:1至4:1
- 交叉验证法(cross validation,k折交叉验证,k-foad)
- 将数据集分层采样划分为k个大小相似的互斥子集,每次用k−1个子集的并集作为训练集,余下的子集作为测试集,最终返回k个测试结果的均值,k最常用的取值是10.D=D1∪D2∪…∪Dk,Di∩Dj=∅(i=j)
- 交叉验证法评估结果的稳定性和保真性在很大程度上取决于k的取值
- 与留出法类似,将数据集D划分为k个子集同样存在多种划分方式,为了减小因样本划分不同而引入的差别,k折交叉验证通常随机使用不同的划分重复p次,最终的评估结果是这p次k折交叉验证结果的均值,例如常见的“10次10折交叉验证”
- 假设数据集D包含m个样本,若令k=m,则得到留一法(leave-one-out):
- 不受随机样本划分方式的影响
- 结果往往比较准确
- 当数据集比较大时,计算开销难以忍受
- 自助法(bootstrapping,包外估计)
以自助采样法为基础,对数据集D有放回采样m次得到训练集D′, D\D′用做测试集。
- 实际模型与预期模型都使用m个训练样本
- 约有1/3的样本没在训练集中出现
m次采样始终不被采到的概率为(1−m1)m,去极限为
m→∞lim(1−m1)m=e1≈0.368

- 优缺点
- 在数据集较小、难以有效划分训练/测试集时很有用
- 能从初始数据集中产生多个不同的训练集,对于集成学习等方法有很大的好处
- 改变了初始数据集的分布,会引入估计偏差。在数据量足够时,留出法和交叉验证法更常用。
-
调参与最终模型
- 最终模型
给定包含m个样本的数据集D,在模型评估与选择过程中由于需要留出一部分数据进行评估测试,事实上我们只使用了一部分数据训练模型.因此,在模型选择完成后,学习算法和参数配置已选定,此时应该用数据集D重新训练模型.这个模型在训练过程中使用了所有m个样本,这才是我们最终提交给用户的模型.
- 调参
- 大多数机器学习模型有参数,不同参数的模型性能不同,需要调参
- 调参的遍历成本太高,有时需要折中
- 验证集(validation set):从训练数据中划分
用测试集上的判别效果来估计模型在实际使用时的泛化能力,而把训练数据另外划分为训练集和验证集,基于验证集上的性能来进行模型选择和调参.
1.3. 性能度量
学习器泛化性能评估
- 行之有效的实验评估方法
- 衡量模型泛化能力的评价标准(性能度量)
- 反映了任务需求,在对比不同模型的能力时,使用不同的性能度量往往会导致不同的评判结果
在预测任务中,给定样例集D={(x1,y1),(x2,y2),…,(xm,ym)},其中yi是示例xi的真实标记。评估学习器f的性能,就要把学习器预测结果f(X)与真实标记y进行比较
1.3.1. 回归
- 均方误差
回归任务最常用的
E(f;D)=m1i=1∑m(f(xi)−yi)2
一般化:数据分布D和概率密度函数p(⋅)
E(f;D)=∫x∼D(f(x)−y)2p(x)dx
1.3.2. 分类
1.3.2.1. 二分类
二分类结果混淆矩阵
真实情况 |
预测结果 |
正例 |
反例 |
正例 |
TP(真正例) |
FN(假反例) |
反例 |
FP(假正例) |
TN(真反例) |
-
错误率:分类错误的样本数占样本总数的比例
E(f;D)=m1i=1∑mI(f(xi)=yi)
一般化:数据分布D和概率密度函数p(⋅)
E(f;D)=∫x∼DI(f(x)=y)p(x)dx
-
精度:分类正确的样本数占样本总数的比例
acc(f;D)=m1i=1∑mI(f(xi)=yi)=1−E(f;D)
一般化:数据分布D和概率密度函数p(⋅)
acc(f;D)=∫x∼DI(f(x)=y)p(x)dx=1−E(f;D)
-
查准率(precision,准确率):真正例占预测正例的比例
P=TP+FPTP
衡量模型避免错误的能力
-
查全率(recall,召回率):真正例占真实正例的比例
P=TP+FNTP
衡量模型避免缺漏的能力
一般查准率高时,查全率往往偏低;查全率高时,查准率往往偏低。不同问题需要侧重不同
- 真正例率(True Positive Rate,简称TPR)
TPR=TP+FNTP=m+TP
- 假正例率(False Positive Rate,简称FPR)
FPR=TN+FPFP=m−FP
真正例率与假正例率用于ROC曲线
-
二分类代价矩阵
为权衡不同类型错误所造成的不同损失,可为错误赋予非均等代价(unequal cost)

其中costij表示将第i类样本预测为第j类样本的代价,造成的损失越大,值越大(重要的是代缴的比值而非绝对值)
-
代价敏感错误率
在非均等代价下,不再最小化错误次数,而是最小化“总体代价
E(f;D;cost)=m1(xi∈D+∑I(f(xi)=yi)×cost01+xi∈D−∑I(f(xi)=yi)×cost10)
-
正例概率代价(取值为[0,1])
P(+)cost=p×cost01+(1−p)×cost10p×cost01其中p为样例为正例的概率
-
归一化代价(取值为[0,1])
costnorm=p×cost01+(1−p)×cost10 FNR ×p×cost01+FPR×(1−p)×cost10
二分类代价矩阵、代价敏感错误率、正例概率代价、归一化代价用于构建代价曲线
1.3.2.2. 多分类
多分类结果的混淆矩阵

很多时候我们有多个二分类混淆矩阵,例如进行多次训练/测试,每次得到一个混淆矩阵;或是在多个数据集上进行训练/测试,希望估计算法的“全局”
性能;甚或是执行多分类任务,每两两类别的组合都对应一个混淆矩阵;
希望在n个二分类混淆矩阵上综合考察查准率和查全率.在各混淆矩阵上分别计算出查准率和查全率为(P1,R1),(P2,R2),…,(Pn,Rn)
-
直接各混淆矩阵上分别计算出查准率和查全率,
- 宏查准率(macro-P)
macro-P=n1i=1∑nPi
- 宏查全率(macro-R)
macro-R=n1i=1∑nRi
- 宏F1(macro-F1)
macro-F1=macro-P+macro-R2×macro-P×macro-R
-
将各混淆矩阵的对应元素进行平均,得到TP,FP,TN,FN的平均值,记为TP,FP,TN,FN
- 微查准率
micro−P=TP+FPTP
- 微查全率
micro−R=TP+FNTP
- 微F1
micro-F1=micro-P+micro-R2×micro-P×micro-R
1.3.2.3. 学习器评估
|
P-R曲线 |
ROC曲线 |
代价曲线 |
横轴 |
查全率R |
假正例率FPR |
正例概率代价 |
纵轴 |
查准率P |
真正例率TPR |
归一化代价 |
绘图过程 |
根据学习器的预测结果按正例可能性大小对样例进行排序,并逐个把样本作为正例进行预测,则可以得到 |
给定个m+正例和m−个负例,根据学习器预测结果对样例进行排序,将分类阈值设为每个样例的预测值,当前标记点坐标为(x,y),当前若为真正例,则对应标记点的坐标为(x,y+1/m+);当前若为假正例,则对应标记点的坐标为(x+1/m−,y),然后用线段连接相邻点 |
ROC曲线上每一点对应了代价平面上的一条线段,设ROC曲线上点的坐标为(TPR,FPR),则可相应计算出FNR,然后在代价平面上绘制一条从(0,FPR)到(1,FNR)的线段,线段下的面积即表示了该条件下的期望总体代价;如此将ROC曲线上的每个点转化为代价平面上的一条线段,然后取所有线段的下界,围成的面积即为在所有条件下学习器的期望总体代价 |
曲线相包 |
取外者 |
取外者 |
|
曲线相交 |
根据度量条件 |
根据度量条件 |
|
度量条件 |
平衡点BEP、F1、Fβ
|
AUC |
下方面积 |
均等代价 |
是 |
是 |
否 |
-
“P-R曲线”(查准率-查全率曲线)

- 学习器包含:例如A的性能比C的性能好
- 学习器相交:很难断言两者孰优孰劣,
- 所包面积:较难执行
-
平衡点BEP:曲线上“查准率=查全率”时的取值,可用来用于度量P-R曲线有交叉的分类器性能高低(过于简化)
-
F1:基于查准率与查全率的调和平均定义(F11=21⋅(P1+R1))
F1=P+R2×P×R=样例总数+TP−TN2×TP
-
Fβ:基于加权调和平均(Fβ1=1+β21⋅(P1+Rβ2),与算术平均2P+R和几何平均P×R更重视较小值)
Fβ=(β2×P)+R(1+β2)×P×R
-
β>0度量了查全率对查准率的相对重要性;β>1偏重查全率;β<1偏重查准率
-
ROC曲线(受试者工作特征)

- 学习器包含:被包住的学习器差
- 学习器相交:很难断言两者孰优孰劣
- AUC(Area Under ROC Cureve):比较ROC曲线下的面积,AUC衡量了样本预测的排序质量。
-
曲线面积计算
ROC曲线由坐标{(x1,y1),(x2,y2),…,(xm,ym)}的点按序连接而形成(x1=0,xm=1)
AUC=21i=1∑m−1(xi+1−xi)⋅(yi+yi+1)
-
排序损失计算
m+个正例和m−个负例,令D+和D−分别表示正、反例集合;则排序损失
ℓrank=m+m−1x+∈D+∑x−∈D−∑(I(f(x+)<f(x−))+21I(f(x+)=f(x−)))
即考虑每一对正、反例,若正例的预测值小于反例,则记一个“罚分”,若相等,则记0.5个“罚分”.容易看出,ℓrank对应的是ROC曲线之上的面积:若一个正例在ROC曲线上对应标记点的坐标为(x,y),则x恰是排序在其之前的反例所占的比例,即假正例率。因此有
AUC=1−ℓrank
-
代价曲线

- 面积即为在所有条件下学习器的期望总体代价,所以比较为比面积
1.4. 比较检验
直接选取相应评估方法在相应度量下比大小的方法不可取!
- 测试性能并不等于泛化性能
- 测试性能随着测试集的变化而变化
- 很多机器学习算法本身有一定的随机性
假设检验为学习器性能比较提供了重要依据,基于其结果我们可以推断出若在测试集上观察到学习器A比B好,则A的泛化性能是否在统计意义上优于B,以及这个结论的把握有多大。
假设检验中的“假设”是对学习器泛化错误率分布的某种判断或猜想;错误率为性能度量,用ϵ表示
可根据测试错误率估推出泛化错误率的分布
现实任务中我们并不知道学习器的泛化错误率,只能获知其测试错误率.泛化错误率与测试错误率未必相同,但直观上,二者接近的可能性应比较大,相差很远的可能性比较小.
1.4.1. 单个学习器泛化性能
1.4.1.1. 二项检验
记泛化错误率为ϵ,测试错误率为ϵ^(m个样本中恰有ϵ^×m个被误分类)
假定测试样本从样本总体分布中独立采样而来,可以使用“二项检验”对ϵ≤ϵ0进行假设检验。
泛化错误率为ϵ的学习器将其中m′个样本误分类、其余样本全部都分类正确的概率为ϵm′(1−ϵ)m−m′;由此可估算出其恰将ϵ^×m个样本误分类的概率为
P(ϵ^;ϵ)=(mϵ^×m)ϵϵ^×m(1−ϵ)m−e^×m
表示在包含m个样本的测试集上,泛化错误率为ϵ的学习器被测得测试错误率为ϵ^的概率
给定测试错误率,则解∂P(ϵ^;ϵ)/∂ϵ=0可知,P(ϵ^;ϵ)在ϵ=ϵ^时最大,∣ϵ−ϵ^∣增大时P(ϵ^;ϵ)减小,这符合二项(binomial)分布,
假设ϵ≤ϵ0,若测试错误率小于
ϵˉ=maxϵ s.t. i=ϵ0×m+1∑m(mi)ϵi(1−ϵ)m−i<α
则在α的显著度下,假设不能被拒绝, 也即能以1−α的置信度认为,模型的泛化错误率不大于ϵ0,即在α的显著度下可认为学习器的泛化错误率大于ϵ0
1.4.1.2. t检验
- 假定得到了k个测试错误率,ϵ^1,ϵ^2,…,ϵ^k, 平均错误率μ与方差σ2
μσ2=k1i=1∑kϵ^i=k−11i=1∑k(ϵ^i−μ)2
- 考虑到这k个测试错误率可看作泛化错误率ϵ0的独立采样,则变量τt=σk(μ−ϵ0)服从自由度为k−1的t分布
- 假设ϵ=ϵ0,,对于显著度α,若[t−α/2,tα/2]位于临界范围∣μ−ϵ0∣内,则假设不能被拒绝,即可认为泛化错误率ϵ=ϵ0,其置信度为1−α.
1.4.2. 不同学习器比较
1.4.2.1. 交叉验证t检验
- 两个学习器A,B
- k折交叉验证法得到测试错误率分别为ϵ1A,ϵ2A,…,ϵkA 和 ϵ1B,ϵ2B,…,ϵkB,其中ϵiA,ϵiB实在相同的第i折训练/测试集上得到的结果
- k折交叉验证“成对t检验”(paired t-tests)进行比较检验
- 基本思想:若两学习器性能相同,则它们使用相同的训练/测试集得到的测试错误率应相同ϵiA=ϵiB
- 过程
- 对k折交叉验证产生的k对测试错误率:先对每对结果求差Δi=ϵiA−ϵiB,若两个学习器性能相同,则差值应该为0
- 根据差值Δ1,Δ2,…,Δk来对“学习器A与B性能相同”这个假设做t检验。
- 计算出差值的均值μ和方差σ2
- 在显著度α下,若变量
τt=∣∣∣∣∣σkμ∣∣∣∣∣
小于临界值tα/2,k−1(自由度为k−1的t分布上尾部累计分布为α/2的临界值),则假设不能被拒绝;即认为两个学习器的性能没有显著差别。反之则有显著差别,且平均错误率较小的哪个学习器性能较优。
- 前提:测试错误率为泛化错误率的独立采样,然而由于样本有限,使用交叉验证导致训练集重叠,测试错误率并不独立,从而过高估计假设成立的概率,
- 缓解方法:采用“5×2交叉验证”法
所谓5×2折交叉验证就是做5次二折交叉验证,每次二折交叉验证之前将数据打乱,使得5次交叉验证中的数据划分不重复。为缓解测试数据错误率的非独立性,仅计算第一次2折交叉验证结果的平均值μ=0.5(Δ11+Δ12)和每次二折实验计算得到的方差σi2=(Δi1−2Δi1+Δi2)2+(Δi2−2Δi1+Δi2)2,则变量
τt=0.2∑i=15σi2μ
服从自由度为5的t分布。
1.4.2.2. McNemar检验
两学习器分类差别列联表

假设两学习器性能相同,则应有e01=e10,那么变量∣e01−e10∣应当服从正态分布,且均值为1,方差为e01+e10,因此变量τχ2=e01+e10(∣e01−e10∣−1)2服从自由度为1的χ2分布,即标准正态分布变量的平方
给定显著度α,当以上变量值小于临界值χα2。时,不能拒绝假设,即认为两学习器的性能没有显著差别;否则拒绝假设,即认为两者性能有显著差别,且平均错误率较小的那个学习器性能较优.
1.4.2.3. Friedman检验
1.4.2.4. Nemenyi后续检验
1.5. 偏差与方差
- 通过实验可以估计学习算法的泛化性能
- 偏差-方差分解用来帮助解释泛化性能;是解释学习算法泛化性能的一种重要工具
对测试样本x,令
-
yD为x在数据集中的标记
-
y为x的真实标记
-
f(x;D)为训练集D上学得模型f在x上的预测输出
-
回归任务为例
-
学习算法的期望预测为
fˉ(x)=ED[f(x;D)]
-
使用养不熟木相同的不同训练集产生的方差为
var(x)=ED[(f(x;D)−fˉ(x))2]
-
噪声为
ε2=ED[(yD−y)2]
-
偏差:期望输出与真实标记的差别
bias2(x)=(fˉ(x)−y)2
-
假定噪声期望为0,即ED[(yD−y)]=0
E(f;D)=======ED[(f(x;D)−yD)2]ED[(f(x;D)−fˉ(x)+fˉ(x)−yD)2]ED[(f(x;D)−fˉ(x))2]+ED[(fˉ(x)−yD)2]+ED[2(f(x;D)−fˉ(x))(fˉ(x)−yD)]ED[(f(x;D)−fˉ(x))2]+ED[(fˉ(x)−yD)2]ED[(f(x;D)−fˉ(x))2]+ED[(fˉ(x)−y+y−yD)2]ED[(f(x;D)−fˉ(x))2]+ED[(fˉ(x)−y)2]+ED[(y−yD)2]+2ED[(fˉ(x)−y)(y−yD)]ED[(f(x;D)−fˉ(x))2]+(fˉ(x)−y)2+ED[(yD−y)2]
即
E(f;D)=bias2(x)+var(x)+ε2
泛化误差可分解为偏差、方差、噪声
-
偏差度量了学习算法期望预测与真实结果的偏离程度;即刻画了学习算法本身的拟合能力;
-
方差度量了同样大小训练集的变动所导致的学习性能的变化;即刻画了数据扰动所造成的影响;
-
噪声表达了在当前任务上任何学习算法所能达到的期望泛化误差的下界;即刻画了学习问题本身的难度。
-
偏差-方差分解说明泛化性能是由学习算法的能力、数据的充分性以及学习任务本身的难度所共同决定的。给定学习任务为了取得好的泛化性能,需要使偏差小(充分拟合数据)而且方差较小(减少数据扰动产生的影响)
-
偏差-方差窘境:偏差与方差有冲突

-
训练不足时,学习器拟合能力不强,训练数据的扰动不足以使学习器的拟合能力产生显著变化,此时偏差主导泛化错误率;
- 随着训练程度加深,学习器拟合能力逐渐增强,方差逐渐主导泛化错误率;
-
训练充足后,学习器的拟合能力非常强,训练数据的轻微扰动都会导致学习器的显著变化,若训练数据自身非全局特性被学到则会发生过拟合。