积跬步以至千里,积怠惰以至深渊html
注:本篇文章在整理时主要参考了 周志华 的《机器学习》。算法
在上一篇文章中,咱们知道要根据具体的问题选择具体的算法和概括偏好。那么咱们怎么断定咱们的选择是正确的呢?这就须要拥有一套规范的模型评估与选择方法论了。bootstrap
首先,咱们要理解机器学习为何须要一套模型评估与选择方法论?app
在前一章的学习中,咱们知道机器学习是对数据集的泛化过程,即从输入的数据中概括出一套能适用于全部潜在样本的“广泛规律”。可由于训练数据不够充分,机器学习出来的模型并没办法涵盖全部的状况,这就会致使学习器的实际预测输出与样本的真实输出之间存在“偏差”。机器学习
学习器在训练集上的偏差称为“经验偏差”,在新样本上的偏差称为“泛化偏差”。把分类错误的样本数占样本总数的比例称为“错误率” (error rate) ;相应的,1-“错误率”称为“精度”。很明显,要使得分类器尽量的有用,咱们应该要让泛化偏差尽量的小。惋惜在现实环境中,咱们很难知道新样本是什么样的,因此咱们实际能作的只有努力使经验偏差最小化。工具
说到这里,也许有的心急的同窗已经火烧眉毛的去将算法设计的尽量百分百的知足全部训练样本了,把训练样本自身的一些特色看成了全部潜在样本都会具备的通常性质,可却忘了学习器真正要达到的是泛化偏差尽量小,而不是目前的折中方案下降经验偏差。而在下降经验偏差的道路上,驻守着机器学习领域最大的拦路虎之一:“过拟合”性能
“过拟合”是指学习器对训练样本学的太好了,致使泛化程度不够(还记得机器学习就是一个泛化过程吗),无法适应新的数据样本。与之相反的还有一个“欠拟合”的概念,就是对训练样本中的通常规律都没学习好。举个例子,让机器来学习天鹅的特征,通过训练后,学习了天鹅是有翅膀的,天鹅的嘴巴是长长的弯曲的,天鹅的脖子是长长的有点曲度,天鹅的整个体型像一个“2”且略大于鸭子。这时候你的机器已经基本能区别天鹅和其余动物了。然而,很不巧你的训练天鹅数据全是白色的,因而机器通过学习后,会认为天鹅的羽毛都是白的,之后看到羽毛是黑的天鹅就会认为那不是天鹅,那就是过拟合;而若是没能学习到天鹅的基本特征,那就是欠拟合了。学习
图1. 图2. 图3.测试
图1. 不可以很好的反映数据样本的“广泛规律” (欠拟合) 图3. 太过于纠结训练数据的分布,从而没法很好的适应新的数据样本 (过拟合) 。spa
因此,咱们知道了吧,咱们为何须要一套模型评估与选择的方法论呢?由于咱们的训练数据无法真正表明真实的样本空间,而泛化偏差没法直接得到,经验偏差又由于过拟合的存在而不适合做为标准,因此咱们才须要一套模型评估与选择的方法论。
咱们知道了为何要对模型进行评估,那么在不知道泛化偏差的状况下,咱们该如何进行评估呢?
一个经常使用的思路是:既然咱们无法拿到新样原本进行泛化偏差计算,那么咱们能够从训练样本中取出一部分来,伪装它是一组新样本,并用这些样本计算出来的偏差做为泛化偏差的近似。这组选出来的样本被称为“测试集”,测试集上的偏差被称为测试偏差。但需注意的是,测试集应该尽可能不与训练集重合,不然测试集计算出的偏差将无法准确表明该学习器的泛化能力。
为了理解这一点,不妨考虑这样一个场景:老师出了10道习题供同窗们练习,考试时又用一样的10道题做为试题,这个考试成绩可否反映出同窗们写的好很差呢?答案是否认的,可能有的同窗只会作这10道题却能得高分。
综上所述,咱们运用一下几种常见的作法把一个包含m个样例的数据集D进行适当的处理,从中产生出训练集S和测试集T。
一、留出法(hold-out)
直接将D划分为互斥的两部分S和T,在S上训练出模型后,用T来评估测试偏差。
须要注意的是:应避免因数据划分过程引入额外的误差而对最终结果产生影响,例如经过对D进行分层采样 (保留类别比例的采样方式) 而得到含70%样本的训练集S和含30%样本的训练集T,若D包含500个正例子、500个反例,则分层采样获得的S应包含350个正例、350个反例。而T则包含150个正例和150个反例;若S、T中样本类别比例差异很大,则偏差估计将因为训练/测试数据分布的差别而产生误差。另外,一样能够把D中的样本排序,而后把前350个正例放到训练集中,也能够把后350个正例放到训练集中,......
不一样的划分方案将致使不一样的训练/测试集,相应的模型评估也会有所差别。所以,通常采用若干次随机划分、重复进行实验评估后取平均值做为留出法的评估结果。
特色:测试集小时,评估结果的方差较大,被评估的模型与用D训练出的模型相比可能有较大区别,从而下降了评估结果的保真性;训练集小时,评估结果的误差较大,评估结果可能不够稳定准确。
二、交叉验证法(cross validation)
将D分层采样划分为互斥的k个子集,每次训练用其中(k-1)个数据子集,用剩下的一个子集做为测试集。这样就能得到k组训练/测试集,对这k组分别进行训练和测试,最终返回k个测试结果的均值。
特色:评估结果的稳定性和保真性在很大程度上取决于k的取值 (k折交叉验证)
三、留一法 (Leave-One-Out)
交叉验证法的一个特例:假定数据集D中包含m个样本,令k=m。
特色:不受随机样本划分方式的影响;评估结果每每被认为比较准确;训练m个模型的计算开销比较大。
四、自助法(bootstrapping)
每次从D中随机复制一个样本到D1中,重复m次,会获得一个拥有m个数据样本的D1数据集 (自主采样法:可重复采样或又放回采样) 。显然,D中的一部分数据会屡次出如今D1中,而另外一部分样本不出现。根据平均分布几率计算,初始数据集D中约有36.8%的样本未出如今采样数据集D1中。咱们将D1用做训练集,D\D1用做测试集 (“\”表示集合减法) 。
五、适用性
自助法在数据集较小、难以有效划分训练/测试集时颇有用;此外,自助法能从初始数据集中产生多个不一样的训练集,这对集成学习等方法有很大的好处。然而,自助法产生的数据集改变了初始数据集的分布,这会引入估计误差。所以,在初始数据量足够时,留出法和交叉验证法更经常使用一些。
六、调参
参数配置不一样,学得模型的性能每每有着显著差异。需注意的是,在研究对比不一样算法的泛化性能时,咱们用测试集上的判别效果来估计模型在实际使用时的泛化能力,而把训练数据另外划分为训练集和验证集,基于验证集上的性能来进行模型选择和调参。
(数据集 (训练数据(训练集)(验证集)) (测试集))
了解了如何有效可行地实验评估方法,还须要有衡量模型泛化能力的评价标准,这就是性能度量。这意味着模型的“好坏”是相对的,什么样的模型是好的,不只取决于算法和数据,还决定于任务需求。
回归任务中最经常使用的性能度量是“均方偏差”,即用模型的输出与实际输出计算输出结果的方差。
一、错误率与精度
错误率:分类错误的样本数占样本总数的比例;
精度:分类正确的样本数占样本总数的比例;
二、查准率、查全率与F1
查准率(precision):被模型预测为正的样本中,真正为正的样本比例(被预测为好瓜的西瓜中,真的是好瓜的西瓜比例)
查全率(recall):在全部正的样本上,被学习器预测为正的样本比例(在全部好瓜中,被学习器正确识别的好瓜比例)
F1:(2x查准率x查全率)/(查准率+查全率)。 F1是基于查准率和查全率的调和平均。
“平衡点”(Break-Even Point):“查准率=查全率”时的取值。
查准率和查全率是一对矛盾的度量。通常来讲,查准率高时,查全率每每偏低;而查全率高时,查准率每每偏低。例如,若但愿将好瓜尽量多地选出来,则可经过增长选瓜的数量来实现,若是将全部西瓜都选上,那么全部的好瓜也必然都被选上了,但这样查准率就会较低;若但愿选出的瓜中好瓜比例尽量高,则可只挑选最有把握的瓜,但这样就不免会漏掉很多好瓜,使得查全率较低。一般只有在一些简单任务中,才可能使查全率和查准率都很高。
以查准率为纵轴、查全率为横轴做图,就获得了查准率-查全率曲线,简称“P-R曲线”。
在进行比较时,若一个学习器的P-R曲线被另外一个学习器的曲线彻底“包住”,则可断言后者的性能优于前者。当曲线有相交时,很难断言二者的优劣。真要判别时,“平衡点”(Break-Even Point)是一个不错的度量方法。
三、ROC与AUC
ROC曲线是从“通常状况下”泛化性能的好坏出发来研究学习器泛化性能的有力工具。ROC:“受试者工做特征”(receiver operating characteristic)曲线,与P-R 曲线相似,只不过取用“真正利率”(TPR )做为纵轴,“假正例率”(FPR)做为横轴。
对角线对应于“随机猜想”模型,而点(0,1)则对应于将全部正例排在全部反例以前的“理想模型”。
进行学习器的比较时,与P-R图类似,若一个学习器的ROC曲线被另外一个学习器的曲线彻底“包住”,则可断言后者的性能优于前者;若两个学习器的ROC曲线发生交叉,则难以通常性地断言二者孰优孰劣。此时若是必定要进行比较,则较为合理的判据是比较ROC曲线下的面积,即AUC (Area Under ROC Curve)。
四、代价敏感错误率与代价曲线
在现实生活中,不一样类型的错误所形成的后果不一样。例如在医疗诊断中,错误地把患者诊断为健康人与错误地把健康人诊断为患者,看起来都是犯了“一次错误”,但后者的影响是增长了进一步检查的麻烦,前者的后果却多是丧失了拯救生命的最佳时机。所以,为权衡不一样类型错误所形成的不一样损失,可为错误赋予“非均等代价” (unequal cost)。代价敏感错误率表明数据的平均整体代价。
在均等代价下,错误率是直接计算“错误次数”,并无考虑不一样错误会形成不一样的后果。在非均等代价下,咱们所但愿的再也不是简单地最小化错误次数,而是但愿最小化“整体代价” (total cost)。
有了实验评估方法和性能度量,表面上看就能对学习器的性能进行评估比较了。但怎么来作“比较”呢?
这里面涉及几个重要因素:
第一,咱们但愿比较的是泛化性能,然而经过实验评估方法咱们得到的是测试集上的性能,二者的对比结果可能未必相同;
第二,测试集上的性能与测试集自己的选择有很大的关系,且不论使用不一样大小的测试集会获得不一样的结果,即使用相同大小的数据集,若包含的测试样例不一样,测试结果也会有所不一样;
第三,不少机器学习算法自己有必定的随机性,即使用相同的参数设置在同一个测试集上屡次运行,其结果也会有所不一样。
为了解决这些问题,统计假设检验(hypothesis test)为咱们提供了重要的依据。
假设检验中的“假设”是对学习器泛化错误率分布的某种猜测或判断,而后经过假设的验证结果来对不一样的学习器或模型的性能进行判断。泛化错误率与测试错误率在直观上比较接近,所以,可根据测试错误率估推出泛化错误率的分布。
给定测试错误率,则求解样本误分类几率公式的偏导可知,错误率符合二项(binomial)分布。
如图所示,若 错误率=0.3,则10个样本中测得3个被误分类的几率最大。
[1]设定一个假设,好比“一个机器学习真正的泛化错误率不大于0.3”
[2]设定一个置信几率“显著度a”,a的通常取值为0.0五、0.1;a表明的意思是当咱们的假设成立的几率在(1-a,1]的范围内时,咱们认为是成立的。
[3]计算使假设在置信范围内成立的最大值是多少,好比根据上边[1]中的假设,要使泛化错误率不大于0.3成立,即泛化错误率小于0.3的几率大于(1-a)。要计算这个,咱们要算出要使错误率大于0.3的几率之和小于a时的最大泛化错误率是多少。
[4]比较计算出的知足假设的最大值和咱们实际计算出的值,若是咱们实际计算出来的错误率已经大于最大可能的错误率了,说明假设不成立。
[5]在这里的假设中,假设不成立说明咱们的学习器错误率要大于0.3啊,这是个很烂的学习器,咱们还须要继续调优。
在实际实验时,咱们会屡次使用留出法或交叉验证法进行屡次训练/测试,那么咱们实际上会获得多个测试错误率(这里假设为k个)。咱们能够经过求这些错误率的平均和方差来将假设检验转换为自由度为k-1的 t 分布。经过查询 t 检验经常使用临界表能够很方便的计算出假设是否成立。
对学习算法除了经过实验估计其泛化性能,咱们还须要理解“为何”具备这样的性能,“误差与方差分解”(bias-variance decomposition)是解释学习算法泛化性能的一种重要工具。
泛化偏差可分解为误差、方差和噪音之和。
误差度量了学习算法的指望预测与真实结果的偏离程度,即刻画了学习算法自己的拟合能力;方差度量了一样大小的训练集的变更所致使的学习性能的变化,即刻画了数据扰动所形成的影响;噪声则表达了在当前任务上任何学习算法所能达到的指望泛化偏差的下界,即刻画了学习问题自己的难度。
误差-方差分解说明,泛化性能是由学习算法的能力、数据的充分性以及学习任务自己的难度所共同决定的。
通常来讲,误差与方差是有冲突的。给定学习任务,假定咱们能控制学习算法的训练程度,则在训练不足时,学习器的拟合能力不够强,训练数据的扰动不足以使学习器产生显著变化,此时误差主导了泛化错误率;随着训练程度的加深,学习器的拟合能力逐渐加强,训练数据的扰动渐渐能被学习器学到,方差逐渐主导了泛化错误率;在训练程度充足后,学习器的拟合能力已很是强,训练数据发生的轻微的扰动都会致使学习器发生显著变化,若训练数据自身的、非全局的特性被学习器学到了,则将发生过拟合。
泛化偏差没法得到,经验偏差由于过拟合的存在而不适合做为标准,致使咱们须要专门的模型评估方法来测量学习器的效果
专门的模型评估方法是经过从数据集中选取一部分数据做为测试集来对训练出的模型进行验证,以测试偏差来近似泛化偏差实现的
测试偏差体如今具体的性能度量指标上,咱们要根据具体状况选择对应的指标
假设检验是咱们对学习器性能进行比较的有效方法
泛化性能是由学习算法的能力、数据的充分性以及学习任务自己的难度所共同决定的
(额外阅读)数据比算法要更重要的一个例子:对一批数据使用高明的算法,比不上用普通算法可是引入一部分外部数据源的效果要好( http://anand.typepad.com/datawocky/2008/03/more-data-usual.html )
具体的章节思路请参考下图理解: