模型评估与选择
基本概念
我们把学习器的实际预测输出与样本的真实输出之间的差异称为误差(error).
- 学习器在训练集上的误差称为”训练误差”或”经验误差”。
- 学习器在测试集上的误差称为”测试误差”。
- 学习器在新样本上的误差称为”泛化误差”。
泛化误差≠测试误差 - 过拟合:学习能力过于强大
- 欠拟合:学习能力低下
- 模型选择:包括我们该选用哪一个学习算法,使用哪一种参数配置。理想的解决方案是对候选模型的泛化误差进行评估,然后选择泛化误差最小的那个模型。
训练集/测试集划分方法
我们手中有一个包含m个样例的数据集$D={(x_1,y_1),(x_2,y_2),…,(x_m,y_m)}$,我们需要数据既要进行训练也要进行测试,我们需要做的是从中产生训练集S和测试集T。
留出法(hold out)
直接将数据集D划分为两个互斥的集合,其中一个集合作为训练集S,另一个作为测试集T,即D=S∪T,S∩T=$\empty$,在S上训练出模型后,用T来评估其测试误差,作为对泛化误差的估计。
注意:训练/测试集的划分要尽可能保持数据分布的一致性,避免因数据划分过程引入额外的偏差而对最终结果产生影响,如果从采样的角度来看待数据集的划分过程,则保留类别比例的采样方式通常称为”分层采样”
另外还需要注意只单次使用留出法得到的估计结果往往不够稳定可靠,在使用留出法时,一般要采用若干次随机划分、重复进行实验评估后取平均值作为留出法的评估结果。
留出法划分数据会导致一个窘境:若令训练集S包含绝大多数样本,则训练出的模型可能更接近于用D训练出来的模型,但由于T比较小,评估结果可能不够稳定准确;若令测试集T多包含一些样本,则训练集S与D差别更大了,被评估的模型与用D训练出来的模型相比可能有较大差别,从而降低了评估结果的保真性。
交叉验证法(K-fold cross validation)
先将数据集D划分为K个大小相似的互斥子集,即$D=D_1∪D_2∪…D_K,D_i∩D_j=\empty(i≠j)$.每个子集$D_i$都尽可能保持数据分布的一致性,即从D中通过分层采样得到。然后,每次用K-1个子集的并集作为训练集,余下的那个子集作为测试集;这样就可以获得K组训练/测试集,从而可以进行K次训练和测试,最终返回的是这K个测试结果的均值。显然交叉验证法评估结果的稳定性和保真性很大程度上取决于K的取值。
特殊的交叉验证是,假定数据集D中包含了m个样本,令k=m,得到的就是留一法(Leave-one-out).
自助法(bootstrapping)
留一法受训练样本规模变化的影响较小,但计算复杂度又太高了。有什么办法可以减少训练样本规模不同造成的影响,同时还能比较高效地进行实验估计呢?
自助法是一个比较好地解决方案,它直接以自助采样法(bootstrap sampling)为基础。给定包含m个样本地数据集D,我们对它进行采样产生数据集D’:每次随机从D中挑选一个样本,将其拷贝放入D’,然后再将该样本放回初始数据集D中,使得该样本在下次采样时仍有可能被采到;这个过程重复执行m次后,我们就得到了包含m个样本地数据集D’,这就是自助采样地结果。显然,D中有一部分样本会在D’中多次出现,而另一部分样本不出现,可以做一个简单的估计,样本在m次采样中始终不被采到的概率是$(1-\frac{1}{m})^m$,取极限得到
自助法在数据集较小、难以有效划分训练/测试集时很有用;此外,自助法*能从初始数据集中产生多个不同的训练集,这对集成学习等方法有很大的好处。然而自助法产生的数据集改变了初始数据集的分布,这会引入估计偏差。因此在数据量足够时,留出法和交叉验证法更常用一些。
调参与最终模型
在不少应用任务中参数调得好不好对最终模型性能有关键性影响。
给定包含m个样本得数据集D,在模型评估与选择过程中由于需要留出一部分数据进行评估测试,事实上我们只使用了一部分数据训练模型。因此,在模型选择完成后,学习算法和参数配置已选定,此时应该用数据集D重新训练模型,这个模型在训练过程中使用了所有m个样本,才是我们最终提交给用户得模型。
另外,需注意的时,我们通常把学得模型在实际使用中遇到的数据称为测试数据,为了加以区分,模型评估与选择中用于评估测试的数据集常称为“验证集”
性能度量
- 均方误差
- 错误率与准确率(accuracy)
- 查准率(P)、查全率(R)与F1
混淆矩阵就是一个容易让你混淆的矩阵。
如果是二分类的问题,就是上述的2×2的表格。如果是k分类的问题,则它是一个k×k的表格。
这里:
TP:True positive(正确判定为正例)
TN:True negative(正确判定为负例)
FP:False positive(错误判定为正例,实则为负例)
FN:False negative(错误判定为负例,实则为正例)
P是精确率(precision),表示被判定为正例的样本中的正确率。
R是召回率(recall),表示所有正例,在判定中判定正确的概率。
一般来说,查准率(P)高时,查全率(R)往往偏低;而查全率高时,查准率往往偏低.
可以绘制P-R曲线。如果一个学习器的P-R曲线被另一个学习器的曲线完全”包住”,则可断言后者的性能优于前者。
平衡点(BEP)是这样一个度量,它是查准率=查全率时的取值,并且能显而易见哪个学习器优于哪个。更常用的是F1度量。
F1的更一般的形式,
很多时候我们有多个二分类混淆矩阵,例如进行多次训练/测试,每次得到一个混淆矩阵;或是在多个数据集上进行训练/测试,希望估计算法的”全局”性能;甚或是执行多分类任务,每两两类别的组合都对应一个混淆矩阵,…总之,我们希望在n个二分类混淆矩阵上综合考察查准率和查全率。
一种直接的做法是先在各混淆矩阵上分别计算出查准率和查全率,记为$(P_1,R_1),(P_2,R_2),…,(P_n,R_n)#,再计算平均值,这样就得到”宏查准率”(macro-P)、”宏查全率”(macro-R),以及相应的”宏F1”(macro-F1):
ROC与AUC
很多学习器是为测试样本产生一个实值或概率预测,然后将这个预测值与一个分类阈值进行比较,若大于阈值则分为正类,否则为反类。例如,神经网络在一般情形下是对每个测试样本预测出一个[0.0,1.0]之间的实值,然后将这个值与0.5进行比较,大于0.5则判为正例,否则为反例。这个实值或概率预测结果的好坏直接决定了学习器的泛化能力。实际上,根据这个实值或概率预测结果,我们可以将测试样本进行排序,”最可能”是正例的排在最前面,”最不可能”是正例的排在最后面。这样,分类过程就相当于在这个排序中以某个”截断点”将样本分为两部分,前一部分判作正例,后一部分判作反例
在不同的应用任务中,我们可以根据任务需求来采用不同的截断点,例如若我们更重视”查准率”,则可选择排序中靠前的位置进行截断;若更重视查全率则可选择靠后的位置进行截断。因此,排序本身的质量好坏,体现了综合考虑学习器在不同任务下的”期望泛化性能”的好坏,或者说,”一般情况下”泛化性能的好坏。ROC曲线则是从这个角度出发来研究学习器泛化性能的有力工具。
记住ROC曲线上的每一点对应于一个阈值
ROC曲线的纵轴是TPR(True positive rate),横轴是FPR(False positive rate)
例如下面例子,阈值从A到B再到C,不断变小,相应的TPR逐渐变大,FPR也逐渐变大
在阈值分别取A、B、C时,坐标变化如下图
阈值的选取根据具体任务选择。对样本排序的质量体现了综合考虑学习器在不同任务下泛化能力的好坏。
显然对角线对应于”随机猜测”模型
进行学习器的比较时,与P-R图相似,若一个学习器的ROC曲线被另一个学习器的曲线完全”包住”,则可断言后者的性能优于前者;若两个学习器的ROC曲线发生交叉,则难以一般性地断言两者孰优孰劣。此时一定要进行比较,则较为合理的判据是比较ROC曲线下的面积,即AUC
AUC的计算方法
AUC的定义是对ROC曲线下各部分的面积求和。设ROC曲线是由坐标${(x_1,y_1),(x_2,y_2),…,(x_m,y_m)}$的点连接而成。则AUC近似为
为什么要用ROC曲线和AUC
ROC曲线有个很好的特性:当测试集中的正负样本的分布变化的时候,ROC曲线能够保持不变。在实际的数据集中经常会出现类不平衡(class imbalance)现象,而且测试数据中的正负样本的分布也可能随着时间变化。
下图是ROC曲线和Precision-Recall曲线的对比
上图中,(a)和(c)为ROC曲线,(b)和(d)为Precision-Recall曲线。(a)和(b)展现的是在原始测试集(正负样本分布平衡)的结果;(c)和(d)是将测试集中负样例的数量增加到原来的10倍后,分类器的结果。可以明显看出,ROC基本保持原貌,而Precision-Recall曲线则变化较大。
代价敏感错误率与代价曲线
在现实任务中常会遇到这样的情况:不同类型的错误所造成的后果不同;例如医疗诊断中,错误地把患者诊断为健康人与错误地把健康人诊断为患者,看起来都是犯了“一次错误”,但后者的影响是增加了进一步检查的麻烦,前者的后果却可能是丧失拯救生命的最佳时机;由此可知,为了权衡不同类型错误所造成的不同损失,可为错误赋予”非均等代价”。
以二分类为例,我们可以根据任务的邻域知识设定一个”代价矩阵”。
并由此可以得到”代价敏感错误率”。
在非均等代价下,ROC曲线不能直接反映出学习器的期望总体代价,而“代价曲线”则可达到该目的。代价曲线图的横轴是取值为[0,1]的正例概率代价
其中p是样例为正例的概率;纵轴是取值为[0,1]的归一化代价