1. 章节主要内容(遇到不清楚的概念请在第二节基础知识中找寻解释)
在第一章绪论中,我们知道要根据具体的问题选择具体的算法和归纳偏好。那么我们怎么判定我们的选择是正确的呢?这就需要拥有一套规范的模型评估与选择方法论了。
1)首先,我们要理解机器学习为什么需要一套模型评估与选择方法论?(经验误差与过拟合)
在前一章的学习中,我们知道机器学习是对数据集的泛化过程,即从输入的数据中归纳出一套能适用于所有潜在样本的“普遍规律”。可因为训练数据不够充分,机器学习出来的模型并没办法涵盖所有的情况,这就会导致学习器的实际预测输出与样本的真实输出之间存在“误差”。
学习器在训练集上的误差称为“经验误差”,在新样本上的误差称为“泛化误差”。很明显,要使得分类器尽可能的有用,我们应该要让泛化误差仅可能的小。可惜在现实环境中,我们很难知道新样本是什么样的,所以我们实际能做的只有努力使经验误差最小化。
说到这里,也许有的心急的同学已经迫不及待的去将算法设计的尽可能百分百的满足所有训练样本了,可却忘了学习器真正要达到的是泛化误差尽可能小,而不是目前的折中方案降低经验误差。而在降低经验误差的道路上,驻守着机器学习领域最大的拦路虎之一:“过拟合”
“过拟合”是指学习器对训练样本学的太好了,导致泛化程度不够(还记得机器学习就是一个泛化过程吗),没法适应新的数据样本。与之相反的还有一个“欠拟合”的概念,就是对训练样本中的一般规律都没学习好。举个例子,你通过姚明这个训练样本来学习一个人类判断器,如果你将身高两米二十以上作为判断是否是人的依据,那就是过拟合了;而如果你没有“直立行走”这样的特征都没有找出来作为判断是否是人的标准,那就是欠拟合了。
上边例子是我自己想的,下边贴出书中一个更容易理解的例子来帮助大家理解吧:
所以,我们知道了吧,我们为什么需要一套模型评估与选择的方法论呢?因为我们的训练数据没法真正代表真实的样本空间,而泛化误差无法直接获得,经验误差又因为过拟合的存在而不适合作为标准,所以我们才需要一套模型评估与选择的方法论
2)我们知道了为什么要对模型进行评估,那么在不知道泛化误差的情况下,我们该如何进行评估呢?
一个合理的思路是:既然我们没法拿到新样本来进行泛化误差计算,那么我们可以从训练样本中取出一部分来,假装它是一组新样本,并用这些样本计算出来的误差作为泛化误差的近似。这组选出来的样本被称为“测试集”,测试集上的误差被称为测试误差。(我们学习本书的一个主要目的是学会机器学习领域的脉络和背后逻辑,这种评估思路是科学研究领域的一个常用思路。领悟这种思路有助于我们解决其它领域上的问题)
不过我们需要注意一点,那就是测试集应该尽量不与训练集重合,否则测试集计算出的误差将没法准确代表该学习器的泛化能力。
基于这个考虑,书中列出了以下几种把包含m个样例的数据集D划分为训练集S和测试集T的办法(只介绍中心思想,具体内容请查看书中原文)
[1]留出法(hold-out)
直接将D划分为互斥的两部分S和T,在S上训练出模型后,用T来评估测试误差
[2]交叉验证法(cross validation)
将D划分为互斥的k个子集,每次训练用其中(k-1)个数据,用剩下的一个作为测试集。这样就能获得k组训练/测试集,对这k组分别进行训练和测试,最终返回k个测试结果的均值
[3]自助法(bootstrapping)
每次从D中随机复制一个样本到D1中,重复m次,会得到一个拥有m个数据样本的D1数据集。显然,D中的一部分数据会多次出现在D1中,而另一部分样本不出现。根据平均分布概率计算,大约有36.8%的数据不会被复制到D1中
[4]注意点
训练/测试集的划分要尽可能保持数据分布一致性
单词划分往往不够稳定可靠,一般要采用若干次随机划分、重复进行实验评估后取平均值作为评估结果
训练/测试集的划分比例没有完美答案,训练样本多会使得模型更接近D,测试样本多会使得评估结果更可靠,这其中的取舍因人/场景而异。常见的训练/测试划分比例是2:1~4:1
[5]调参
不同的参数其实就代表着不同的模型了。一般参数分两种:一类是算法的参数,亦称“超参数”,如聚类要分的簇数量k;一类是模型的参数,如神经网络中每个节点的权重。前者多为人工选择一组候选,后者是让机器自己学习。
调参是机器学习的重点,也是决定模型性能的关键。一般调参过程中,会将训练数据再次划分为训练集和验证集(validation set)。具体包含关系如下:
(数据集 (训练数据(训练集)(验证集)) (测试集))
[6]适用性
自助法在数据集较小、难以有效划分训练/测试集时很有用
自助法产生的数据集改变了初始数据集的分布,这会引入估计偏差。因此,在初始数据量足够时,留出法和交叉验证法更常用一些
3)在上一节了解了什么是有效可行实验评估方法,接下来我们需要了解一下具体的衡量模型泛化能力的评价标准,即性能度量(performance measure)
性能度量反映了任务需求,使用不同的性能度量会导致对模型的评判结果不同。这意味着模型的“好坏”是相对的,什么样的模型是好的,不仅取决于算法和数据,还决定于任务需求。
回归任务中最常用的性能度量是“均方误差”,即用模型的输出与实际输出计算输出结果的方差。本章节介绍了多种性能度量,请大伙在下边基础知识章节中查看具体含义,在这里我只总结描述这些指标的具体使用(因为书本中的公式介绍比较清楚,我在这里只记录每种度量的意思,详细公式请小伙伴们去书本中查看)
本章节介绍了很多性能度量指标,我这里选择其中的查准率、查全率进行重点介绍,以供小伙伴们对性能度量有着更清晰的认识:
从上可知查准率和查全率是一对矛盾的度量,一般情况下当一方增高时,另一方会下降,而决定这组度量升高下降的因素是学习器的分类阀值。举个例子大家就能理解:
假设有10个西瓜,6个好瓜,4个坏瓜。我们将这十个瓜按照预测结果排序,最可能是好瓜的排在前头,最不可能的排在最后,然后控制学习器的分类阀值来依次逐个把样本作为好瓜来进行预测,则可以计算出不同的阀值时的P和R如下表所示:
由上边例子可以看到,P和R的值也基本满足了一方升高,另一方下降的状况,通常只有在一些简单的任务(比如我举的这个)中,才可能使查全率和查准率都很高。以查准率为纵轴、查全率为横轴作图,就得到了查准率-查全率曲线,简称“P-R曲线”。
在进行比较时,若一个学习器的P-R曲线被另一个学习器的曲线完全“包住”,则可断言后者的性能优于前者。当曲线有相交时,很难断言两者的优劣。真要判别时,“平衡点”(Break-Even Point)是一个不错的度量方法。下图是一个具体的示意图:
查准率顾名思义更关注的是预测的准确性(预测正确的比例)、查全率更关注的是预测的全面性(预测正确的个数)。
4)有了实验评估方法和性能度量,剩下的就是要好好研究研究如何应用方法和度量指标去对学习器的性能进行评估比较了
研究怎么来做“比较”是很有必要的,因为第一,我们要的是泛化性能,但是能用的只是测试性能;第二,测试性能和测试集的选择有很大关系;第三,有的机器学习算法本身也有随机性,对同一测试集的多次测试结果也会不同。
为了解决这些问题,统计假设检验(hypothesis test)为我们提供了重要的依据。
假设检验中的“假设”是对学习器泛化错误率分布的某种猜想或判断,然后通过假设的验证结果来对不同的学习器或模型的性能进行判断。比如假设“学习器A和B性能相同”,当该假设被拒绝时,说明学习器A和B具有显著差异,这时候错误率较低的学习器性能较优。
假设检验的具体逻辑和使用方法是这样的(这里只总结计算逻辑,详细的概念、公式等请查看专业书籍):
[1]设定一个假设,比如“一个机器学习真正的泛化错误率不大于0.3”
[2]设定一个置信概率“显著度a”,a的一般取值为0.05、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 检验常用临界表可以很方便的计算出假设是否成立。
书中提到的交叉验证 t 检验、Friedman检验与Nemenyi后续检验都是基于一样的假设检验流程的稍微变化。其中交叉验证 t 检验是针对两种学习器之间性能的比较,Friedman检验与Nemenyi后续检验是针对多个学习器之间性能的比较。在这里就不一一介绍了。
5)对学习算法除了通过实验估计其泛化性能,我们还需要理解“为什么”具有这样的性能,“偏差与方差分解”(bias-variance decomposition)是解释学习算法泛化性能的一种重要工具
省略具体的算法和公式推导过程,偏差与方差分解是对学习算法的期望泛化错误率的分解,分解结果是下边这个重要的公式
也就是说,泛化误差可分解为偏差、方差与噪声之和。
其中,偏差度量了学习算法的期望预测与真实结果的偏离程度,即刻画了学习算法的拟合能力;方差度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动所带来的影响;噪声则表达了在当前任务上任何学习算法所能达到的期望泛化误差的下界,即刻画了学习问题本身的难度。
偏差-方差分解说明,泛化性能是由学习算法的能力、数据的充分性以及学习任务本身的难度所共同决定的。
一般来说,偏差与方差是有冲突的。要使偏差小则需要算法对数据充分拟合,这就有可能会导致过拟合,这样对新样本的适应性差,就会导致方差变高。反之亦然,拟合过低,偏差较大,但是方差会相对较低。
2. 基本知识
1)概念
错误率(error rate):m个样本中a个错误,则错误率为 E = a/m
精度(accuracy):精度=1 - a/m
误差(error):实际预测输出与样本的真实输出之间的差异。在训练集上的误差称为训练误差(training error)或 经验误差(empirical error),在新样本上的误差称为“泛化误差”(generalization error)
过拟合(overfitting):学习器把训练样本学得太好了,把训练样本中的特殊特征当作了普遍规律,导致泛化性能下降
欠拟合(underfitting):与过拟合相反,对训练样本中的一般规律都没有学好
测试集(testing set):训练样本中提取出来的作为测试学习器对新样本判别能力的一部分数据。测试集数据应该尽可能与训练样本不同
测试误差(testing error):在测试集上的误差
2)性能度量指标概念
[1]错误率与精度
分类任务中最常用的两种性能度量,其中错误率是分类错误的样本数占样本总数的比例。精度是分类正确的样本数占样本总数的比例。
[2]查准率、查全率与F1
查准率(precision):被模型预测为正的样本中,真正为正的样本比例(被预测为好瓜的西瓜中,真的是好瓜的西瓜比例)
查全率(recall):在所有正的样本上,被学习器预测为正的样本比例(在所有好瓜中,被学习器正确识别的好瓜比例)
F1:(2x查准率x查全率)/(查准率+查全率)。 F1是基于查准率和查全率的调和平均。
(查准率和查全率的概念不难理解,但是意思比较相近,看过一段时间之后老是会弄混。在读论文时,很多时候是用precision和recall来进行性能度量,所以将熟记这两个指标还是十分必要的)
“平衡点”(Break-Even Point):“查准率=查全率”时的取值。
[3]ROC与AUC
ROC:“受试者工作特征”(receiver operating characteristic)曲线,与P-R 曲线类似,只不过取用“真正利率”(TPR )作为纵轴,“假正例率”(FPR)作为横轴
[4]代价敏感错误率与代价曲线
代价敏感错误率代表数据的平均总体代价;代价曲线详情见书本
3)假设检验
基于假设检验结果我们可推断出,若在测试集上观察到学习器A比B好,则A的泛化性能是否在统计意义上优于B,以及这个结论的把握有多大。
4)偏差与方差
偏差-方差分解是对学习算法的期望泛化错误率进行的分解。泛化误差可分解为偏差、方差与噪声之和。
其中,偏差度量了学习算法的期望预测与真实结果的偏离程度,即刻画了学习算法的拟合能力;方差度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动所带来的影响;噪声则表达了在当前任务上任何学习算法所能达到的期望泛化误差的下界,即刻画了学习问题本身的难度。
3. 总结
泛化误差无法获得,经验误差因为过拟合的存在而不适合作为标准,导致我们需要专门的模型评估方法来测量学习器的效果
专门的模型评估方法是通过从数据集中选取一部分数据作为测试集来对训练出的模型进行验证,以测试误差来近似泛化误差实现的
测试误差体现在具体的性能度量指标上,我们要根据具体情况选择对应的指标
假设检验是我们对学习器性能进行比较的有效方法
泛化性能是由学习算法的能力、数据的充分性以及学习任务本身的难度所共同决定的
(额外阅读)数据比算法要更重要的一个例子:对一批数据使用高明的算法,比不上用普通算法但是引入一部分外部数据源的效果要好( http://anand.typepad.com/datawocky/2008/03/more-data-usual.html )
具体的章节思路请参考下图理解: