西瓜书关键词笔记(第二章)

参考:

【一起啃书】机器学习西瓜书白话解读


模型评估与选择

本章重点问题:我们要如何评估一个模型到底是好还是不好?现在有几个模型摆在我面前,那我到底要选哪个?要怎么选?有没有什么评判标准?


错误率( Error rate ):样本数为 m ,分类错误的样本数为 a ,则错误率 E = a / m。同样可以将每个判断为错误之后(错误样本总数为 a )再乘上对应的概率再加起来。

精度( accuracy ):精度= 1 – 错误率,即 1 – a / m 或者 1 – E。

误差:| Y – Y‘ |。实际预测输出与样本真实输出之间的差异。

以手写数字识别为例。

样本真实(正确)输出:我丢进去新的三张图,答案分别是 3 、6 、7 、8 ,那这 3 、6 、7 、8 就是样本真实(正确)输出,这是我们希望模型预测出来的答案。这个就是 Y。

实际预测输出:你丢进了答案为 3 、6 、7、8 的新图,但是这个不太聪明的模型给你的答案是 3 、6、1、8 ,那这个 3 、6、1 、8 就是实际预测输出。这个就是 Y‘。

在这里就出现了误差,正确答案是 7 他交给你的卷子写着 1 。而这个误差是通过你丢了三张新图(不在训练集中抠出来的图)测出来的,这说明这个模型的泛化能力好像有点问题(学了,没完全学),因此这个也叫做泛化误差。

如果你丢进去的三张图是在训练集里面抠出来的:(?这是我喂给你的图唉你抄答案都抄错)那就说明在训练过程中出现了问题,这就是训练误差,或者也叫经验误差。

那么此时(就目前来看)这个模型的错误率为 1 / 4,也就是 25% ,精度就是 1 – 1 / 4 = 3 / 4,也就是75%,当然这只是打个比方,一般来说 m 的值会很大。

那么误差 | Y – Y‘ | ,因为对于 Y 和 Y‘ 的具体数值定义是有差别的,有些是不能直接作差的,就目前来说理解成概率论里面的计算方差就行。

过拟合:把训练样本自身的一些特点当作了所有潜在样本都会具有的一般性质(学疯了)。其实就是对样本要求过于严格。

欠拟合:训练样本的一般性质尚未学好。

举个书上的例子,在对树叶进行分类的时候,对某些树叶上的锯齿特征也学习到了,然后认为边缘不带锯齿的叶子就不算叶子了,这叫过拟合。把整棵树都当成叶子了(有绿色就算叶子)这叫欠拟合。

过拟合是机器学习面临的关键障碍。


测试集:用于测试学习器对新样本的判别能力。尽量不要用出现在训练集里面的数据。

通过对数据集进行适当处理,就可以产生训练集 S 和测试集 T ,下面是几种常用方法。

留出法:直接将数据集进行暴力二八、三七分(或其他比例)。

k 折交叉验证:【在数据集比较小的时候这个方法比较有效,数据集太大了费时间费电脑。】

比如下图将数据集分成 10 份,则第一次训练的训练集就是第 1 份到第 9 份,然后第 10 份当成测试集,获得一个测试结果;第二次训练的时候训练集是除了第 9 份以外的其他数据,然后将第 9 份当成测试集,获得一个测试结果,接下来就以此类推。到最后训练 k 次,有了 k 份测试结果,然后将这 k 份测试结果计算一个平均值,就当成是最终结果。

自助法:从数据集 D 中有放回抽样,每次抽样都记录数据,记录下来之后产生了一个新的数据集 D‘ 。将 D’ 作为训练集,将 D \ D’ 即在 D‘ 中从来没有出现过的数据集当作测试集。

所以在 D 中肯定有一部分从来没有在 D‘ 中出现过,也肯定有一部分在 D’ 中频繁出现。

在数据集较小的时候比较有效。缺点是会引入估计偏差,因为改变了初始数据集中的分布,训练集在训练过程中从来没有出现过测试集中的东西,这个东西指的是没有让计算机学习过的,相当于在做手写数字识别的时候你从来没让他见过数字 5 长什么样,你就要让他预测出来。

在数据量大的时候,一般是用留出法。

验证集:一般是为了调参。训练过程中的参数很多比如每一层的大小、层数、滤波器大小( 3×3 ?5×5 ?)、学习率、步长、batch_size 等等,若每次都用测试集去调参那其实不算很严谨,因为那就相当于又在测试集上训练,这样没办法说明模型的泛化能力。不过我还是觉得这个东西得根据实际情况来……

验证集其实就相当于试毒的人嘛,你刚炼好的丹没给试毒的人吃过你就敢给皇帝吃吗,研究新药都还要经过临床实验呢。


性能度量:判断一个模型是否好坏的评价标准。当然还是要根据具体情况具体分析。

均方误差:回归任务时常用的性能度量。误差的平方的平均值,简称均方误差。其实就跟方差差不多,每个误差的平方全部加起来再除以样本数。

也可以在每个误差的平方之后再分别乘以对应的概率,再加起来,这个就不需要除以样本数了,因为已经把概率乘上了。


查准率与查全率,要计算这俩就要先知道真正例、假正例、假反例和真反例。

Precision – 精度,negative – 消极的,true – 真,false – 假。

这两个性能度量一般用于二分类问题,即不是 1 就是 0 ,这里的 1 和 0 也能换成其他的东西。

真正例 TP :正确答案是 1 ,预测出的也是 1 ,回答正确。

假正例 FP :正确答案是 0 ,预测出的是 1 ,回答错误。假的当成真的了。【虚假的正例】

假反例 FN :正确答案是 1 ,预测出的是 0 ,回答错误。真的当成假的了。【虚假的反例】

真反例 TN :正确答案是 0 ,预测出的是 0 ,回答正确。

因此,查准率 P :在预测结果为 1 的所有数据中,预测正确为 1 的有多少。

查全率 R :在某一例子中所有的预测结果数据中(两种预测结果都有的),预测正确为 1 的有多少。就是在真正的 1 里面有多少被预测出来了。

P 与 R 是矛盾的,P 高 R 就低,反之亦然。也可以理解成一个阈值将 1 和 0 分开了,因为这个阈值 P 的值越大的时候,其实就相当于管得越严的一个过程,因为越严格就代表判断成 1 的数量变少了,也就是分母变小了。那么对于 R 来说,判断成 1 的数量少了就是分子少了,那么值就小了。

这一块还是 up 讲得比较清楚 https://www.bilibili.com/video/BV17J411C7zZ?p=13


P-R 曲线:可以用于确定最优阈值。

平衡点:在 P-R 曲线里 P = R 时的那个点。

调和平均( F1 )与加权调和平均

为什么要引入调和平均?

个人觉得某乎上这个答主的回答比较好:https://www.zhihu.com/question/47980482/answer/316968792

【相对于算术平均,调和平均引入了惩罚机制,即:对于参与调和平均的所有对象,如果它们的值不均衡,那么即使其中某些值非常高,均值也不会高。

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

宏 F1 :一般用于 n 个二分类问题(由多分类问题分解而成的 n 个二分类问题),其实就是分别计算出所有的 P 和 R 之后求平均值(这时候一般叫宏查准率和宏查全率),再代入上面的 F1公式。

微 F1:先计算 TP 、TN 、FP 、FN 的平均值再计算分别的 P 、R (微查准率和微查全率),最后再代入 F1 公式。


ROC 与 AOC

至于排序损失还是请看视频讲解,因为我画图真的画不明白orz

https://www.bilibili.com/video/BV17J411C7zZ?p=20


代价敏感错误率:由于在实际生产中,每一种错误所导致的后果严重程度都是不一样的,若只是简单粗暴第计算“错误次数”也不严谨(比如医生误诊错误所导致的后果要比我只是在平时作业里写了一个错别字的后果要严重得多)因此需要设置一个代价矩阵来综合考虑“总体代价”,而我们希望的是将这个总体代价最小化。

代价曲线

p :正例占总量的比例(正概率代价期望)

目的:对于一个模型,随着 p 的变化找出能使代价总期望最小的,那个阈值。

变量:横轴为归一化的 p ,纵轴为归一化的总代价期望。不同的直线代表在不同阈值下的 p 与总代价期望的变化。

期望总体代价:由各个阈值线围城的,期望总体代价最小的,那个面积。

归一化的意义:每个阈值不同,即代表横纵轴划分变化不同,这个时候的图会很不好画,横纵轴划分的量都不同就没办法把所有的阈值线条都画到一张图里,这样就达不到目的,找不到阈值也找不到期望总体代价。


比较检验

我们先用某种实验评估方法获得了性能度量结果,然后呢?一般我们拿到结果之后要做的就是比较,那这个比较要怎么做?有没有比较的标准或方法?目的就是找到这个比较的方法。

统计假设检验( hypothesis test )为我们进行模型性能比较提供了重要依据。基于假设检验结果我们可能推断出,若在测试集上观察到模型 A 比 B 好,那么 A 的泛化性能在统计意义上就一定优于 B 吗?这个结论的把握有多大?

假设检验:现实任务中我们并不知道学习器的泛化错误率,只能知道他的测试错误率,二者也未必相同。一般可以通过测试错误率估计出泛化错误率的分布。

若设置错误率小于等于 0.3,则就是单侧置信区间。左边全是 90% 的面积。

后面的各种检验方法等我什么时候把概率论补一下就什么时候补上,现在是真的没什么心情看了。一次吃太多了我得消化一下……


一点思考:

这是那个啃西瓜书 up 画的部分思维导图(画得超好看),重点在于前面关于模型和算法的分类部分,后面的其实都差不多,碍于软件和自身关系我自己画的很丑(感觉就像普通清单,但还是觉得比纯文字清晰)。

我思考了一下,一种训练集多种算法就不能使用性能度量中的 P 和 R 吗?这一章的重点就在于对模型的评估方法以及判断标准,每个模型都可能都来自于不同的算法、不同训练集、同一个算法中的不同参数,总而言之,除了像均方误差这种基本只针对回归任务的以外,其他的任何性能度量以及评估方法都具有普遍性。up 这样归类可能只是因为这些方法在某些情况用得特别多。

不过还有一个致命的问题——虽说查全率、查准率、F1、ROC 和 AUC 等对于模型评估确实能通用,但是基本只能在二分类任务中通用。也就是说,对于多分类任务,你得首先把他分成 n 个二分类任务之后再进行评估。

那么回到实际生产中,我们一般做的都是多分类任务,例如水果分类之类的东西(这个时候才回忆起来雷达站应该是属于二分类任务),假如我们的需求是对苹果、雪梨和西瓜三种水果进行分类,那么这个时候应该可以分成 3 个二分类任务,是不是苹果、是不是雪梨、是不是西瓜,或者苹果与雪梨、苹果与西瓜、雪梨与西瓜。可是我们就算分了这 3 个二分类,我们训练出来的模型都只有一个啊?我们需要的是一次就能给三种水果分类的模型。

思考到这里我好像明白了什么——不是让你分成了 n 个二分类任务再训练,而是让你训练完了再分别针对分成的二分类小题进行模型评估,是评估而不是训练。也就是说,我们需要找到那个针对每个二分类任务都能完成得很好的模型。

回到比赛这里,不管是雷达站还是矿石,这个基本都是二分类任务,但我们的目标检测来源都是视频流,就平时来说我们判断一个模型好不好完全就是依靠肉眼,就是把这个模型丢进一个视频里看那个框准不准、稳不稳……

我觉得我下一步的目标可以先把第三章放一放先不看,而是先尝试用代码实现这些评估方法来评判一下已经训练好的模型……

下面是我自己那个很丑的思维导图:


发表回复 0

Your email address will not be published. Required fields are marked *