@Team
2018-01-23T08:55:45.000000Z
字数 4220
阅读 1882
刘才权
如今机器学习和深度学习如此火热,相信很多像我一样的普通程序猿或者还在大学校园中的同学,一定也想参与其中。不管是出于好奇,还是自身充电,跟上潮流,我觉得都值得试一试。对于自己,经历了一段时间的系统学习(参考《机器学习/深度学习入门资料汇总》),现在计划重新阅读《机器学习》[周志华]和《深度学习》[Goodfellow et al]这两本书,并在阅读的过程中进行记录和总结。这两本是机器学习和深度学习的入门经典。笔记中除了会对书中核心及重点内容进行记录,同时,也会增加自己的理解,包括过程中的疑问,并尽量的和实际的工程应用和现实场景进行结合,使得知识不只是停留在理论层面,而是能够更好的指导实践。记录笔记,一方面,是对自己先前学习过程的总结和补充。 另一方面,相信这个系列学习过程的记录,也能为像我一样入门机器学习和深度学习同学作为学习参考。
个人觉得对于初学的同学,一开始便谈论模型评估和选择可能不太合适。建议这个章节可以快速阅读,有大概的轮廓和线条即可。随着后面的学习,对机器学习有了初步的概念之后,再回过头来看着部分,深入其中的细节。
我们把学习器的实际预测输出与样本的真实输出之间的差异称为[误差],学习器在训练集上的误差称为[训练误差]或[经验误差],在新样本上的误差称为[泛化误差]。
我们希望获得在新样本上能表现的很好的学习器。为了达到这个目的,应该从训练样本中尽可能学出适用于所有潜在样本的“普遍规律”,这样才能在遇到新样本时做出正确的判断。然而,当学习器把训练样本学得“太好”了的时候,很可能已经把训练样本自身的一些特点当做了所有潜在样本都会具有的一般性质,这样就会导致泛化性能下降。这种现象在机器学习中“过拟合”。与“过拟合”相对的是“欠拟合”,这是指对训练样本的一般性质尚未学好。
通常,我们可以通过实验测试来对学习器的[泛化误差]进行评估,并进而做出选择。
我们假设测试样本是从样本真实分布中[独立同分布]采样而来。
假设我们目前有数据集D,为了满足训练和测试的需求,我们对D进行适当的处理,从中产生出训练集S和测试集T。下面介绍几种从数据集D中产生训练集S和测试集T的方法。
留出法的步骤相对简单,直接将数据集D划分为两个互斥的集合,其中一个集合作为训练集S,另一个作为测试T。在S上训练出模型后,用T来评估测试误差,作为泛化误差的估计。训练/测试集的划分要尽可能保持数据分布的一致性,避免因数据划分过程引入额外偏差而对最终结果产生影响。
留出法的一个缺点是,训练集S与测试集T的划分比例不好确定。若令训练集S包含绝大多数样本,则训练出的模型可能更接近与用D训练出的模型,但由于T比较小,评估结果可能不够稳定准确;若令测试集T多包含一些样本,则训练集S与D差别更大了,被评估的模型与用D训练出的模型相比可能有较大差别,从而降低了评估结果的保真性。
“交叉验证法”先将数据集D划分为k个大小相似的互斥子集。然后,每次用k-1个子集的并集作为训练集,余下的那个子集作为测试集,如下图所示,
交叉检验中的“留一法”使用的训练集与初始化数据集相比只少了一个样本,这就使得在绝大多数情况下,留一法中被实际评估的模型与期望评估的用D训练出的模型很相似。因此,留一法的评估结果往往被认为比较准确。然而,留一法也有其缺陷:在数据集比较大时,训练的计算开销可能难以忍受。另外,留一法的评估结果也未必永远比其他评估方法准确。
我们希望评估的是用D训练出的模型。但在留出法和交叉验证法中,由于保留了一部分样本用于测试,因此实际评估的模型所使用的训练集比D小,这必然会引入一些因训练样本规模不同而导致估计偏差。留一法受训练样本规模影响较小,但计算复杂度又太高了。有没有什么办法可以减少训练样本规模不同造成的影响,同时还能比较高效进行试验评估呢?
“自助法”是一个比较好的解决方案。给定包含m个样本的数据集D,我们对它进行采样产生数据集D':每次随机从D中挑选一个样本,并将其拷贝放入D'中,然后再将该样本放回数据集D中,使得该样本在下次采样时仍有可能被采到;这个过程重复执行m次后,我们得到了包含m个样本的数据集D',这就是我们自助采样的结果。我们将D'作为训练集,将D-D‘(集合减法)作为测试集。
自助法在数据集较小、难以有效划分训练/测试集时很有用;此外,自助法能从初始数据集中产生多个不同的训练集,这对集成学习等方法有很大的好处。然而,自助法产生的数据改变了初始数据集的分布,这会引入估计偏差。因此,在初始数据量足够是,留出法和交叉验证法更常用一些。
在预测任务中,给定样本集
其中,yi是示例xi的真实标记。
回归任务中最常用的性能度量是[均方误差],
错误率和精度是分类任务中最常用的两种性能量度。
错误率是分类错误的样本占样本总数的比例,
精度则是分类正确的样本占样本总数的比例,
对应西瓜问题,如果我们关心的是“挑出的瓜有多少是好瓜?”或者“所有好瓜中有多少比例被调出来了?”,那么错误率显然就不够用了。[查准率]和[查全率]则更适用于此类需求的性能度量。
对二分类问题,可将样例根据其实际类别与学习器预测类别的组合划分为真正例(true positive,TP)、假正例(false positive,FP)、真反例(true negative,TN)、假反例(false negative,FN)四种情况,如下图所示,
查准率P与查全率R分别定义为,
以查准率作为纵轴,查全率作为横轴作图,就得到了[查准率]-[查全率]曲线,简称"P-R曲线",
查准率和查全率是一对矛盾的度量。人们设计了一些综合考虑查准率、查全率的性能度量。[平衡点](Break-Even Point,简称BEP)就是这样一个度量,它是[查准率]=[查全率]时的取值。
BEP过于简化,更常用的的是F1度量,
在一些应用中,对查准率和查全率的重视程度有所不同。从而有了F1度量的一般形式,
系数β>1时查全率有更大影响;β<1时,查准率有更大影响。
很多时候我们有多个二分类混淆矩阵,我们希望在n个二分类混淆矩阵上综合考察查准率和查全率。目前有两种方法:
* ”宏查准率(macro-P)“、”宏查全率(macro-R)“、及相应的宏F1(macro-F1)
* ”微查准率(micro-P)“、”微查全率(micro-R)“、及相应的微F1(micro-F1)
很多学习器是为测试样本产生一个实值或概率预测,然后将这个预测值与一个分类阈值进行比较,若大于阈值则分为正类,否则为反类。在不同的应用任务中,我们可根据任务需求(如若我们可以依据更重视[查准率]或更重视[查全率])来选择不同的阈值。ROC曲线便是从这个角度出发来研究学习器泛化性能的有力工具。
与P-R曲线使用查准率、查全率为横纵轴不同,ROC的纵轴是”真正样例(True Positive Rate,简称TPR)”,横轴是“假正例率(False Positive Rate,简称FPR),两者分别定义为,
显示ROC的曲线图称为“ROC图”,
进行学习器比较时,与P-R如相似,若一个学习器的ROC曲线被另一个学习器的曲线“包住”,则可断言后者的性能优于前者;若两个学习器的ROC曲线发生交叉,则难以一般性的断言两者孰优孰劣。此时如果一定要进行比较,则较为合理的判断是比较ROC曲线下的面积,即AUC(Area Under ROC Curve)。
在现实任务中会遇到这样的情况:不同类型错误所造成的后果不同。例如在医疗诊断中,错误的把患者诊断为健康人与错误的把健康人诊断为患者,看起来都是犯了“一次错误”,但后者的影响是增加了进一步检查的麻烦,前者的后果却可能是丧失拯救生命的最好时机。
以二分类任务为例,我们可根据任务领域知识设定一个“代价矩阵”,如下图所示,
在非均等代价下,ROC曲线不能直接反映出学习器的期望总体代价,而“代价曲线(cost curve)”则可达到目的。代价曲线图的横轴是取值为[0,1]的正例概率代价,
纵轴是取值为[0,1]的归一化代价,
画图表示如下图所示,
统计假设检验为我们进行学习器性能比较提供了重要依据。基于假设检验结果我们可以推测,若在测试集上观察到学习器A比B好,则A的泛化性能是否在统计意义上优于B,以及这个结论的把握有多大。
假设检验中的“假设”是对学习器泛化错误率分布的某种判断或猜想。
对于错误率,我们可以采用“二项检验”来计算“置信度”。
很多时候,我们并非仅做一次留出法估计,而是通过多次重复留出法或是交叉验证法等进行多次训练/测试,这样会得到多个测试错误率,此时,可使用“t检验”。
上面介绍的“二项检验”和“t检验”都是对关于单个学习器泛化性能的假设进行检验,而现实任务中,更多的时候我们需对不同学习器的性能进行比较。
对两个学习器A和B,若我们使用"k折交叉验证法",则可用“成对t检验”(paired t-tests)来进行比较检验。
对于二分类问题,使用“留出法”估计学习器A和B的测试误差,可采用McNemar检验。
交叉验证t检验和McNemar检验都是在一个数据上比较两个算法的性能,而很多时候,我们会在一组数据集上对多个算法进行比较。当有多个算法参与比较时,一种做法是在每个数据集上分别列出两两比较的结果,而在两两比较时可使用前述方法;另一种方法更为直接,即使用使用基于算法排序的Friedman检验。
使用Friedman检验判断这些算法是否性能都相同。若“所有算法性能都相同”这个假设被拒绝,则说明算法的性能显著不同。这时需要进行“后续检验”(post-hoc test)来进一步区分各算法。常用的有Nemenyi后续检验。
对学习算法除了通过实验估计器泛化性能,人们往往还希望了解它“为什么”具有这样的性能。“偏差-方差分解”(bias-variance decomposition)是解释学习算法泛化性能的一种重要工具。
泛化误差可分解为偏差、方差和噪声。