一.经验误差与过拟合

我们将学习器对样本的实际预测结果与样本的真实值之间的差异成为:误差(error)。定义:

  • 在训练集上的误差称为训练误差或经验误差
  • 在测试集上的误差称为测试误差
  • 学习器在所有新样本上的误差称为泛化误差

显然,我们希望得到的是在新样本上表现得很好的学习器,即泛化误差小的学习器。

因此,我们应该让学习器尽可能地从训练集中学出普适性的“一般特征”,这样在遇到新样本时才能做出正确的判别。然而,当学习器把训练集学得“太好”的时候,即把一些训练样本的自身特点当做了普遍特征同时也有学习能力不足的情况,即训练集的基本特征都没有学习出来。我们定义:

  • 学习能力过强,以至于把训练样本所包含的不太一般的特性都学到了,称为:过拟合(overfitting)。
  • 学习能太差,训练样本的一般性质尚未学好,称为:欠拟合(underfitting)。

可以得知:在过拟合问题中,训练误差十分小,但测试误差教大;在欠拟合问题中,训练误差和测试误差都比较大

目前,欠拟合问题比较容易克服,例如在决策树中扩展分支、在神经网络中增加迭代次数等,但过拟合问题还没有十分好的解决方案,各类学习算法中都带有一些针对过拟合的措施,但是过拟合仍无法彻底避免。

二.评估方法

1.模型选择

模型选择:在处理任务时吗,我们往往有多种学习算法可供选择,甚至对同一个算法使用不同的参数时,也会产生不同的模型,那么改选用哪种模型呢?

我们希望得到的是泛化误差小的学习器,理想的解决方案是对所有候选模型的泛化误差进行评估,然后选择泛化误差最小的算法。

2.训练集与测试集的划分方法

(1)留出法

测试算法时,我们需要先将数据集划分为训练集和测试集。但如果训练集占太大比例,则测试集过少,结果可能不准确;如果训练集占比太小,训练效果差。

一般我们选择将大约2/3~4/5的样本用于训练,剩余样本用于测试。

需要注意的是:训练/测试集的划分要尽可能保持数据分布的一致性,以避免由于分布的差异引入额外的偏差,常见的做法是采取分层抽样。同时,由于划分的随机性,单次的留出法结果往往不够稳定,一般要采用若干次随机划分,重复实验取平均值的做法。

(2)交叉验证法

将数据集D划分为k个大小相同互斥子集,满足D=D1∪D2∪...∪Dk,Di∩Dj=∅(i≠j),同样地尽可能保持数据分布的一致性,即采用分层抽样的方法获得这些子集。

交叉验证法的思想是:每次k-1个子集的并集作为训练集余下的那个子集作为测试集,这样就有K种划分的情况,从而可进行k次训练和测试,最终返回k次测试结果的均值。交叉验证法也称“k折交叉验证”。

k最常用的取值是10。

(3)自助法

我们希望评估的是用整个D训练出的模型。但在留出法和交叉验证法中,由于保留了一部分样本用于测试,因此实际评估的模型所使用的训练集比D小,这必然会引入一些因训练样本规模不同而导致的估计偏差。自助法是个比较好的解决方案

自助法的基本思想是:给定包含m个样本数据集D,每次随机从D 中挑选一个样本,将其放入D',然后再将该样本放回初始数据集D 中,使得该样本在下次采样时仍有可能被采到(有放回抽样)。重复执行m 次,就可以得到了包含m个样本的数据集D'。可以得知在m次采样中,部分样本都没被采到的概率取极限为:

即通过自助采样,初始样本集D中大约有36.8%的样本没有出现在D'中。于是可以将D'作为训练集,D-D'作为测试集(注意:这里是两个集合相减)。这样我们实际数据集和训练集都有m个样本,而仍有约36.8%的数据可以作为测试集。

3.调参

调参:常用的选择参数的做法:对每个参数选定一个范围和步长(例如在[0, 0.2]范围内以0.05为步长,需要测试5个参数)。

调参往往很困难,假设算法有3个参数,每个参数仅考虑5个候选值,这样对一组训练和测试集就需要5的3次方=125个模型进行考察。而很多强大的学习算法的参数更多(例如大型“深度学习模型甚至有上百亿个参数”),导致调参是个特别大的工程量。

需要注意的是:当选定好模型和调参完成后(是用训练集进行测试选的),我们需要使用初始的数据集D重新训练模型,即让最初划分出来用于评估的测试集也被模型学习,增强模型的学习效果。

4.性能度量

性能度量是衡量模型泛化能力的评价标准,在对比不同模型的能力时,使用不同的性能度量往往会导致不同的评判结果。可见模型的好坏是相对的,不仅取决于算法和数据,还取决于任务需求

(1) 分类问题最常见的性能度量——错误率与精度

在分类任务中,即预测离散值的问题,最常用的性能度量是错误率和精度。

  • 错误率:分类错误的样本数占样本总数的比例
  • 精度:分类正确的样本数占样本总数的比例(精度=1-错误率)

错误率与精度 既适用于二分类任务,也适用于多分类任务。

(2)回归问题最常见的性能度量——均方误差

在回归任务中,即预测连续值的问题,最常用的性能度量是“均方误差”。即大家熟悉的方差公式。

(3)查准率/查全率/F1

错误率和精度虽然常用,但不能满足所有的需求。

例如:在推荐系统中,我们只关心推送给用户的内容用户是否感兴趣(即查准率),或者说所有用户感兴趣的内容我们推送出来了多少(即查全率)。

又例如:假定瓜农拉来一车西瓜,我们用训练好的模型对这些西瓜进行判别,显然,错误率和精度衡量了有多少比例的瓜被分类正确。但是若我们关心的是“挑出的西瓜中有多少比例是好瓜”,或者“所有好瓜中有多少比例被挑了出来”,那么错误率和精度显然就不够用了。

使用查准/查全率更适合描述这类问题。

对于二分类问题,分类结果混淆矩阵与查准/查全率定义如下:

(如预测结果为正,实际也是正的情况称为真正例。预测结果为正,实际是假的情况称为假正例)

即:查准率=预测的真正例数/预测的正例数。查全率=预测的真正例数/实际的正例数

查准率和查全率是一对矛盾的度量。例如我们想让推送的内容尽可能用户全都感兴趣,那只能推送我们把握高的内容,这样就漏掉了一些用户感兴趣的内容,查全率就低了;如果想让用户感兴趣的内容都被推送,那只有将所有内容都推送上,这样查准率就很低了。

PR曲线

“P-R曲线”是描述查准/查全率变化的曲线。

P-R曲线定义如下:根据学习器的预测结果对测试样本进行排序,将最可能是“正例”的样本排在前面,最不可能是“正例”的排在后面,按此顺序逐个把样本作为“正例”进行预测,每次计算出当前的P值和R值,如下图所示:

P-R曲线如何评估呢?

  • 若一个学习器A的P-R曲线被另一个学习器B的P-R曲线完全包住,则称:B的性能优于A。
  • 若A和B的曲线发生了交叉,则谁的曲线下的面积大,谁的性能更优。
    • 但一般来说,曲线下的面积是很难进行估算的,所以衍生出了“平衡点”(简称BEP),即当P=R时的取值,平衡点的取值越高,可以认为性能更优。

但平衡点将P-R曲线过于简化,因此我们更常用的是F1度量:

F1是基于查准率P和查全率R的调和平均数定义的:

为什么F1度量使用调和平均数而不使用算数平均数?

有P-R图像可以看出,大多数时候,P和R都是一个很高,一个很低。相对于算术平均,调和平均引入了惩罚机制,即:对于参与调和平均的所有对象,如果它们的值不均衡,那么即使其中某些值非常高,均值也不会高。

我们都希望P和R同时高,所以要使用调和平均,来同时衡量二者的高低和均衡度这两个指标,从而避免在使用算术平均时,出现由于其中一个很高,另一个较低,造成的均值虚高的现象。

知乎《机器学习中的F1度量,为什么定义为precision和recall的调和平均,而不是算术平均?》https://www.zhihu.com/question/47980482

上面的公式进一步可以得到:

F1表示P和R同等重要,有时候我们需要查全率更重要,或者查准率更重要,就需要将F1转化为更一般的情况:加权调和平均数

  • B>1表示查全率更重要,B<1表示查准率更重要。

多个混淆矩阵的查准率和查全率

很多时候我们会有多个二分类混淆矩阵,例如进行多次训练,每次得到一个混淆矩阵;或者在多个数据集上训练,也会有多个混淆矩阵。总之,我们希望在n个二分类混淆矩阵上总和考察查准率和查全率。

一种直接的做法是先在每个混淆矩阵上分别计算查准率和查全率,即为(P1, R1), (P2, R2), 再计算平均值,得到“宏查准率”(macro-P)、“宏查全率”(macro-R)、和“宏F1”(macro-F1)。这几个宏值即可作为算法查全率和查准率的量度。

还可以将每个混淆矩阵对应元素进行平均,得到TP、FP、TN、FN的均值,再计算micro-P、micro- R、micro- F1,作为算法查全率和查准率的量度。

(4)ROC和AUC

学习器对测试样本的评估结果本质一般为一个实值或概率,设定一个阈值,大于阈值为正例,小于阈值为负例,因此这个实值的好坏直接决定了学习器的泛化性能。若将这些实值排序,则排序结果便是学习器的性能高低。

ROC曲线正是从这个角度出发来研究学习器的泛化性能,以“真正例率(TPR)”为x轴,以“假正例率(FPR)”为y轴。

AUC:ROC曲线下方面积的大小。

我们想要的是:真正率大,假正率小。但真正率的提高需要假正率也提高作为代价

现实中的任务通常都是有限个测试样本,因此只能绘制出近似ROC曲线。

绘图过程:给m个正例和n个反例,按照学习器预测结果对样例进行排序,然后把分类阈值设为最大(即把所有样本均预测为反例),此时真正例率和假正例率均为0,在坐标(0, 0)处;然后将分类阈值再依次设置为每个样例的预测值,标记对应的TPR和FPR为x轴坐标和y轴坐标,即可得到图像。

进行模型的性能比较:若一个学习器A的ROC曲线被另一个学习器B的ROC曲线完全包住,则称B的性能优于A。若A和B的曲线发生了交叉,则谁的曲线下的面积大,谁的性能更优。

这里的AUC是可估算的,即AOC曲线下每一个小矩形的面积之和。易知:AUC越大,证明排序的质量越好,AUC为1时,证明所有正例排在了负例的前面,AUC为0时,所有的负例排在了正例的前面。

为什么要使用ROC和AUC作为评价算法的标准?

因为 ROC 曲线有个很好的特性:当测试集中的正负样本的分布变化的时候,ROC 曲线能够保持不变。

在实际的数据集中经常会出现类不平衡(class imbalance)现象,即负样本比正样本多很多(或者相反),而且测试数据中的正负样本的分布也可能随着时间变化。

比如将测试集的负样本数量增大十倍,ROC 曲线基本保持原貌。

(5)代价敏感错误率和代价曲线

上面的方法中,将学习器的犯错同等对待,但在现实生活中,将正例预测成假例与将假例预测成正例的代价常常是不一样的。例如:将无疾病-->有疾病只是增多了检查,但有疾病-->无疾病却是增加了生命危险。

因此,以二分类为例,我们引入了“代价矩阵”。

(cost10表示将第1类样本预测为第0类样本的代价)

在错误代价不均等的情况下,我们希望的是最小化“总体代价”,这样“代价敏感”的错误率为: