如果在 m 个样本中有 a 个样本分类错误,则错误率 E= a/m; 相应的,精度为1 - a/m 。
我们将学习器对样本的实际预测结果与样本的真实值之间的差异成为:误差(error)。定义:
显然,我们希望得到的是在新样本上表现得很好的学习器,即泛化误差小的学习器。因此,我们应该让学习器尽可能地从训练集中学出普适性的“一般特征”,这样在遇到新样本时才能做出正确的判别。然而,当学习器把训练集学得“太好”的时候,即把一些训练样本的自身特点当做了普遍特征;同时也有学习能力不足的情况,即训练集的基本特征都没有学习出来。我们定义:
可以得知:在过拟合问题中,训练误差十分小,但测试误差较大;在欠拟合问题中,训练误差和测试误差都比较大。
(为了避免过拟合和欠拟合,需要掌握一个度,电赛时判断电路故障就深有体会)目前,欠拟合问题比较容易克服,例如增加迭代次数等,但过拟合问题还没有十分好的解决方案,过拟合是机器学习面临的关键障碍。
在现实任务中,我们往往有多种算法可供选择,那么我们应该选择哪一个算法才是最适合的呢?如上所述,我们希望得到的是泛化误差小的学习器,理想的解决方案是对模型的泛化误差进行评估,然后选择泛化误差最小的那个学习器。但是,泛化误差指的是模型在所有新样本上的适用能力,我们无法直接获得泛化误差。
因此,通常我们采用一个“测试集”来测试学习器对新样本的判别能力,然后以“测试集”上的“测试误差”作为“泛化误差”的近似。显然:我们选取的测试集应尽可能与训练集互斥,下面用一个小故事来解释why:
假设老师出了10 道习题供同学们练习,考试时老师又用同样的这10道题作为试题,可能有的童鞋只会做这10 道题却能得高分,很明显:这个考试成绩并不能有效地反映出真实水平。回到我们的问题上来,我们希望得到泛化性能好的模型,好比希望同学们课程学得好并获得了对所学知识"举一反三"的能力(不错!能力很强);训练样本相当于给同学们练习的习题,测试过程则相当于考试。显然,若测试样本被用作训练了,则得到的将是过于"乐观"的估计结果(哈哈!活在梦里)。
我们需要对初始数据集进行有效划分,划分出互斥的训练集和测试集。下面介绍几种常用的划分方法:
将数据集D划分为两个互斥的集合,一个作为训练集S,一个作为测试集T,满足D=S∪T且S∩T=∅,常见的划分为:大约2/3-4/5的样本用作训练,剩下的用作测试。需要注意的是:
1、训练/测试集的划分要尽可能保持数据分布的一致性,以避免由于分布的差异引入额外的偏差,常见的做法是采取分层抽样。
例如通过对 D 进行分层采样而获得含 70% 样本的训练集 S 和含30% 样本的测试集 T , 若 D 包含 500 个正例、 500 个反例,则分层采样得到的S 应包含 350 个正例、 350 个反例?而 T 则包含 150 个正例和 150 个反例;若S、 T 中样本类别比例差别很大,则误差估计将由于训练/测试数据分布的差异而产生偏差。
2、同时,由于划分的随机性,单次的留出法结果往往不够稳定,一般要采用若干次随机划分,重复实验取平均值的做法。
例如进行 100 次随机划分,每次产生一个训练/测试集用于实验评估, 100 次后就得到 100 个结果?而留出法返回的则是这 100 个结果的平均。
将数据集D划分为k个大小相同的互斥子集,满足D=D1∪D2∪…∪Dk,Di∩Dj=∅(i≠j),同样地尽可能保持数据分布的一致性,即采用分层抽样的方法获得这些子集。交叉验证法的思想是:每次用k-1个子集的并集作为训练集,余下的那个子集作为测试集,这样就有K种训练集/测试集划分的情况,从而可进行k次训练和测试,最终返回k次测试结果的均值。交叉验证法也称“k折交叉验证”,k最常用的取值是10,下图给出了10折交叉验证的示意图。
与留出法类似,将数据集D划分为K个子集的过程具有随机性,因此K折交叉验证通常也要重复p次,称为p次k折交叉验证,常见的是10次10折交叉验证,即进行了100次训练/测试。特殊地当划分的k个子集的每个子集中只有一个样本时,称为 “留一法” ,显然,留一法的评估结果比较准确,但对计算机的消耗也是巨大的。
我们希望评估的是用整个D训练出的模型。但在留出法和交叉验证法中,由于保留了一部分样本用于测试,因此实际评估的模型所使用的训练集比D小,这必然会引入一些因训练样本规模不同而导致的估计偏差。留一法受训练样本规模变化的影响较小,但计算复杂度又太高了。“自助法”正是解决了这样的问题。
自助法的基本思想是:给定包含m个样本的数据集D,每次随机从D 中挑选一个样本,将其拷贝放入D’,然后再将该样本放回初始数据集D 中,使得该样本在下次采样时仍有可能被采到。重复执行m 次,就可以得到了包含m个样本的数据集D’。可以得知在m次采样中,样本始终不被采到的概率取极限为:
这样,通过自助采样,初始样本集D中大约有36.8%的样本没有出现在D’中,于是可以将D’作为训练集,D-D’作为测试集。自助法在数据集较小,难以有效划分训练集/测试集时很有用,但由于自助法产生的数据集(随机抽样)改变了初始数据集的分布,因此引入了估计偏差。在初始数据集足够时,留出法和交叉验证法更加常用。
大多数学习算法都有些参数(parameter) 需要设定,参数配置不同,学得模型的性能往往有显著差别,这就是通常所说的"参数调节"或简称"调参" (parameter tuning)。
学习算法的很多参数是在实数范围内取值,因此,对每种参数取值都训练出模型来是不可行的。常用的做法是:对每个参数选定一个范围和步长λ,这样使得学习的过程变得可行。 例如:假定算法有3 个参数,每个参数仅考虑5 个候选值,这样对每一组训练/测试集就有555= 125 个模型需考察,由此可见:拿下一个参数(即经验值)对于算法人员来说是有多么的happy。
最后需要注意的是:当选定好模型和调参完成后,我们需要使用初始的数据集D重新训练模型,即让最初划分出来用于评估的测试集也被模型学习,增强模型的学习效果。 用上面考试的例子来比喻:就像高中时大家每次考试完,要将考卷的题目消化掉(大多数题目都还是之前没有见过的吧?),这样即使考差了也能开心的玩耍了~。
看到这,我认为算法学习就是让计算机自己学习,学习完了考试,考完了整理错题。
性能度量(performance measure)是衡量模型泛化能力的评价标准,在对比不同模型的能力时,使用不同的性能度量往往会导致不同的评判结果。本节除2.3.1外,其它主要介绍分类模型的性能度量。
回归任务最常用的性能度量是"均方误差" (mean squared error)。
更一般的,对于数据分布 D 和概率密度函数 p(.) , 均方误差可描述为
在分类任务中,即预测离散值的问题,最常用的是错误率和精度,错误率是分类错误的样本数占样本总数的比例,精度则是分类正确的样本数占样本总数的比例,易知:错误率+精度=1。
对样例集 D , 分类错误率定义为(等概率):
或(有概率分布的)
精度则定义为(等概率):
或(有概率分布的)
错误率和精度虽然常用,但不能满足所有的需求,例如:在推荐系统中,我们只关心推送给用户的内容用户是否感兴趣(即查准率),或者说所有用户感兴趣的内容我们推送出来了多少(即查全率)。因此,使用查准/查全率更适合描述这类问题。对于二分类问题,分类结果混淆矩阵与查准/查全率定义如下:
查准率 P(学习器分类的正例中判断正确的比例) :
查全率 R (所有的正例中学习器判断正确的比例):
正如天下没有免费的午餐,查准率和查全率是一对矛盾的度量。例如我们想让推送的内容尽可能用户全都感兴趣,那只能推送我们把握高的内容,这样就漏掉了一些用户感兴趣的内容,查全率就低了(比较收敛);如果想让用户感兴趣的内容都被推送,那只有将所有内容都推送上,宁可错杀一千,不可放过一个,这样查准率就很低了(比较开放)。
“P-R曲线”正是描述查准/查全率变化的曲线,P-R曲线定义如下:根据学习器的预测结果(一般为一个实值或概率)对测试样本进行排序,将最可能是“正例”的样本排在前面,最不可能是“正例”的排在后面,按此顺序逐个把样本作为“正例”进行预测,每次计算出当前的P值和R值,如下图所示:
P-R曲线如何评估呢?
1、若一个学习器A的P-R曲线被另一个学习器B的P-R 曲线完全包住,则称:B的性能优于A。
2、若A和B的曲线发生了交叉,则谁的曲线下的面积大,谁的性能更优。
3、但一般来说,曲线下的面积是很难进行估算的,所以衍生出了“平衡点”(Break-Event Point,简称BEP),即当P=R时的取值,平衡点的取值越高,性能更优。
P和R指标有时会出现矛盾的情况,这样就需要综合考虑他们,最常见的方法就是F-Measure,又称F-Score。F-Measure是P和R的加权调和平均:
其中 ß>0 度量了查全率对查准率的相对重要性。
ß = 1时,退化为标准的 F1。;
ß> 1 时查全率有更大影响;
ß< 1 时查准率有更大影响。
有时候我们会有多个二分类混淆矩阵,例如:多次训练或者在多个数据集上训练,那么估算全局性能的方法有两种,分为宏观和微观。简单理解,
宏观就是先算出每个混淆矩阵的P值和R值,然后取得平均P值macro-P和平均R值macro-R,在算出Fβ或F1,
微观则是计算出混淆矩阵的平均TP/、FP/、TN/、FN/,接着进行计算P、R,进而求出Fβ或F1。
如上所述:学习器对测试样本的评估结果一般为一个实值或概率,设定一个阈值,大于阈值为正例,小于阈值为负例,因此这个实值的好坏直接决定了学习器的泛化性能,若将这些实值排序,则排序的好坏决定了学习器的性能高低。ROC曲线正是从这个角度出发来研究学习器的泛化性能,ROC曲线与P-R曲线十分类似,都是按照排序的顺序逐一按照正例预测,
不同的是ROC曲线
以 “真正例率” (True Positive Rate,简称TPR)为横轴,
以 “假正例率” (False Positive Rate,简称FPR)为纵轴,
ROC偏重研究基于测试样本评估值的排序好坏。
简单分析图像,可以得知:当FN=0时,TN也必须0,反之也成立,我们可以画一个队列,试着使用不同的截断点(即阈值)去分割队列,来分析曲线的形状,
(0,0)表示将所有的样本预测为负例,
(1,1)表示将所有的样本预测为正例,
(0,1)表示正例全部出现在负例之前的理想情况,
(1,0)则表示负例全部出现在正例之前的最差情况。
限于篇幅,这里不再论述,主要心中有表2.1,P-R曲线和ROC曲线都是以这个表为基础的。
现实任务中通常是利用有限个测试样例来绘制 ROC 图,此时仅能获得有限个(真正例率,假正例率)坐标对,无法产生图 2.4(a) 中的光滑 ROC 曲线 , 只能绘制出如图 2.4(b)所示的近似 ROC 曲线。
绘图过程很简单:
1、给定 m+ 个正例和m-个反例,根据学习器预测结果对样例进行排序,然后把分类阔值设为最大,即把所有样例均预测为反例,此时真正例率和假正例率均为 0 , 在坐标 (0, 0) 处标记一个点;
2、然后将分类阐值依次设为每个样例的预测值,即依次将每个样例划分为正例,设前一个标记点坐标为 (x, y) , 当前若为真正例,则对应标记点的坐标为 (x , y + 1/m+)(真正例率TPR增加一点儿);当前若为假正例,则对应标记点的坐标为 (x + 1/m- , y)(假正例率FPR增加一点儿) ,然后用线段连接相邻点即得。
同样地,进行模型的性能比较时:
1、若一个学习器A的ROC曲线被另一个学习器B的ROC曲线完全包住,则称B的性能优于A。
2、若A和B的曲线发生了交叉,则谁的曲线下的面积大,谁的性能更优。
ROC曲线下的面积定义为AUC(Area Under ROC Curve),不同于P-R的是,这里的AUC是可估算的,即ROC曲线下每一个小矩形的面积之和。易知:AUC越大,证明排序的质量越好,AUC为1时,证明所有正例排在了负例的前面(点(0,1)位置,最优),
AUC为0时,所有的负例排在了正例的前面(点(1,0)位置,最差)。
上图就是利用微积分原理估算AUC面积公式。
给定 m十个正例和 m 个反例,令 D+ 和 D-分别表示正、反例集合,
则排序损失 (loss)定义为
即考虑每一对正、反例,若正例的预测值小于反例,则记一个"罚分”;相等则记 0.5 个"罚分"容易看出 , Irαnk 对应的是 ROC 曲线之上的面积。
AUC 和 Irank 有如下关系,两个代表的都是ROC曲线中的面积,与精确率和误差率的关系类似。
就是万一学习器把测试样本分类错误了,会产生的不可预知的代价。有的出了很多错,期望总体代价低,而有的出了一点儿错,期望总体代价就很高,所以需要研究代价。
上面的方法中,将学习器的犯错同等对待,但在现实生活中,将正例预测成假例与将假例预测成正例的代价常常是不一样的,例如:将无疾病–>有疾病只是增多了检查,但有疾病–>无疾病却是增加了生命危险。以二分类为例,由此引入了“代价矩阵”(cost matrix),损失程度相差越大 , cost01 与 cost10 值的差别越大.。
在非均等错误代价下,我们希望的是最小化“总体代价”,这样 “代价敏感”的错误率 为:
注释:(正例中所有判断错的+反例中所有判断错的)/总样本数
在非均等代价下, ROC 曲线不能直接反映出学习器的期望总体代价,而"代价曲线" (cost curve) 则可达到该目的。
代价曲线图的
横轴是取值为 [0,1]的正例概率代价,也归一化了:
其中 p 是样例为正例的概率。
纵轴是取值为 [0,1] 的归一化代价:
记忆的时候,横纵坐标的分母都是:
这样能更好的归一化。
代价曲线的绘制很简单:
设ROC曲线上一点的坐标为(FPR,TPR) ,则可相应计算出FNR,然后在代价平面上绘制一条从(0,FPR) 到(1,FNR) 的线段,线段下的面积即表示了该条件下的期望总体代价;
如此将ROC 曲线上的每个点转化为代价平面上的一条线段,然后取所有线段的下界,围成的面积即为在所有条件下学习器的期望总体代价,如图所示:
记忆方法:看着挺麻烦,其实横纵坐标都是归一化的结果,心中有表2.1,在ROC曲线的基础上,学习器每设置一个阈值,即ROC曲线每个点(FPR,TPR)下,
先找p=0,横坐标为0,找(0,FPR);
再找p=1,横坐标为1,找(1,FNR)。
在上两篇中,我们介绍了多种常见的评估方法和性能度量标准,这样我们就可以根据数据集以及模型任务的特征,选择出最合适的评估和性能度量方法来计算出学习器的“测试误差“。但由于“测试误差”受到很多因素的影响,例如:算法随机性(例如常见的K-Means)或测试集本身的选择,使得同一模型每次得到的结果不尽相同,同时测试误差是作为泛化误差的近似,并不能代表学习器真实的泛化性能,那如何对单个或多个学习器在不同或相同测试集上的性能度量结果做比较呢?这就是比较检验。最后偏差与方差是解释学习器泛化性能的一种重要工具。本篇延续上一篇的内容,主要讨论了比较检验、方差与偏差。
在比较学习器泛化性能的过程中,统计假设检验(hypothesis test)为学习器性能比较提供了重要依据,即若A在某测试集上的性能优于B,那A学习器比B好的把握有多大。 为方便论述,本篇中都是以“错误率”作为性能度量的标准。
“假设”指的是对样本总体的分布或已知分布中某个参数值的一种猜想,例如:假设总体服从泊松分布,或假设正态总体的期望u=u0。回到本篇中,我们可以通过测试获得测试错误率,但直观上测试错误率和泛化错误率相差不会太远,因此可以通过测试错误率来推测泛化错误率的分布,这就是一种假设检验。
这样就可以研究概率论中二项分布的假设检验(和正态分布类似)。
测试错误率ε^(样本的),泛化错误率ε0(整体的),单边
测试错误率均为泛化错误率的独立采样
1、H0:ε≤ε0=0.3 H1:ε﹥ε0
2、显著性水平α=0.05
3、服从二项分布,测试错误率ε^和临界值ε-比较;
4、判断是否接受H0
对于多次训练/测试可使用 “t 检验” ,t分布大体是有标准正态分布和卡方分布组成。
平均测试错误率 X/ 和方差 S^2为:
考虑到这 k 个测试错误率可看作泛化错误率ε的独立采样,则变量:
服从自由度为 n-1 的 t 分布,从概率论中样本均值、样本方差以及他们的分布推导过来的。
双边假设
测试错误率均为泛化错误率的独立采样
1、H0:X\ = ε H1:X\ ≠ ε
2、显著性水平α=0.05
3、服从t分布,测试错误率ε^和临界值ε-比较;
4、判断是否接受H0
McNemar主要用于二分类问题,与成对t检验一样也是用于比较两个学习器的性能大小。 主要思想是:若两学习器的性能相同,则A预测正确B预测错误数应等于B预测错误A预测正确数,即e01=e10,
且|e01-e10|服从N(1,e01+e10)正态分布。
因此,如下所示的变量服从自由度为1的卡方分布,即服从标准正态分布N(0,1)的随机变量的平方和,
上式只有一个变量,故自由度为1,卡方分布图自查考研数学里的概率论,
检验的方法同上:做出假设–>求出满足显著度α的临界点–>给出拒绝域–>验证假设。
上述的三种检验都只能在一组数据集上,F检验则可以在多组数据集进行多个学习器性能的比较,基本思想是在同一组数据集上,根据测试结果(例:测试错误率)对学习器的性能进行排序,赋予序值1,2,3…,相同则平分序值,如下图所示,4种数据集和3种算法:
Friedman 检验
若学习器的性能相同,则它们的平均序值应该相同,且第i个算法的平均序值ri服从正态分布N((k+1)/2,(k+1)(k-1)/12),则有:
在 k 和 N 都较大时,服从自由度为 k-1 的 卡方χ2 分布。
服从自由度为k-1和(k-1)(N-1)的F分布。下面是F检验常用的临界值
(方便用于查表):
Nemenyi 后续检验
若“H0:所有算法的性能相同”这个假设被拒绝,则需要进行后续检验,来得到具体的算法之间的差异。常用的就是Nemenyi后续检验。
Nemenyi检验计算出平均序值差别的临界值域,上表是常用的qa值,若两个算法的平均序值差超出了临界值域CD,则相应的置信度1-α拒绝“两个算法性能相同”的假设。
以表2.5为例(N=4,k=3)性能比较步骤:
Friedman 检验:
1、根据F分布计算出 TF =24.429
2、查表它大于 α= 0.05 时的 F 检验临界值 5.143
3、因此拒绝"所有算法性能相同"这个假设
Nemenyi 后续检验:
1、查表k=3时q0.05 = 2.344,计算出临界值域 CD = 1.657
2、由表 2.5 中的平均序值可知
算法 A 与 B 的差距,以及算法 B 与 C 的差距均未超过临界值域,而算法 A 与 C 的差距超过临界值域,因此检验结果认为算法 A 与 C 的性能显著不同,而算法 A 与 B、以及算法 B 与 C 的性能没有显著差别。
从图 2.8 中可容易地看出,算法 A 与 B 没有显著差别,因为它们的横线段有交叠区域,而算法 A 显著优于算法 C ,因为它们的横线段没有交叠区域。
偏差-方差分解是解释学习器泛化性能的重要工具。 在学习算法中,偏差指的是预测的期望值与真实值的偏差,方差则是每一次预测值与预测值的期望之间的差均方。 实际上,偏差体现了学习器预测的准确度,而方差体现了学习器预测的稳定性。 通过对泛化误差的进行分解,可以得到:
对测试样本x,令 YD 为 m 在数据集中的标记 , y 为 x 的真实标记 , f(x; D) 为训练集 D 上学得模型 f 在 m 上的预测输出。
学习算法的期望预测为:
使用样本数相同的不同训练集产生的方差为:
噪声为:
期望输出与真实标记的差别称为偏差:
算法的期望泛化误差进行分解:
易知:方差和偏差具有矛盾性,这就是常说的偏差-方差窘境(bias-variance dilamma),随着训练程度的提升,期望预测值与真实值之间的差异越来越小,即偏差越来越小,但是另一方面,随着训练程度加大,学习算法对数据集的波动越来越敏感,方差值越来越大。
换句话说:开始是欠拟合,偏差主导泛化误差,而训练到一定程度后,偏差越来越小;后来是过拟合,方差主导了泛化误差。因此训练也不要贪杯,适度辄止,如下图。