开始学习时间:2020/1/14
作者: 谭楷城
我们实际希望得到的是从新样本上能表现得很好的学习器,即泛化误差小。为了达到这个目的,应该从训练样本中尽可能学出适用于所有潜在样本的“普遍规律”。
学习器把训练样本学得太好了的时候,很可能已经把训练样本自身的一些特点当作了所有潜在样本都会具有的一般性质。称之为“过拟合”(overfitting)。相对地,还没有学好训练样本中的一般性质称为“欠拟合”(underfitting)。
简述之,过拟合就是“过配”,欠拟合就是“欠配”。
过拟合的必然存在性
机器学习面临的问题通常是NP难甚至更难,而有效的学习算法必然是在多项式时间内运行完成。若可以彻底避免过拟合,则通过经验误差最小化就能获得最优解。这就意味着我们构造性的证明了P=NP。因此只要相信P ≠ \neq =NP,那么过拟合则不可避免。
在计算机领域,一般可以将问题分为可解问题和不可解问题。不可解问题也可以分为两类:一类如停机问题,的确无解;另一类虽然有解,但时间复杂度很高。可解问题也分为多项式问题(Polynomial Problem,P问题)和非确定性多项式问题(NondeterministicPolynomial Problem,NP问题)
P类问题:可以找到一个多项式时间复杂度的算法去解决的问题;
NP类问题:可以在多项式时间复杂度的算法去验证结果正确性的问题;比如随便拿一个结果,可在多项式时间内验证该结果是否正确,但是想要求解该结果的时间复杂度就不知道了。P类问题一定是NP类问题,但是NP类问题不一定能找到多项式时间复杂度的算法来解决(要是找到了就是P问题了)。所以人们关心的是:是否所有的NP问题都是P问题,即是否有 P=NP(信息学的巅峰问题)
P ∈ \in ∈NP
通过实验测试来对学习器的泛化误差进行评估并进而做出选择。为此,需要使用一个"测试集"(testing set)来测试学习器对新样本的判别能力,然后以测试集上的测试误差(testing error)来作为泛化误差的近似。
现在有包含m个样例的数据集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ , ( x m , y m ) } D=\{(x_1,y_1),(x_2,y_2),\cdots,(x_m,y_m)\} D={(x1,y1),(x2,y2),⋯,(xm,ym)},既要训练,又要测试,如何做到?
答案:对 D D D进行适当的处理,从中产生出训练集 S S S和测试集 T T T。
将数据集 D D D划分成两个互斥的集合。( D = S ∪ T D = S\cup T D=S∪T , S ∩ T = ∅ S\cap T=\varnothing S∩T=∅)
在训练集 S S S训练得到模型后用 T T T评估其测试误差。
如分类任务中至少要保持样本的类别比例相似。
若是从采样(sampling)的角度来看待数据集划分,保留类别比例的采样方式通常称为分层采样(stratified sampling)。例如:
对 D D D进行分层采样,获得70%样本的训练集 S S S和30%样本的测试集 T T T。
保持样本分布的一致性,若样本集 D D D包含500个正例和500个反例,则分层采样得到的 S S S应该包含350个正例,350个反例,而 T T T包含150个正例和150个反例。
对于分层采样选取比例,如果测试集 T T T比较小,评估结果可能不够稳定准确。若 T T T多包含一些样本,训练集 S S S与 D D D的差别更大了,降低了评估结果的保真性(fidelity)。这个问题没有完美的解决方案,常见做法是将大约2/3~4/5的样本用来训练,剩余的样本用于测试。
当然,分割的方式有许多种。为了减少分割方式带来的差异,一般要采用若干次随机划分、重复进行实验评估后取平均值作为留出法的评估结果。例如上面例子中,就可以进行100次随机划分,每次产生一个训练/测试集用于实验评估,100次后就得到100个结果,而留出法返回的则是这100个结果的平均。同时也可以也可以得到估计结果的标准差。
先将数据集 D D D划分为 k k k个大小相似的互斥子集并尽可能保持数据分布的一致性(分层采样)。然后每次用k-1个子集的并集作为训练集,余下的那个子集作为测试集。这样就获得了 k k k组的训练集和测试集,然后就进行 k k k次训练。
返回的是 k k k个测试结果的均值。交叉验证法评估结果的稳定性和保真性很大程度上取决于 k k k的取值。
通常也把交叉验证法称为 k k k折交叉验证(k-fold cross validation)。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pS0eRsQM-1580636139645)(C:\Users\HP\Desktop\学习笔记\交叉验证法.png)]
常用的 k k k的取值是10,此外还有5,20等。
当然,交叉验证法同样存在多种划分方式。为了减小因为样本划分不同而引入的差别,k折交叉验证也要随机使用不同的划分重复p次。常见的有 p = 10 p=10 p=10,即10次10折交叉验证。
特殊地,当 k = m k=m k=m折数等于样本个数(即每个样本作为一折)就得到了交叉验证法的一个特例留一法(Leave-One-Out,简称LOO)。留一法不受随机样本划分方式的影响。
优点是被实际评估的模型与期望评估用D训练出的模型很相似,评估结果往往被认为比较准确。
缺点是在数据集比较大时计算开销大。
NFL定理说明,得到的模型不一定比其他模型好。
以自助采样法为基础,由数据集 D D D采样得到 D ′ D' D′:
优缺点
参数调节(parameter tuning)
学习算法的很多参数都是在实属范围内取值,因此对每种参数配置都训练出模型来是不可行的。
现实中常用的做法是对每个参数选定一个范围和变化步长。eg: 在[0,0.2]范围内以0.05为步长,则实际要评估的候选参数数值有5个。这是在计算开销和性能估计之间进行折中的结果。
参数调的好不好往往对最终模型性能有关键性的影响。
最终模型
经过上面的两种评估方法,事实上我们只使用了一部分数据训练模型。因此,在模型选择完成后,学习算法和参数配置已选定,此时应该用数据集 D D D重新训练模型。这个使用了所有 m m m个样本的训练模型才是我们最终提交给用户的。
!概念区分
注意:为了加以区分,模型评估与选择中用于评估测试的数据集常称为验证集(validation set)。
我们通常把学得的模型在实际使用中遇到的数据称为测试数据,而把训练数据另外划分为训练集和验证集,基于验证集上的性能来进、
参数
上面介绍了一些实验估计方法,但是还需要衡量模型泛化能力的评价标准。
什么样的模型是好的不仅取决于算法和数据,还决定于任务需求。
在预测任务中,评估学习器 f f f的性能,就要把学习器和预测结果 f ( x ) f(x) f(x)与真实标记 y y y进行比较。
最常用的性能度量是均方误差(MSE, mean squared error)。
一般的,对于数据分布 D D D和概率密度函数 p ( ⋅ ) p(\cdot) p(⋅),均方误差可以描述为:
E ( f ; D ) = ∫ x ∼ D ( f ( x ) − y ) 2 p ( x ) d x E(f;D) = \int_{x \sim D}(f(x)-y)^2p(x)dx E(f;D)=∫x∼D(f(x)−y)2p(x)dx
错误率和精度是分类任务中最常用的两种性能度量。
分类错误率定义为:
E ( f ; D ) = 1 m ∑ i = 1 m II ( f ( x i ) ≠ y i ) E(f;D)=\frac{1}{m}\sum_{i=1}^{m}\textrm{II}(f(x_i)\neq y_i) E(f;D)=m1i=1∑mII(f(xi)=yi)
精度则定义为:
a c c ( f ; D ) = 1 − E ( f ; D ) acc(f;D)=1-E(f;D) acc(f;D)=1−E(f;D)
同样的,对于数据分布和概率密度函数,我们也只需要将指示函数乘以概率密度后积分得到错误率与精度。
错误率和精度不能满足所有任务需求。例如“所有的好瓜中有多少比例被挑了出来”,“检索出的信息中有多少比例是用户感兴趣的”之类的任务,查准率(precision)和查全率(recall)是更为适用于此类需求的性能度量。
有时候查准率也称为准确率,查全率也称为召回率。
真实情况与预测结果 | 预测结果为正例 | 预测结果为反例 |
---|---|---|
真实情况为正例 | TP | FN |
真实情况为反例 | FP | TN |
▶ \blacktriangleright ▶ 这些字母是true/false positive 还有 true/false negative 的简称。
查准率 P P P与查全率 R R R分别定义为:
P = T P T P + F P P=\frac{TP}{TP+FP} P=TP+FPTP
R = T P T P + F N R = \frac{TP}{TP+FN} R=TP+FNTP
查准率和查全率是一对矛盾的度量。一般来说,查准率高的时候,查全率往往偏低。而查全率高的时候,查准率往往偏低,除了一些简单的任务。
P-R曲线
我们根据学习器的预测结果对样例进行排序,排在最前面的则是最有可能是正例的样本,最后的则是最不可能是正例的样本。
按照这种顺序逐个把样本作为正例进行预测,则每次可以计算出当前的查全率、查准率,绘图得到P-R曲线:
当然,P-R曲线面积难以计算,人们又设计了一些综合考虑查准率和查全率的性能度量。
平衡点与F1度量
平衡点(Break-Even Point,BEP)是查准率=查全率时的取值。
BEP越大,说明曲线越靠近右上角,则下方面积越大。当然这还是过于简化了一点。
更常用的是F1度量。
F 1 = 2 × P × R P + R = 2 × T P 样 例 总 数 + T P − T N F1=\frac{2 \times P \times R}{P+R}=\frac{2\times TP}{样例总数+TP-TN} F1=P+R2×P×R=样例总数+TP−TN2×TP
F1是基于查准率和查全率的调和平均定义而成的。
调和平均数分为简单调和平均数和加权调和平均数。F1是简单调和平均数。
在一些应用中,查准率和查全率的重要程度有所不同。为表达出查准率/查全率的不同偏好,定义为加权调和平均
F β \large F_\beta Fβ。
F β = ( 1 + β 2 ) × P × R ( β 2 × P ) + R F_\beta=\frac{(1+\beta^2)\times P \times R}{(\beta^2 \times P)+R} Fβ=(β2×P)+R(1+β2)×P×R
其中, β > 0 \beta>0 β>0度量了查全率对查准率的相对重要性。 β > 1 \beta>1 β>1时,查全率有更大影响。 β < 1 \beta<1 β<1时,查准率有更大影响。
很多时候我们希望估计算法的全局性能,例如我们已经在多个数据集上进行训练、测试,有n个二分类混淆矩阵:
一种方法是计算各混淆矩阵的查准率与查全率的平均值,得到宏查准率(macro-P),宏查全率(macro-R)以及相应的宏F1(macro-F1)。
m a c r o − P = 1 n ∑ i = 1 n P i macro-P =\frac{1}{n}\sum_{i=1}^{n}P_i macro−P=n1i=1∑nPi
宏查全率、宏F1同理。
另一种方法是将混淆矩阵对应元素进行平均,得到TP、FP、TN、FN的平均值。再基于这些平均值计算微查准率(micro-P).微查全率(micro-R)和微F1(micro-F1):
m i c r o − P = T P ‾ T P ‾ + F P ‾ micro-P = \frac{\overline{TP}}{\overline{TP}+\overline{FP}} micro−P=TP+FPTP
微查全率,微F1同理。
很多学习器是为测试样本产生一个实值或概率预测,然后再与分类阈值(threshold)进行比较。大于阈值则分为正类,否则为反类。根据这个实值或者概率预测结果,将测试样本进行排序。最可能是正例的就放在最前面,最不可能的放在最后面,相当于以某个截断点(cut point)将样本分为两部分。截断点的位置取决于任务需求,例如重视查准率则位置靠前。
$\blacktriangleright $这种排序本身的质量好坏体现了综合考虑学习器在不同任务下的期望泛化性能的好坏。
ROC曲线
与P-R曲线一样,根据学习器的预测结果对样例进行排序,再按照这个顺序把样本作为正例进行预测,每次都计算真正例率(True Positive Rate,TPR)和假正例率(False Positive Rate, FPR)。
T P R = T P T P + F N TPR=\frac{TP}{TP+FN} TPR=TP+FNTP
F P R = F P T N + F P FPR=\frac{FP}{TN+FP} FPR=TN+FPFP
TPR作为纵轴,而FPR作为横轴。
算法的性能判断方法与P-R图类似。不同的是,发生交叉时,较为合理的判断依据是比较ROC曲线下的面AUC(Area Under ROC Curve)。
AUC可以估算为:
A U C = 1 2 ∑ i = 1 m − 1 ( x i + 1 − x i ) ⋅ ( y i + y i + 1 ) AUC=\frac{1}{2}\sum_{i=1}^{m-1}(x_{i+1}-x_i)\cdot(y_i+y_{i+1}) AUC=21i=1∑m−1(xi+1−xi)⋅(yi+yi+1)
令 D + , D − D^+,D^- D+,D−分别表示正反例集合,则排序损失(loss)定义为:
l r a n k = 1 m + m − ∑ x + ∈ D + ∑ x − ∈ D − ( I I ( f ( x + ) < f ( x − ) ) + 1 2 I I ( f ( x + ) = f ( x − ) ) ) l_{rank}=\frac{1}{m^+m^-}\sum_{x^+\in D^+}\sum_{x^-\in D^-}\Big(\rm II(f(x^+)
总结:若正例的预测值小于反例,则记一个罚分,若相等,则记0.5个罚分。并且可以看出, l r a n k l_{rank} lrank是ROC曲线之上的面积,故可以理解为假正例率,有:
A U C = 1 − l r a n k AUC=1-l_{rank} AUC=1−lrank
绘图过程
给定 m + m^+ m+个正例、 m − m^- m−个反例:
根据学习器预测结果对样例进行排序
设置分类阈值为最大(即预测所有样例为反例),此时真正例率和假正例率均为0.
在坐标(0,0)处标记一个点
将分类阈值依次设为每个样例的预测值(即依次将每个样例划分为正例)。
设前一个标记点坐标为 ( x , y ) (x,y) (x,y),当前若为真正例,则对应标记点的坐标为 ( x , y + 1 m + ) (x,y+\frac{1}{m^+}) (x,y+m+1)。
若为假正例,则对应标记点坐标为 ( x + 1 m − ) (x+\frac{1}{m^-}) (x+m−1)。 #点坐标表示TPR\FPR的增加
连接相邻点。
https://blog.csdn.net/Green2_0/article/details/83744119这篇文章对于理解ROC曲线有一定帮助,建议参考。
https://www.zhihu.com/question/265364451/answer/302612819对于AUC的计算以及理解有一定帮助,推荐参考。
问:为什么 1 m + ⋅ m − \cfrac{1}{m^+ \cdot m^-} m+⋅m−1就是ROC图的一个单位格呢?
个人理解:ROC曲线的绘图过程告诉我们,TPR最终增至1在于分类阈值调节至最大导致进入排序队列的样本越多,最终全部进入而增至1。FPR同理。因此,ROC图可划分为 m + ⋅ m − m^+ \cdot m^- m+⋅m−个单元格。
为了权衡不同类型错误所造成的不同损失,可为错误赋予“非均等代价”(unequal cost)。
代价矩阵(cost matrix)如下:
真实与预测类别 | 第0类 | 第1类 |
---|---|---|
第0类 | 0 | c o s t 01 cost_{01} cost01 |
第1类 | c o s t 10 cost_{10} cost10 | 0 |
之前的性能度量隐式地假设了均等代价,没有考虑不同错误会造成不同的后果。
因此在非均等代价下,最小化总体代价(total cost)比最小化错误次数更有意义。
代价敏感应用广泛:
代价曲线(cost curve)
横轴是取值为[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=\frac{p\times cost_{01}}{p\times cost_{01}+(1-p)\times cost_{10}} P(+)cost=p×cost01+(1−p)×cost10p×cost01
纵轴是取值为[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}=\frac{\mathbf{FNR}\times p \times cost_{01}+\mathbf{FPR} \times (1-p)\times cost_{10}}{p\times cost_{01}+(1-p)\times cost_{10}} costnorm=p×cost01+(1−p)×cost10FNR×p×cost01+FPR×(1−p)×cost10
F N R = 1 − T P R \mathbf{FNR=1-TPR} FNR=1−TPR
代价曲线的绘制
ROC曲线上每一点对应了代价平面上的一条线段,设ROC曲线上点的坐标为(FPR,TPR),则可以相应计算出FNR,然后在代价平面上绘制一条从(0,FPR)到(1,FNR)的线段,线段下的面积即表示了该条件下的期望总体代价。
如此,将ROC曲线上的每个点转化为代价平面上的一条线段,然后取所有线段的下界,围成面积即为在所有条件下学习器的期望总代价。
总结:期望总体代价由ROC曲线中每一个点计算FNR,根据FNR绘制线段得到与x轴围成面积。
至于为什么代价曲线下就是期望总体代价,我觉得可以用积分思想理解,但是并不严谨。