模型评估与选择

误差

在分类任务中,通常把错分的样本数占样本总数的比例称为错误率(error rate)。比如m个样本有a个预测错了,错误率就是a/m;与错误率相对的有精度(accuracy),或者说正确率,数值上等于 1错误率1-错误率

更一般地,通常会把模型输出和真实值之间的差异称为误差(error)。在训练集上的误差称为训练误差(training error)或者经验误差(empirical error)。而在新样本上的误差则称为泛化误差(generalization error)。我们希望模型的泛化误差尽可能小,但现实是,我们无法知道新样本是怎样的,所以只能尽可能地利用训练数据来最小化经验误差。

但是否经验误差小,泛化误差就一定小呢?这不是一定的,如果模型相比训练数据来说过于复杂,那就很有可能把训练数据本身的一些特点当作整个样本空间的特点,从而使得在训练数据上有很小的经验误差,但一旦面对新样本就会有很大误差,这种情况叫做过拟合(overfitting)。相对的是欠拟合(underfitting)

欠拟合很容易避免,只要适当地增加模型复杂度(比方说增加神经网络的层数)就好。但过拟合是无法彻底避免的,只能缓解(减少模型复杂度/增加训练数据),这也是机器学习发展中的一个关键阻碍。

在现实任务中,要处理一个问题,我们往往有多种算法可以选择,即使是同一个算法也需要进行参数的选择,这就是机器学习中的模型选择 (model selection)问题。既然泛化误差无法使用,而经验误差又存在着过拟合问题,不适合作为标准,那么我们应该如何进行模型选择呢?针对这个问题,后面的三个小节会给出回答。

这里先简单归纳一下,书中将模型选择问题拆解为(1)评估方法;(2)性能度量;(3)比较检验;三个子问题。可以这样理解:

  • 评估方法:用什么数据做评估?如何获得这些数据?

  • 性能度量:评估时如何衡量模型的好坏?有哪些评价标准?

  • 比较检验:如何比较模型的性能?注意不是简单地比大小!在机器学习中性能比较是相当复杂的。

 

评估方法

前面已经提到了不能把经验误差用作模型评估,否则会存在过拟合的嫌疑。那么很自然地,我们就会想到是否有一种方法能近似泛化误差呢?答案是有的,就是使用测试集(testing set)进行评估,利用测试误差(testing error)来近似泛化误差。

测试集和训练集一样,从样本空间中独立同分布采样而得,并且应尽可能与训练集互斥,也即用于训练的样本不应再出现在测试集中,否则就会高估模型的性能。为什么呢?举个例子,老师布置了2道题做课后作业,如果考试还是出这2两题,只能证明大家记住了这2道题;只有出不一样的题,才能看出大家是否真的掌握了知识,具备了举一反三的能力。

注意!!测试数据更多地是指模型在实际使用中遇到的数据,为了和模型评估中使用的测试集进行区分,一般会把模型评估用的测试集叫做验证集(validation set)。举个例子,在Kaggle或者天池上参加比赛,我们一般会拿到一份带标记的原始数据集和一份不带标记的测试数据集。我们需要选用一种评估方法来把原始数据集划分成训练集和验证集,然后进行训练,并按照模型在验证集上的性能表现来进行选择。最后挑出最好的模型对测试集的样本进行预测,并提交预测结果。下文将介绍几种常用的评估方法。

留出法

直接将数据集划分为两个互斥集合,注意保持数据分布的一致性(比如比例相似)。保留类别比例的采样方式又叫分层采样(stratified sampling)。举个例子,原始数据集有100个样本,假设训练集占70个,验证集占30个。若训练集中正例反例各35个,也即比例为1:1,那么验证集中就应该正例反例个15个,同样保持1:1的比例。当然,这个比例最好还是遵循原始数据集中数据的分布规律。

单独一次留出法的结果往往不可靠,一般是进行多次随机划分,然后取各次评估的平均值作为评估结果。

留出法最大的缺点就是要进行划分,当训练集占的比例较大时,模型可以更准确地刻画原始数据集的特征,但是因为验证集较小,评估的结果往往不稳定也不准确;当训练集占的比例较小时,训练出的模型又不能充分学习到原始数据集的特征,评估结果可信度不高。这个问题没有完美的解决方案,一般取数据集2/3~4/5的样本作为训练集,余下的作为验证集。

交叉验证

又称为k折交叉验证(k-fold cross validation),将数据集划分为k个互斥子集。每次使用k-1个子集的并集作为训练集,余下的一个子集作为验证集,这就构成了k组训练/验证集,从而可以进行k次训练和验证。最终取k次验证的均值作为评估结果。常用的k值包括5,10,20。

类似于留出法,因为存在多种划分k个子集的方式,为了减少因不同的样本划分而引入的差别,需要进行多次k折交叉验证。例如10次10折交叉验证,指的是进行了总计100次训练和100次评估。

特别地,令k=数据集样本数的交叉验证称为留一法(Leave-One-Out,简称LOO),即有多少样本就进行多少次训练/验证,并且每次只留下一个样本做验证。这样做的好处是不需要担心随即样本划分带来的误差,因为这样的划分是唯一的。一般来说,留一法的评估结果被认为是比较准确的。但是!当数据集较大时,使用留一法需要训练的模型太多了!这种计算开销是难以忍受的!

自助法

在留出法和交叉验证法中,我们都需要对数据集进行划分,从而使得训练所用的数据集比源数据集小,引入了一些因规模不同而造成的偏差,有没有办法避免规模不同造成的影响呢?

自助法(bootstrapping)正是我们需要的答案,以自助采样(bootstrap sampling)为基础,对包含m个样本的源数据集进行有放回的m次采样以获得同等规模的训练集。在这m次采样中都不被抽到的概率大约为0.368,也即源数据集中有大约1/3的样本是训练集中没有的。因此,我们可以采用这部分样本作为验证集,所得的结果称为包外估计(out-of-bag estimate)

注意,自助法适用于数据集小,难以划分训练/验证集的情况。因为自助法能产生多个不同训练集,所以对集成学习也大有好处。但是!自助法改变了数据集的分布,也因此引入了一些额外的误差。因此,数据量足的时候还是留出法和交叉验证法用得多一些。

调参和最终模型

调参(parameter tuning)一般先选定一个范围和变化步长,比如(0,1],步长0.2,这样就有五个参数候选值。然后进行评估,选出最好的一个。这样选出的未必是全局最优的参数,但为了在开销和性能之间折中,只能这么做,毕竟我们无法试尽参数的所有取值。而且多个参数组合的情况是指数上升的,比方说有3个参数,每个参数评估5种取值,就需要测试多达 535^3 种情形。

特别注意,训练/验证这个过程是为了让我们确定学习算法和算法的参数,确定了这些之后,我们需要再利用整个源数据集进行训练,这次训练所得的模型才是最终模型,也即提交给用户,进行测试的模型。

 

性能度量

性能度量(performance measure)指的是用于衡量模型泛化能力的评价标准。使用不同的性能度量往往导致不同的评判结果。比方说搭建推荐系统,两个模型中一个精度高,一个覆盖度高,如果我们想让更多的商品得到推荐可以就会选后一个模型。所以说,模型的好坏是相对的,取决于我们采用什么性能度量,而采用什么性能度量则应取决于我们的任务需求

这个小节主要介绍分类任务中常用的性能度量。

错误率和精度

在本章的开头已经提及到了,不再累述,这两个性能度量可写作更一般的形式,基于数据分布和概率密度函数进行定义。

书中还提到了其定义的公式,其中 I\mathbb{I} 指的是统计满足条件的个数,即:f(xiyi)f(x_i\neq y_i) 成立时 I(f(xiyi))=1\mathbb I(f(x_i\neq y_i))=1

查准率,查全率,F1

假设我们正常处理一个二分类问题,按照模型预测值和真实值可以把测试样本划分为四种情形:真正例(true positive),假正例(false positive),真反例(true negative),假反例(false negative)。可以把结果表示为下图这个矩阵——混淆矩阵(confusion matrix)

真实情况预测结果
正例反例
正例TP(真正例)FN(假反例)
反例FP(假正例)TN(真反例)

TP相当于真实情况中为1,预测也为1(正),FN则说明是真实1预测了0,相当于,TP、TN是预测对了的情况,FN、FP是预测错了的情况。

查准率,又称准确率(precision),用于衡量模型避免错误的能力,分母是模型预测的正例数目。

precision=TPTP+FPprecision = \frac{TP}{TP+FP}

查全率,又称召回率(recall),用于衡量模型避免缺漏的能力,分母是测试样本真正包含的正例数目。

recall=TPTP+FNrecall = \frac{TP}{TP+FN}

查全率与查准率的关系

一般来说,这两者是矛盾的,提高其中一者则另一者必然会有所降低。也就是说,想要又全又准是很难的,要找出所有正例,就难免同时选出很多反例,而要使得选择更为精确,就难免漏掉一部分正例。这是因为在截断点附近正反例相混合程度(或者说相似度)较高,我们很难精确地划分开,要找得多那么就要阈值小一些,要找得准那就要阈值大一些。

PR图像

平衡点(Break-Event Point,简称BEP)就是这样一个度量,它是“查准率=查全率”时的取值,例如图2.3中学习器C的BEP是0.64,而基于BEP的比较,可认为学习器A优于B。

F1度量

F1,是查准率和查全率的调和平均,用于综合考虑这两个性能度量。

1F1=12×(1precision+1recall)F1=2×precision×recallpresion+recall\frac{1}{F1} = \frac{1}{2} \times (\frac{1}{precision} + \frac{1}{recall}) \Rightarrow F1 = \frac{2 \times precision \times recall}{presion + recall}

有时候我们对查准率,查全率的需求是不同的。比方说广告推荐,要尽量避免打扰用户,因此查准率更重要;而逃犯检索,因为漏检的危害很大,所以查全率更重要。这时就需要使用FβF_\beta了。

FβF_\beta 度量

FβF_\beta,是查准率和查全率的加权调和平均,用于综合考虑这两个性能度量,并采用不同的权重。

1Fβ=11+β2×(1precision+β2recall)Fβ=(1+β2)×precision×recall(β2×presion)+recall\frac{1}{F_\beta} = \frac{1}{1+\beta^2} \times (\frac{1}{precision} + \frac{\beta^2}{recall}) \Rightarrow F_\beta = \frac{(1+\beta^2) \times precision \times recall}{(\beta^2 \times presion) + recall}

其中 β>0\beta>0 度量了查全率对查准率的相对重要性,等于1时FβF_\beta 退化为F1,小于1时查准率更重要,大于1时查全率更重要。

书中还介绍了如何对多次训练/测试产生的多个混淆矩阵进行评估,包括宏方法(先分别计算性能度量,再计算均值)和微方法(先对混淆矩阵各元素计算均值,再基于均值计算性能度量)两种途径。

ROC与AUC

很多时候,使用模型对测试样本进行预测得到的是一个实值或者概率(比如神经网络),需要进一步设置阈值(threshold),然后把预测值和阈值进行比较才能获得最终预测的标记。

我们可以按照预测值对所有测试样本进行排序,最可能是正例的排前面,最不能是正例的排后面。这样分类时就像是在这个序列中以某个截断点(cut point)把样本分成两部分。我们需要根据任务需求来设置截断点。比如广告推荐更重视查准率,可能就会把截断点设置得更靠前。

因此!排序本身的质量很能体现出一个模型的泛化性能,ROC曲线就是一个用来衡量排序质量的工具。

ROC,全称受试者工作特征(Receiver Operating Characteristic)。怎样画ROC曲线呢?先定义两个重要的计算量:真正例率(True Positive Rate,简称TPR)假正例率(False Positive Rate,简称FPR)

TPR=TPTP+FNTPR = \frac{TP}{TP+FN}

FPR=FPTP+FNFPR = \frac{FP}{TP+FN}

TPR其实就等于召回率。在绘制ROC曲线时,纵轴为TPR,横轴为FPR。

我们期望TPR尽可能高,FPR尽可能低

绘图过程很简单:给定 m+m^+ 个正例和 mm^- 个反例,根据学习器预测结果对样例进行排序,然后把分类阈值设为最大,即把所有样例均预测为反例,此时真正例率和假正例率均为0,在坐标(0, 0)处标记一个点然后 ,将分类阈值依次设为每个样例的预测值,即依次将每个样例划分为正例。设前一个标记点坐标为 (x,y)(x,y),当前若为真正例,则对应标记点的坐标为 (x,y+1m+)(x,y+\frac{1}{m^+});当前若为假正例,则对应标记点的坐标为 (x+1m,y)(x+\frac{1}{m^-},y),然后用线段连接相邻点即得。

有两个值得注意的特例:

  • 经过 (0,1) 点的曲线,这代表所有正例都在反例之前出现(否则会先出现假正例从而无法经过 (0,1) 点),这是一个理想模型,我们可以设置一个阈值,完美地分割开正例和反例。

  • 对角线,这对应于随机猜测模型,可以理解为真正例和假正例轮换出现,即每预测对一次接下来就预测错一次,可以看作是随机猜测的结果。

若一个模型的ROC曲线完全包住了另一个模型的ROC曲线,我们就认为这个模型更优。但是如果两条曲线发生交叉,要怎么判断呢?比较合理的判据是AUC(Area Under ROC Curve),即ROC曲线下的面积。

AUC=12i=1m1(xi+1xi)(yi+yi+1)AUC=\frac{1}{2}\sum_{i=1}^{m-1}(x_{i+1}-x_i)\cdot(y_i+y_{i+1})

补充一点,ROC曲线上的面积等于排序损失(loss)。也即有:

AUC=1rankAUC = 1 - \ell_{rank}

比如我们要识别哪些手写的数字是5,我们的模型对所有的手写数字打分,从左到右分数依次升高,分数越高意味着模型认为该手写数字越可能是5。我们容易看出,从左到右,第1,2,3,4,6,9个是反例(m=6m^-=6),剩下的是正例(m+=6m^+=6),从左到右考虑每一个正例,对于某一正例,若右侧每有一个反例,就记一个罚分(不考虑相等),对于从左到右第一个正例(第五个手写数字),罚分为2,以此类推,最后 rank=2+1+16×6=19\ell_{rank} =\dfrac{2+1+1}{6\times 6}=\dfrac19

代价敏感错误率与代价曲线

参考https://www.zhihu.com/question/63492375

现实任务中,有时会遇到不同类型错误造成后果不同的状况。比如医生误诊,把患者诊断为健康人的影响远大于把健康人诊断为患者,因为可能因为这次误诊丧失了最佳治疗时机。为了权衡不同类型错误带来的不同损失,可以为这些错误类型赋以非均等代价(unequal cost)

还是举二分类为类,可以根据任务的领域知识来设定一个代价矩阵(cost matrix):

真实类别预测类别
第0类第1类
第0类0cost_01
第1类cost_100

预测值与真实值相等时,自然错误代价为0。但把第0类错预测为第1类和把第1类错预测为第0类这两种错误的代价是不同的。注意,重要的不是代价在数值上的大小,而是它们的比值。比方说 cost01cost10>1\frac{cost_{01}}{cost_{10}} > 1, 这就说明把第0类错预测为第1类的代价更高。

使用了非均等代价之后,我们在使用性能度量时自然也需要作出相应的改变,比方说代价敏感(cost-sensitive)版本的错误率:(也就是说,使用cost对每次错误进行加权)

E(f;D;cost)=1mxiD+I(f(xi)yi)×cost01+xiDI(f(xi)yi)×cost10E(f;D;cost) = \frac{1}{m}\lgroup\sum_{x_i \in D^+}\mathbb{I}(f(x_i) \neq y_i) \times cost_{01} + \sum_{x_i \in D^-}\mathbb{I}(f(x_i) \neq y_i) \times cost_{10}\rgroup

其中 D+,DD^+,D^- 分别代表样例集 DD 中的正例子集与反例子集。

由于ROC曲线不能反应使用非均等代价之后的期望总体代价,所以改用代价曲线(cost curve)来取替。

代价曲线横轴是取值为[0,1][0,1] 的正例概率代价,其中 p=m+mp=\dfrac{m^+}{m}

P(+)=pcost01pcost01+(1p)cost10(1)P(+) = \frac{p \cdot cost_{0|1}}{p \cdot cost_{0|1} + (1-p) \cdot cost_{1|0}} \tag 1

纵轴是归一化代价:

costnorm=FNRpcost01+FPR(1p)cost10pcost01+(1p)cost10(2)cost_{norm} = \frac{\text{FNR} \cdot p \cdot cost_{0|1} + \text{FPR} \cdot (1-p) \cdot cost_{1|0}}{p \cdot cost_{0|1} + (1-p) \cdot cost_{1|0}} \tag 2

式(1)带入式(2)有:

costnorm=FNRP(+)+FPR(1P(+))(3)cost_{norm} = \text{FNR} \cdot P(+) + \text{FPR} \cdot \big(1 - P(+)\big) \tag 3

P(+)[0,1]P(+) \in [0,1] 整体看作参数(自变量),这是一个线性的参数方程。左端在 (0,FPR)(0,\text{FPR}) ,右端在 (1,FNR)(1,\text{FNR}) 的一条线段。

另,上面的式子中,cost01cost_{0|1} 表示:实际为 1 类,而错判成 0 类的代价,即 FN 的代价。下标中间的分割线“|”借用了条件概率的表述方式。(瓜书中没有分割线)

如何理解单根线段与横轴之间的(梯形)面积 = 模型对于某一阈值的期望总体代价

如何理解瓜书中提到的:

线段下的面积即表示了该条件下的期望总体代价

一言蔽之,该面积是与代价无关的。期望总体代价”该命名很容易对理解产生误导。简单地说,给定一个阈值,相应地统计出一个(FPRFNR)(FPR,FNR)组合,再根据该组合画出一条直线,全程没有用到代价。同时,横轴轴取值范围恒定为 [0,1][0,1],故之后的积分过程也不需要代价概念的参与。

奇怪的是如果我们把 期望 —— 总体 —— 代价 拆开来一个个说,该命名还是有嚼头的。“期望”和“代价”是针对纵轴而言,毕竟纵轴表示归一化后的代价期望。“总体”是针对横轴,横轴是一个关于正例概率 pp 的函数,故“总体”指的是所有 p[0,1]p \in [0,1]

对概念的命名是件很难的事情,从不同角度着手理解,一个不完美的命名可以呈现既合适又不合适的情形。本人斗胆觉得用“期望总体代价”来描述围成面积是不可接受的,应该命名为“总体错误率”更为妥帖,即模型对于某一阈值的期望总体错误率,即:

p[0,1]err(p)dp(0.1)\int_{p \in [0, 1]} \text{err}(p) \cdot dp \tag{0.1}

err(p)=FNRp+FPR(1p)(0.2)\text{err}(p) = \text{FNR} \cdot p + \text{FPR} \cdot (1-p) \tag{0.2}

值得注意的是,式(0.1)中积分的微分对象仅仅是正例先验 p,而不是式(1)中关于 p 的一个非线性函数,如此一来,“总体”该词的实际意义也更加直接。具体原因会在之后展开(详见图一、图二以及相关叙述)

如何理解所有线段围成的下包络线与横轴之间的面积 = 模型对于所有阈值的期望总体代价?

同上,既然任一直线的绘制与代价无关,那么所有直线拟出下包络线(即 CC 曲线)也与代价无关。依旧建议命名“总体错误率”,稍许不同的是 err(p)\text{err}(p) 的表述:

err(p)=inf(FNR,FPR)ΩFNRp+FPR(1p)(0.3)\text{err}(p) = \inf_{(\text{FNR},\text{FPR}) \in \Omega} \text{FNR} \cdot p + \text{FPR} \cdot (1-p) \tag{0.3}

这里, Ω\Omega 指的是一个模型对应的所有(FNRFPR)(FNR,FPR)的集合,即 CC 空间中所有线段的端点。inf\inf 操作对应了寻找下包络线。

引入代价的优势

一个好的“打分”模型,可以将 0 类和 1 类的分数分布完美分隔。在完美情况下,我们可以在两个分布之间设一个阈值,根据分数大于或是小于该阈值,准确无误地判断输入样本的类别。但现实通常是:0 类和 1 类的分数分布存在重叠,在重叠区间中,任何判断都存在错误的可能。于是,这个重叠部分的大小就成了评价模型好坏的关键,ROC 和代价曲线(CC)应运而生。

熟悉 ROC 的知友知道,ROC 的绘制大致分为以下几步:

  1. 列出所有“适合”的阈值。
  2. 对每一个阈值,计算出 TPR,FPR。
  3. 将所有(TPR,FPR)一一标在 ROC 空间上,并作线性插值以补全间断处。

从绘制 ROC 乃至最后计算 AUC 的整个过程中,假 1(FP)和假 0(FN)皆被同等对待。可是,在很多情况下,FP 和 FN 的后果是不一样的。例如,冤判好人比错放罪犯更令人心寒,高位满仓比错过牛市跟让人绝望,漏诊重疾相比小题大做更是对病人的不负责。再例如,坐在自动驾驶车里,我宁可希望它刹停在一个子虚乌有的“障碍”前,也不希望它一头冲向路边的电线杆子。这时,我们就需要给 FP 和 FN 设定不同程度的代价,代价曲线(CC)则可以把代价结合到对模型的评价中去。

所以我们才在本节最开始的时候引入了代价与代价矩阵

无/等代价的 CC 空间

图一

作者虽然在原论文中空降了 CC 的定义,但是易于理解的思路应该是:ROC 空间 \Rightarrow 无/等代价 CC 空间 \Rightarrow不等代价 CC 空间。这里,无/等代价 CC 空间指得是:不引入代价,或者 cost01=cost10\text{cost}_{0|1} = \text{cost}_{1|0} 的情况。如图一,无/等代价 CC 空间的纵横轴分别退化为错误率 pFNR+(1p)FPRp \cdot \text{FNR} + (1-p) \cdot \text{FPR} 和正例概率 pp

图二

在图二中,我做了以下几件事情:

  1. 根据两个不同的正态分布(分别代表 0 类和 1 类),随机各取 50 个样本点以模拟它们的模型打分。
  2. 依据这总共 100 个点绘制 ROC(图二 a)。
  3. 不引入代价,依据 ROC 绘制退化版 CC(图二 b)。
  4. 加入代价并令 cost01=0.2,cost10=0.4\text{cost}_{0|1}=0.2, \text{cost}_{1|0}=0.4,绘制图二 c。此时,虽然纵轴已经依照 CC 空间定义改成归一化代价,但横轴依旧是正例概率。可以明显看到直线变弯了。
  5. 在之前的基础上,依照 CC 空间定义再将横轴改成 probability cost(图二 d)。

实验的结论很明显,图二 b 和图二 d 是一模一样的。事实上,无论有无代价,还是任意变化代价,对同一个模型来说,其 CC 都是一样的既然一样,且看图二 b 和图一,这便是我为何更倾向于命名包络线下面积为“总体错误率”的原因。

CC 空间纵轴定义的动机

pdf:概率密度函数,个人认为,Class 0 p.d.f. = FNR,Class 1 p.d.f. = FPR。

图三

灰色的重叠区域导致了分类的不完美。图三尝试从最简单的情况开始:固定先验正例概率 p=0.5p=0.5 ,代价也暂时撇开不谈。试问:如何选取阈值,使得分类尽可能好?图中的 η\eta^* 在准确率/错误率意义下给出了最优解,灰色面积即最小错误率:

min. err. rate(p)=pFNR(η(p))+(1p)FPR(η(p))(4)\text{min. err. rate}(p) = p \cdot \text{FNR}(\eta^*(p)) + (1-p) \cdot \text{FPR}(\eta^*(p)) \tag 4

至于为什么最小,左右滑动阈值,想象下灰色区域的变化。不过,这一结论对于一般分布并不一定显然,只有遍历所有阈值才能确保最优。这里,我们把 FNR 和 FPR 写作关于 pp 的函数,因为它们决定于最优阈值,而最优阈值又决定于 pp ,详见图四。

图4

接下来引入代价 cost。

图5

这里 min. cost(p)\text{min. cost}(p) 是图五中灰色区域:

min. cost(p)=FNR(p)pcost01+FPR(p)(1p)cost10(5)\text{min. cost}(p) = \text{FNR}(p) \cdot p \cdot \text{cost}_{0|1}+ \text{FPR}(p) \cdot (1-p) \cdot \text{cost}_{1|0} \tag 5

现在到了归一化。图五中,虚线部分已经不能成为分布了,因为各自乘以 cost 后,积分明显小于原来,不再是 1。可以想象,灰色区域可以随着 cost 的绝对值任意变化,从而丧失了可比性。归一化的一个目的就是为了消除 cost01cost10\text{cost}_{0|1} 和 \text{cost}_{1|0} 的绝对值对模型评价的影响。一种很自然的归一化思路就是把积分再次拉回 1。纵向拉伸的倍率如下:

integral w/ costintegral w/o cost=integral w/ cost1=(1p)+p(1p)cost10+pcost01=1(1p)cost10+pcost01(6)\frac{\text{integral w/ cost}}{\text{integral w/o cost}} = \frac{\text{integral w/ cost}}{1} \\ = \frac{(1-p) + p}{(1-p) \cdot \text{cost}_{1|0} + p \cdot \text{cost}_{0|1}} = \frac{1}{(1-p) \cdot \text{cost}_{1|0} + p \cdot \text{cost}_{0|1}} \tag 6

很明显,灰色区域也会以该倍率变化。归一化后的灰色区域面积,即模型关于 pp 的归一化代价为:

min. norm. cost(p)=FNR(p)pcost01+FPR(p)(1p)cost10pcost01+(1p)cost10(7)\text{min. norm. cost}(p) = \frac{\text{FNR}(p) \cdot p \cdot \text{cost}_{0|1}+ \text{FPR}(p) \cdot (1-p) \cdot \text{cost}_{1|0}}{p \cdot \text{cost}_{0|1}+ (1-p) \cdot \text{cost}_{1|0}} \tag 7

至此,式(7)就是 CC 空间中的纵轴。

式(6)没看懂,反正结果是可以理解的

CC 空间横轴定义的动机

回过头看 ROC 空间中的一个点(TPR,FPR),它又等于(1 - FNR,FPR),易见:CC 空间的中的直线与 ROC 空间中的点是一一对应的。这样的点/直线“对偶”关系很优雅,即便从直觉的角度来说,我们也应该在从“等代价”到“不等代价”的推广过程中极力保障这个性质。关键就是要“直”,可以给后续分析、模型评价带来极大便捷。所以呢,为了配合纵轴的归一化思路,唯有对横轴作这样的操作才可确保直线。

如何让包络线下面积蕴含代价

包络线直接对 p 而不是对式(1)做积分应该是一种体现代价的方法。启发源于 @HY Scatterer 的答案,虽不知理解得对不对,但是鉴于 HYScatterer 知友的实验结果:CC AUC 会随着 cost ratio 变化这一点,我觉得他应该是对着一个“均匀尺度”的变量做积分了。原定义中,横轴是关于 p 的一个非线性函数,相当于对“天然”横轴的 p 做了一个非线性缩放,而这个缩放是会随着 cost ratio 改变的。

CC 相比于 ROC 有什么优势

  1. CC 能可视化代价。
  2. CC 的纵轴给出了我们对模型最关心的指标:代价或者错误率。且撇开 ROC 的短板 —— 代价不说,仅就错误率而言,CC 上一目了然的事情,在 ROC 空间里并不方便,每拉出一个点,至少得心算一次加法,一次减法。
  3. CC 的纵轴与先验 p 直接相关。通常情况下,先验与样本中的频率并不相同。CC 可以展示模型在各个 p 情况下的表现,也是 ROC 所不及的。

最后想说的是,CC 的应用远不及 ROC。鉴于本人有限的阅读量,我觉得至少在机器学习的论文中鲜有用 CC 或 CC AUC 做模型指标的。就目前来说,和 CC 有关的文献大多是原作者 C. Drummond 和 R. C. Holte 自己写的。教材、参考书如西瓜书囊括入代价曲线主要是为了内容完整性。总之,哪怕是 CC 的定义目前也没有金科玉律,在使我最早接触代价曲线的教材上,CC 的定义里甚至都没有引入归一化。不论是怎样的回答只要是自洽,就够令人满意了。

瓜书原文

为什么有多条代价曲线

需要明确的是,每一条线段实际上就是一组(FPR,FNR)组合决定的。而一组(FPR,FNR)又是由阈值决定的,不同的阈值就会有不同的(FPR,FNR)。

以之前区分手写数字的例子来说明,对于从低到高的打分,我们可以通过设定阈值,使得打分低于阈值的数字认为不是5,高于的是5。我们可以取 nn 个阈值,就应该由 nn(FPR,FNR)(FPR,FNR) 的组合,就应该绘制 nn 条线段。

需要注意的是,这里我们可以取更多的阈值,但是这些阈值对应的 (FPR,FNR)(FPR,FNR) 组合都是重复的,所以我们只需要关注有差异的 (FPR,FNR)(FPR,FNR) 组合就好。

又:提一嘴,我们希望代价最小化,所以是代价曲线最下面围成的面积。

 

比较检验

看起来似乎有了获取测试集的评估方法和用于比较模型的性能度量之后,就能够通过不同模型在测试集上的性能表现来判断优劣了。但是!事实上,在机器学习中,模型比较并不是这样简单的比大小,而是要考虑更多。

注:指验证集,但无论是书中还是论文中,都使用测试集较多,明白两者的区别就可以了。

我们用训练集完成训练,基于验证集修正模型(迭代),最后在测试集完成测试

在模型比较中,主要有以下三个重要考虑:

  1. 测试集上的性能只是泛化性能的近似,未必相同;
  2. 测试集的选择对测试性能有很大影响,即使规模一致,但测试样例不同,结果也不同;
  3. 一些机器学习算法有随机性,即便算法参数相同,在同一测试集上跑多次,结果也可能不同;

那么应该如何有效地进行模型比较呢?答案是采用假设检验(hypothesis test)。基于假设检验的结果,我们可以推断出,若在测试集上观察到模型A优于B,则是否A的泛化性能在统计意义上也优于B,以及做这个结论的把握有多大。

本小节首先介绍最基本的二项检验和t检验,然后再深入介绍其他几种比较检验方法。默认以错误率作为性能度量,用 ϵ\epsilon 表示。

几个基础概念:

  • 置信度:表示有多大的把握认为假设是正确的。
  • 显著度:也称“显著性水平”,表示假设出错的概率。显著度越大,假设被拒绝的可能性越大。
  • 自由度:不被限制的样本数,也可以理解为能自由取值的样本数,记为 vvdfdf

单个模型、单个数据集上的泛化性能检验

我们有多大把握相信对一个模型泛化性能的假设?

二项检验

在进行比较检验前,完成了一次模型预测,已知测试错误率为 ϵ^\hat{\epsilon}

一个泛化错误率为 ϵ\epsilon 的模型在 mm 个样本上预测错 mm' 个样本的概率为:

泛化错误率为 ϵ\epsilon 的学习器在一个样本上犯错的概率是 ϵ\epsilon 。测试错误率 ϵ^\hat\epsilon 意味着在 mm 个测试样本中恰有 ϵ^×m\hat\epsilon\times m 个被误分类.假定测试样本是从样本总体分布中独立采样而得,那么泛化错误率为 ϵ\epsilon 的学习器将其中 mm' 个样本误分类、其余样本全都分类正确的概率是产 ϵm(1ϵ)mm\epsilon^{m'}(1-\epsilon)^{m-m'};由此可估算出其恰将 ϵ^×m\hat\epsilon\times m 个样本误分类的概率如下式所示,这也表达了在包含 mm 个样本的测试集上,泛化错误率为 ϵ\epsilon 的学习器被测得测试错误率为 ϵ^\hat \epsilon 的概率:

P(ϵ^;ϵ)=(mm)ϵm(1ϵ)mmP(\hat{\epsilon};\epsilon) = \binom{m}{m'} \epsilon^{m'} (1-\epsilon)^{m - m'}

这个概率符合二项分布:

又因为已知测试错误率为 ϵ^\hat{\epsilon},也即知道了该模型在 mm 个样本上实际预测错 了ϵ^×m\hat{\epsilon} \times m 个样本。代入公式,对 ϵ\epsilon 求偏导会发现,给定这些条件时,ϵ=ϵ^\epsilon = \hat{\epsilon} 的概率是最大的

使用二项检验(binomial test),假设泛化错误率 ϵϵ0\epsilon \leq \epsilon_0,并且设定置信度为 1α1-\alpha。则可以这样定义错误率的阈值 ϵ\overline{\epsilon}

ϵ=maxϵs.t.i=ϵ0×m+1m(mi)ϵi(1ϵ)mi<α\overline{\epsilon} = \max{\epsilon} \qquad s.t. \qquad \sum_{i=\epsilon_0 \times m+1}^m \binom{m}{i}\epsilon^i (1-\epsilon)^{m-i} < \alpha

其中 s.t.s.t. 表示左式在右边条件满足时成立。右式计算的是发生不符合假设的事件的总概率,如果我们要有 1α1-\alpha 的把握认为假设成立,那么发生不符合假设的事件的总概率就必须低过 α\alpha

在满足右式的所有 ϵ\epsilon 中,选择最大的作为阈值 ϵ\overline{\epsilon}。如果在测试集中观测到的测试错误率 ϵ^\hat{\epsilon} 是小于阈值 ϵ\overline{\epsilon}的, 我们就能以1α1-\alpha 的把握认为假设成立,即该模型的泛化误差 ϵϵ0\epsilon \leq \epsilon_0

t检验

二项检验只用于检验某一次测试的性能度量,但实际任务中我们会进行多次的训练/测试,得到多个测试错误率,比方说进行了k次测试,得到 ϵ^1\hat{\epsilon}_1,ϵ^2\hat{\epsilon}_2, … ,ϵ^k\hat{\epsilon}_k。这次就会用到t检验(t-test)

定义这 kk 次测试的平均错误率 μ\mu 和方差 σ2\sigma^2

μ=1ki=1kϵi^\mu = \frac{1}{k} \sum_{i=1}^k \hat{\epsilon_i}

σ2=1k1i=1k(ϵi^μ)2\sigma^2 = \frac{1}{k-1} \sum_{i=1}^k (\hat{\epsilon_i} - \mu)^2

注意!这里使用的是无偏估计样本方差,分母是 k1k-1,因为当均值确定,并且已知 k1k-1 个样本的值时,第 kk 个样本的值是可以算出来的,也可以说是受限的

假设泛化错误率 ϵ=ϵ0\epsilon = \epsilon_0,并且设定显著度为 α\alpha。计算统计量t:

t=k(μϵ0)σt = \frac{\sqrt{k}(\mu-\epsilon_0)}{\sigma}

该统计量服从自由度 v=k1v = k-1 的t分布,如下图:

自由度越大,约接近于正态分布,自由度为无穷大时变为标准正态分布(μ=0\mu=0σ=1\sigma=1)。

如果计算出的t统计量落在临界值范围 [ta/2t_{-a/2},ta/2t_{a/2}] 之内(注:临界值由自由度 kk 和显著度 α\alpha 决定,通过查表得出),我们就能以1α1-\alpha 的把握认为假设成立,即该模型的泛化误差 ϵ=ϵ0\epsilon = \epsilon_0

两个模型/算法、单个数据集上的泛化性能检验

我们有多大把握相信两个模型的泛化性能无显著差别?

交叉验证t检验

对两个模型A和B,各使用k折交叉验证分别得到k个测试错误率,即ϵ^1A\hat{\epsilon}_1^A,ϵ^2A\hat{\epsilon}_2^A, … ,ϵ^kA\hat{\epsilon}_k^Aϵ^1B\hat{\epsilon}_1^B,ϵ^2B\hat{\epsilon}_2^B, … ,ϵ^kB\hat{\epsilon}_k^B。使用k折交叉验证成对t检验(paired t-tests)来进行比较检验。

对于这两组k个测试错误率,计算两组之间的每一对的差,即 i=ϵ^kAϵ^kB\triangle_i = \hat{\epsilon}_k^A - \hat{\epsilon}_k^B,从而得到k个 \triangle。我们可以计算 \triangle 的均值 μ\mu 和方差 σ2\sigma^2,定义统计量t:

t=kμσt = \lvert \frac{\sqrt{k}\mu}{\sigma} \rvert

可以看到,和前面的t检验相比,这里的分子没有被减项,其实是省略了。因为我们假设两个模型的泛化错误率相同,实际上是假设 ϵAϵB=0\lvert \epsilon^A - \epsilon^B \rvert = 0,这个 00 被省略了。

类似地,这个统计量服从自由度 v=k1v = k-1 的t分布。我们设定好显著度 α\alpha,查表获取临界值范围,如果计算出的t统计量落在在范围内,就能以1α1-\alpha 的把握认为假设成立,即两个模型的泛化性能无显著差别,否则认为平均测试错误率较低的模型更胜一筹。

McNemar检验

对于一个二分类问题,如果使用留出法,我们不仅可以获得两个算法A和B各自的测试错误率,或能够获得它们分类结果的差别(都预测正确、都预测错误、一个预测正确一个预测错误),构成一张列联表(contingency table)

算法B算法A
分类正确分类错误
分类正确e_00e_01
分类错误e_10e_11

假设两个算法的泛化性能无显著区别,则 e01e_{01} 应该等于 e10e_{10},变量 e01e10\lvert e_{01}-e_{10} \rvert 应服从均值为 11,方差为 e01+e10e_{01} + e_{10} 的正态分布,可以计算统计量 χ2\chi^2

χ2=(e01e101)2e01+e10\chi^2 = \frac{(\lvert e_{01}-e_{10} \rvert -1)^2}{e_{01} + e_{10}}

该变量服从自由度为 v=1v=1χ2\chi^2 分布(卡方分布),类似t检验,设定好显著度 α\alpha,按照自由度和显著度查表获得临界值。若计算所得的统计量 χ2\chi^2 小于临界值,则能以1α1-\alpha 的把握认为假设成立,即两个算法的泛化性能无显著差别,否则认为平均测试错误率较低的算法更胜一筹。

注:这里 vv 为1是因为只有2个算法

多个模型/算法、多个数据集上的泛化性能检验

我们有多大把握相信多个模型的泛化性能皆无显著差别?若有,接下来怎样做?

一组数据集上进行多个算法的比较,情况就变得较复杂了,一种做法是使用前面的方法分开两两比较;另一种更直接的做法是使用基于算法排序的Friedman检验。

Friedman检验

假设有 N=4N=4 个数据集,k=3k=3 种算法,可以使用一种评估方法,获得各个算法在各个数据集上的测试结果,然后按照性能度量由好到坏进行排序,序值为1,2,3。若并列,则取序值的平均值。然后对各个算法在各数据集上的序值求平均得到平均序值,如:

数据集算法A算法B算法C
D1123
D212.52.5
D3123
D4123
平均序值12.1252.875

rir_i 表示第 ii 个算法的平均序值,则 rir_i 服从均值为 k+12\frac{k+1}{2},方差为 (k2)112\frac{(k^2)-1}{12} 的正态分布。可以计算统计量 χ2\chi^2

χ2=12Nk(k+1)(i=1kri2k(k+1)24)\chi^2 = \frac{12N}{k(k+1)}(\sum_{i=1}^k r_i^2 - \frac{k(k+1)^2}{4})

kkNN 都较大时(通常要求 k>30k>30),该变量服从自由度为 v=k1v=k-1χ2\chi^2 分布(卡方分布)。

以上这种检验方式也称为原始Friedman检验,被认为过于保守,现在通常用统计量 FF 代替:

F=(N1)χ2N(k1)χ2F = \frac{(N-1)\chi^2}{N(k-1)-\chi^2}

该变量服从于自由度为 v=k1v=k-1v=(k1)(N1)v=(k-1)(N-1)FF 分布。

和前面的检验方式有所区别,F检验是根据设定的显著度 α\alpha算法个数 kk 以及 数据集个数NN 这三者来查表的,如果计算出的统计量 FF 小于查表所得的临界值,则假设成立,能以1α1-\alpha 的把握认为认为这 kk 个算法的泛化性能无显著区别。

但如果这个假设被拒绝了呢?这时就需要进行后续检验(post-hoc test),常用的有 Nemenyi后续检验

Nemenyi后续检验

定义平均序值差别的临界值域为:

CD=qαk(k+1)6NCD = q_\alpha \sqrt{\frac{k(k+1)}{6N}}

其中 qαq_\alpha是由 显著度 α\alpha算法个数 kk 确定的,通过查表获取。若两个算法的平均序值之差不超过 CDCD,则能以1α1-\alpha 的把握认为这两个算法的泛化性能无显著区别,否则认为平均序值较小的更胜一筹。

Nemenyi后续检验还可以通过Friedman检验图更直观地体现出来,横轴为性能度量,纵轴为算法,每个算法用一段水平线段表示,线段中心点为该算法的平均序值,线段长度为 CDCD。若两个算法的线段投影到x轴上有重叠部分,则可以认为这两个算法的泛化性能无显著区别。

 

偏差与方差

除了估计算法的泛化性能,我们往往还希望知道为什么有这样的性能?这时一个有用的工具就是偏差-方差分解(bias-variance decomposition)

知乎上面有两个问题都有不错的答案,不妨先看看。[1] 机器学习中的Bias(偏差),Error(误差),和Variance(方差)有什么区别和联系?;[2] 偏差和方差有什么区别?

对学习算法的期望繁华错误率进行拆解,最终会发现能拆解为三个项(需要推导):

E(f;D)=ED[(f(x;D)f(x))2]+(f(x)y)2+ED[(yDy)2]E(f;D) = \mathbb{E}_D[(f(x;D) - \overline{f}(x))^2] + (\overline{f}(x) - y)^2 + \mathbb{E}_D[(y_D - y)^2]

依次对应于方差(variance)偏差(bias)噪声(noise)

E(f;D)=var(x)+bias2(x)+ϵ2E(f;D) = var(x) + bias^2(x) + \epsilon^2

这三者的含义是这样的:

  • 方差:使用同规模的不同训练集进行训练时带来的性能变化,刻画数据扰动带来的影响

  • 偏差:学习算法的期望预测与真实结果的偏离程度,刻画算法本身的拟合能力

  • 噪声:当前任务上任何算法所能达到的期望泛化误差的下界(即不可能有算法取得更小的误差),刻画问题本身的难度

也即是说,泛化性能是有学习算法的拟合能力,数据的充分性以及问题本身的难度共同决定的。给定一个任务,噪声是固定的,我们需要做得就是尽量降低偏差和方差。

但是这两者其实是有冲突的,这称为偏差-方差窘境(bias-variance dilemma)。给定一个任务,我们可以控制算法的训练程度(如决策树的层数)。在训练程度较低时,拟合能力较差,因此训练数据的扰动不会让性能有显著变化,此时偏差主导泛化错误率;在训练程度较高时,拟合能力很强,以至于训练数据自身的一些特性都会被拟合,从而产生过拟合问题,训练数据的轻微扰动都会令模型产生很大的变化,此时方差主导泛化错误率。

注意,将泛化性能完美地分解为方差、偏差、噪声这三项仅在基于均方误差的回归任务中得以推导出,分类任务由于损失函数的跳变性导致难以从理论上推导出分解形式,但已经有很多方法可以通过实验进行估计了。

摘自:https://www.zhihu.com/question/27068705

首先 Error = Bias + Variance

Error反映的是整个模型的准确度,Bias反映的是模型在样本上的输出与真实值之间的误差,即模型本身的精准度,Variance反映的是模型每一次输出结果与模型输出期望之间的误差,即模型的稳定性。

举一个例子,一次打靶实验,目标是为了打到10环,但是实际上只打到了7环,那么这里面的Error就是3。具体分析打到7环的原因,可能有两方面:一是瞄准出了问题,比如实际上射击瞄准的是9环而不是10环;二是枪本身的稳定性有问题,虽然瞄准的是9环,但是只打到了7环。那么在上面一次射击实验中,Bias就是1,反应的是模型期望与真实目标的差距,而在这次试验中,由于Variance所带来的误差就是2,即虽然瞄准的是9环,但由于本身模型缺乏稳定性,造成了实际结果与模型期望之间的差距。

在一个实际系统中,Bias与Variance往往是不能兼得的。如果要降低模型的Bias,就一定程度上会提高模型的Variance,反之亦然。造成这种现象的根本原因是,我们总是希望试图用有限训练样本去估计无限的真实数据。当我们更加相信这些数据的真实性,而忽视对模型的先验知识,就会尽量保证模型在训练样本上的准确度,这样可以减少模型的Bias。但是,这样学习到的模型,很可能会失去一定的泛化能力,从而造成过拟合,降低模型在真实数据上的表现,增加模型的不确定性。相反,如果更加相信我们对于模型的先验知识,在学习模型的过程中对模型增加更多的限制,就可以降低模型的variance,提高模型的稳定性,但也会使模型的Bias增大。Bias与Variance两者之间的trade-off是机器学习的基本主题之一,机会可以在各种机器模型中发现它的影子。

 

参考

https://zhuanlan.zhihu.com/p/134089340

https://github.com/Vay-keen/Machine-learning-learning-notes

https://github.com/familyld/Machine_Learning

https://zhuanlan.zhihu.com/p/25994179

https://leovan.me/cn/2018/12/ensemble-learning/

https://easyai.tech/ai-definition/ensemble-learning/

https://zhuanlan.zhihu.com/p/72415675

https://www.zhihu.com/question/63492375

https://www.zhihu.com/question/27068705

https://www.zhihu.com/question/19725590/answer/241988854

https://tangshusen.me/2018/10/27/SVM/

https://www.joinquant.com/view/community/detail/a98b7021e7391c62f6369207242700b2

https://zhuanlan.zhihu.com/p/79531731

https://github.com/Charmve/PaperWeeklyAI/blob/master/03_Maiwei AI PaperWeekly/03_机器学习%26深度学习理论/机器学习算法之——K最近邻(k-Nearest Neighbor,KNN)分类算法原理讲解.md

https://blog.csdn.net/zc02051126/article/details/49618633

https://zhuanlan.zhihu.com/p/127022333

https://0809zheng.github.io/2020/03/30/ridge.html

https://www.cnblogs.com/wuliytTaotao/p/10837533.html

https://link.springer.com/referenceworkentry/10.1007/978-1-4899-7687-1_910#Sec13186

http://palm.seu.edu.cn/zhangml/files/mla11-mll.pdf

https://blog.csdn.net/zwqjoy/article/details/80431496

https://ryuchen.club/posts/0x000034/ (推荐)

https://zhuanlan.zhihu.com/p/78798251

https://zhuanlan.zhihu.com/p/622244758

https://www.biaodianfu.com/hierarchical-clustering.html

https://zhuanlan.zhihu.com/p/411533418

https://zhuanlan.zhihu.com/p/33196506

https://www.cnblogs.com/wry789/p/13125658.html

https://blog.csdn.net/qq_41485273/article/details/113178117

https://www.jianshu.com/p/7d4323c28716

http://lunarnai.cn/2019/01/02/watermelon-chap-13/

【周志华机器学习】十三、半监督学习

https://zhuanlan.zhihu.com/p/411533418

https://www.huaxiaozhuan.com/统计学习/chapters/12_semi_supervised.html

https://blog.csdn.net/tyh70537/article/details/80244490

https://zhuanlan.zhihu.com/p/37747650

7125messi.github.io

https://blog.csdn.net/qq_40722827/article/details/104515955

https://www.cnblogs.com/dyl222/p/11055756.html

https://www.zhihu.com/tardis/zm/art/392908965

https://blog.csdn.net/j123kaishichufa/article/details/7679682

https://www.cnblogs.com/heaad/archive/2011/01/02/1924088.html

https://www.cnblogs.com/stevenlk/p/6543628.html

baidinghub.github.io-PCA

baidinghub.github.io-LDA

等等