前言
比我想得要难得多……主要是数理统计基本都忘光了……写的也比较乱,希望大家能斧正我的问题。
第二章
当我们训练出一个模型之后,我们自然希望它能够在新的数据上也有良好的表现,这个能力被称为泛化,我们把模型在新数据上的误差称为泛化误差。
泛化误差小的模型自然是我们更喜欢的模型,他也说明了模型的泛化能力强,本章主要介绍了
- 用什么标准来评估模型的泛化误差
- 如何可靠的计算评估能力值并进行比较
2.1 评估标准:性能度量
在模型训练中,因为训练集和算法的不同,学习可能发现的规律过少(欠拟合)也可能发现了只有这些数据集才存在的规律(过拟合)。
- 欠拟合:在训练集的表现较差,说明训练不够充分
- 过拟合:在训练集上表现优异但是泛化能力差,说明模型表现了过多的规律
前者可以通过一定的方法来克服它,但后者我们只能减小其风险,因为很多时候数据集较少产生的规律是我们不可控的。一个过拟合的例子如下所示:
针对训练集{4,6,8,10,12},我们希望模型是:三的倍数与非三的倍数分类,
但模型可能展示的规律为:六的倍数与非六的倍数分类
既然过拟合是无法完全避免的问题,那么在模型选择时,我们通常会分析和评估模型的泛化能力,以找到泛化误差较小的模型。 模型的泛化能力是一个抽象的概念,为了更方便地进行比较和选择,我们希望能够用量化的数值来表示它,这就是性能度量。
我们知道,模型是在特定上下文中训练得到的,其性能表现也会受到上下文的影响。 因此,针对不同的应用场景和任务需求,我们定义了多种性能度量标准来衡量模型的泛化误差。
为了评估模型的泛化能力,我们通常会使用一个由测试数据组成的集合,称为测试集。 测试集中的样本需要满足独立同分布的假设,即与真实样本具有相同的分布,这样我们通过测试集衡量出来的测试误差才能近似地反映模型的泛化误差。
另外,为了保证评估结果的客观性和可靠性,测试集和训练集必须互斥,即没有重叠的元素,确保测试集中的数据对于模型来说是模型未见过的数据。
对于回归类型的任务,最常用的度量是均方误差(MSE, Mean Squared Error),其核心思想是计算预测值与真实值差距的平方的平均值。
数学定义如下:
离散数据(数据集
D
含m
个样本):$$ E(f;D) = \frac{1}{m}\sum_{i=1}^{m}(f(x_{i}) - y_{i})^{2} $$
注:平方操作可消除正负误差抵消问题,同时放大大误差的惩罚。
连续分布(概率密度函数
p(x)
,分布 $\mathcal{D}$):$$ E(f;\mathcal{D}) = \int_{x\sim \mathcal{D}} (f(x) - y)^2 p(x)dx $$
但本节我们主要讨论分类任务的性能度量。
2.1.1 错误率与精度
在分类任务中,我们最常用错误率和精度来衡量一个模型的泛化能力
其实顾名思义,错误率定义为错误分类的数据数占测试集的百分比,而精度则定义为正确分类的数据占测试集的百分比,即:
$$ E(f;T) = \frac{1}{m}\sum_{i=1}^m\mathbb{I}(f(x_i)\neq y_i)\\ acc(f;T) = \frac{1}{m}\sum_{i=1}^m\mathbb{I}(f(x_i)= y_i)\\ $$
其中,$T$是测试集,其他内容都在第一章中出现过。显然有$E = 1 - acc$
一般的,如果测试集服从分布$\mathcal{D}$,数据概率密度函数为$p$则错误率可定义为:
$$ E(f;T) =\int_{x\sim\mathcal{D}}\mathbb{I}(f(x)\neq y)p(x)dx $$
精度类似可定义。
2.1.2 查准率与查全率
在分类任务中,有些时候我们更关心查准率和查全率。
查准率 (Precision): 衡量预测的准确性。 它表示在 所有被模型预测为属于某个类别的样本中,真正属于该类别的样本所占的比例。
- 又称准确率,关注误判的情况
- 它和准度的区别就在于这个值只计算某一个类
查全率 (Recall): 衡量覆盖的全面性。 它表示在 所有真正属于某个类别的样本中,被模型成功预测为该类别的样本所占的比例。
- 又称召回率。关注的是漏判的情况
可以看到,无论是查准率还是查全率我们都是基于某一个类进行计算的,对于这个我们关注的类称为正类,其他类自然就是反类。因此我们可以将测试集的所有元素分为真正例(TP)、假正例(FP)、真反例(TN)、假反例(FN)四种。查准率和查全率定义为:
$$ \begin{align*} P = \frac{TP}{TP+FP}\\ R = \frac{TP}{TP+FN} \end{align*} $$
经验表明在复杂的问题上,查准率和查全率常常是负相关的,一方提高另一方就会降低;而我们的上下文一般对二者关注的权重是不同的(比如搜索引擎我们更喜欢查准率,没人想被打扰),因此在选择模型的时候我们通常使用$F_\beta$度量,他用通过计算$P,R$的加权调和平均值来得到一个度量,定义为:
$$ \frac{1}{F_\beta} = (\frac{1}{1+\beta^2})(\frac{1}{P} + \frac{\beta^2}{R}) $$
可见$\beta$越大,查全率的影响就越大,如果认为$P,R$同样重要就用$F_1$度量即可。
对于二分类问题,我们通常只关心一个类的表现(即正类),因此到这里通常就可以了。但有些时候我们会因为各种情况得到多个查准率和查全率:
- 多次训练、测试
- 有多个测试集
- 多分类任务
此时为了得到一个“全局”的查准率和查全率,有两种计算方式
宏平均:针对所有查全率、查准率计算算术平均得到宏查全率和宏查准率,再用宏查全率和宏查准率计算加权调和平均得到宏$F_\beta$
- 对 每个类别 的指标进行平均,平等对待每个类别。宏平均会更关注 稀有类别 的性能
微平均:先不计算每一个类的查全率和查准率,先计算所有$TP,FP,FN$的平均值,再带入上面的式子计算出微查全率、微查准率、微$F_\beta$
- 对 所有样本 的指标进行平均,样本数量多的类别会更影响整体指标。微平均会更关注 常见类别 的性能
调和均值
调和均值算法是一种对极端小值敏感的平均算法,我们可以想象$F_1$中$P$很大而$R$很小的场景,此时$P$变动并不会怎么影响$F_1$,反而$R$的变动会极大的影响$F_1$的值。换句话说,小值主导了这个均值的结果,回到$F_\beta$度量上,我们希望查准率和查全率不能有一个很小,这不是我们希望的模型,所以要把这种情况暴露出来(小值计算出来的结果一定很小)。
2.1.3 ROC与AUC
多数模型在做分类任务的时候会对样本打一个分,通常在区间$[0,1]$之间,然后把这个得分与某个阈值比较,比阈值大的分为正类,反之为反类。这意味着我们可以通过得分对所有样本进行排序。
显然,如果一个模型泛化能力强,这个排序前面几乎都是真正例(TP),后面几乎都是真反例(TN);反之排序结果是真假混杂。对于强的模型,我们总能找到一个阈值使得分类任务能够高效完成;而对于能力弱的模型,无论怎么定阈值,分类结果都不尽人意。因此我们也会对模型打分排序能力进行一个评估,这就是ROC和AUC要干的事情。
具体说来,我们可以通过移动阈值来计算下面两个数值:
- 真正例率:$TPR = \frac{TP}{TP+FN}$,注意它的定义就是查全率
- 假正例率:$FPR = \frac{FP}{FP+TN}$,即反例被错判为正例的比例,所以分母是全体反例
对于一个模型预测的结果,我们先把阈值设置为最大,此时所有样本都是反例($TP = FP = 0$),然后移动阈值每次让一个样例从反例变为正例,然后得到此时的$TPR,FPR$,以$TPR$为纵轴,$FPR$为横轴,绘制出ROC图像。注意到两个值的分母都是定值,而分子都随阈值的降低而不降低(可能不变),所以总的曲线是一条右上走势的曲线。
可以预见,如果一个模型泛化能力强,那么它的ROC曲线一定是一个快速从$(0,0)$上升,然后稳定在$TPR = 1$的直线上;反之如果一个模型排序结果混杂,那么有$TPR = FPR$,其曲线趋近于对角线($y=x$)。那么比较两个模型时,我们可以比较ROC曲线下的面积AUC(Area Under ROC Curve),面积大的通常意义上认为是更优秀的模型,因为走势是右上,所以面积大意味着有大$TPR$低$FPR$,这意味着存在一个阈值让模型分类任务完成得很好。
AUC的计算
周老师给出AUC的计算方法是通过梯形估计,即将两个高度不一致的坐标点直接来连起来,然后求和来近似曲线面积。
下方又定义了损失,其实就是对于所有可能的正例-反例样本对,模型平均来说,排序错误的比例是多少,其形式也是一个梯形计算且恰为对应ROC相同$x$坐标(理解为当前阈值取到的那个样本)的上方。所以得出了$AUC = 1-l_{rank}$的结论。
但我觉得其实直观从定义理解就好,损失的定义是清晰的,如果$AUC$直接定义为
$$ AUC = \frac{1}{m^-m^+}\sum_{x^+\in D^+}\sum_{x^-\in D^-}(\mathbb{I}(f(x^+)>f(x^-)) + \frac{1}{2}\mathbb{I}(f(x^+)=f(x^-))) $$
感觉会更容易理解一些。
2.1.4 代价曲线
前面的度量我们都进行了一个假设即错误分类的代价相同,但是现实中一般这是不成立的。例如将mk
错判为敏感操作没有什么大代价,但是把rm
错判为非敏感操作那就可以准备跑路了。
那么在针对这种问题时,我们必须要先明白不同的错判会有什么代价,因此需要一个代价矩阵。
预测正类 | 预测反类 | |
---|---|---|
真实正类 | 0 | $cost_{01}$ |
真实反类 | $cost_{10}$ | 0 |
因此我们对之前所有的度量都要加上这么一个权重,意义是最小化代价。
$$ E(f;D;T) = \frac{1}{m}(\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}) $$
这就是代价敏感错误率的定义(其实就是加上了权重),但ROC曲线不能反应这种代价,所以我们需要一个新的代价曲线。
首先我们定义正例概率代价:
$$ P(+)cost = \frac{p\times cost_{01}}{p\times cost_{01}+(1-p)\times cost_{10}} $$
其中$p$是正例的概率,这个式子指代的是正类错误代价占整体错误代价的比例,是归一化的。这个值衡量了FN和FP两种错判的重要性:
- 若 P(+) 高(接近1),说明正例错判更重要(如癌症检测)。
- 若 P(+) 低(接近0),说明FP(反例判错)代价更关键(如垃圾邮件过滤)。
而另一个值归一化期望代价
$$ cost_{norm} = \frac{FNR\times p \times cost_{01}+FPR\times (1-p) \times cost_{10} }{p \times cost_{01}+(1-p) \times cost_{10}} $$
其中$FNR$类比ROC中的定义可知为判错的正例占总正例的比例,且有$FNR = 1-TPR$。这个值$cost_{norm}$是实际错误代价占整体错误代价的比例,也是归一化了的。
以这两个值为横纵坐标,画出代价平面,而对ROC每一个点(对应FNR、FPR取好值),都连接$(0,FPR),(1,FNR)$两点,最后所有线段的共同下界区域(下包络线)即期望总代价AUC,此时AUC越小越好。
*注意AUC只是曲线下的面积这个词的缩写,不同曲线对应AUC的含义不同。
下包络线的意义:
对每一个 $P(+)cost$(横轴),取所有可能阈值中最小的 $cost_{norm}$(纵轴)。代价曲线下的面积(AUC)越小,模型在不同代价偏好下的平均表现越好。
此外,本章只涉及到分类任务的度量,估计回归和无监督的度量会在之后的章节中给出。
2.2 模型评估的必要性与方法
选择合适的度量标准后,理想情况下,评估模型性能的最佳方式是观察其在真实应用场景中遇到的全新数据上的表现。 但这种方法存在以下两个主要问题:
- 实际应用中,新数据是持续产生的,若以此为唯一评估方式,评估过程将难以收敛且耗时过长。
- 模型评估应在训练阶段完成,而非部署后(这会本末倒置)。
因此,我们需要基于现有数据同时完成三个关键步骤:
- 模型学习
- 参数调优
- 性能评估
为了做到这一点,我们不得不将数据集拆分为三部分: - 训练集:初步学习用的数据,用于训练模型,占现有数据的大头
- 验证集:调试参数用的数据,与训练集完全不相交
- 测试集:评估用的数据,与前两者完全不相交
在一般的机器学习流程中,训练集通常用于训练模型,验证集用于调整模型的超参数。 一旦超参数调整完成,为了充分利用所有可用的数据,通常会将验证集和训练集合并,重新训练最终的模型。 这样做可以提高模型的泛化能力,尤其是在数据量有限的情况下。 另外,如果数据量非常少,或者计算资源有限,也可以选择不划分验证集,直接使用交叉验证等方法在训练集上进行模型选择和评估。
本节主要关注模型的训练和测试评估,超参数调优不是本节的重点。 因此,在下述方法中,为了简化描述,会将训练集和验证集统称为训练集。 或者,也可以理解为省略了从训练集中划分出验证集的步骤,直接使用全部训练数据进行模型训练。
那么到底要怎么才能从所有现有数据划分出两个集合呢?
2.2.1 留出法
留出法非常简单,就是直接将数据集划分为互不相交的两个子集。
但是基于独立同分布假设,训练集、测试集的数据必须满足同一个分布,这样才有验证和测试的意义。
为了达到这一点,我们在采样的时候可以使用分层采样的方法。具体说来就是先将数据集按特征(例如类别标签)划分为若干个互不重叠的子集(即层),然后统计各层在总体中的比例。在采样时,为了保证样本分布与总体分布尽可能一致,我们需要确保抽取的样本在各个层上的比例与总体中的比例基本相同。
一种常用的做法是在每一层中采样相同百分比的数据。 这样做可以简化操作,同时也能较好地保持样本的分布结构。比如有一个二分类数据集,正类与反类的比例为 。 在进行分层采样时,我们分别从正类和反类样本中抽取相同比例(例如 )的样本。 这样得到的训练集、验证集和测试集,其正反类比例仍然保持 ,从而保证了数据分布的一致性。
另外因为学习用的训练集是根据采样出来的,每一次学习总有部分数据得不到训练,因此单独一次的划分、训练得出的模型往往不够可靠,所以会多次随机采样得出多个模型然后求其平均性能度量作为结果。
最后考虑训练集的占比在$\frac{2}{3}\sim \frac{4}{5}$之间比较合适。
留出法的优点是简单直接,适合初步评估,缺点是要求数据量大,数据利用率低。
2.2.2 交叉验证法
当可用数据量不大,使用留出法可能导致训练数据不足或测试数据不足,从而影响模型评估结果时,我们需要使用交叉验证法,它充分利用了所有数据的信息:
交叉验证法又称$k$折交叉验证,是先将数据集划分为$k$个互不相交的子集,每个子集都尽可能地保证独立同分布(即分层采样得到)。然后将$k-1$个子集作为训练集,剩下一个子集作为测试集,训练模型并得到一个评估结果。然后轮换测试集,一共进行$k$次得到平均值。
但和留出法一样,单次随机划分数据集可能导致某些子集包含特定类型的样本,从而影响模型评估的客观性。为了降低这种随机性带来的影响,我们还要再重新进行$p$次采样,每一次都做$k$折交叉验证将 次交叉验证的结果取平均值,作为最后的性能度量。 这样可以更稳定地评估模型的性能,并选择泛化能力最好的模型。
一般的,我们取$k = 5,10,20$不宜过高,而10次10折交叉验证是一个常见选择($p=10,k=10$)。
另外,当我们每个子集只含有$1$个数据的时候,称为留一法,这是$k$折交叉验证的一个特例。 留一法使用全部数据集进行训练,只留下一个样本进行测试,因此在数据集较小且数据分布均匀的情况下,可以得到较准确的评估结果。 但由于需要对每个样本都进行一次训练和测试,因此计算量非常大,在数据集较大或数据分布不均匀的情况下,评估结果可能不稳定,且计算量过大,需要根据实际情况进行权衡(NFL定理还在发力)。
优点是充分利用数据,评估结果稳定可靠,缺点是计算量大
2.2.3 自助法
那么如果数据更小,除了留一法外还有方法吗?有的兄弟有的。
自助法是一种基于重采样的方法,所谓重采样即从数据集$D$中挑选出一个元素记录到采样集$D'$后放回$D$中(下次可能还采样到它)的方法。
当采样$|D|$次后,有部分数据将不会出现在$D'$中,我们将$D'$作为训练集,$D-D'$作为测试集用于评估。这种方法也叫“包外估计”。
可以计算,数据在$|D|$次采样始终不被采到的几率是
$$ \lim_{ |D| \to \infty } \left( 1-\frac{1}{|D|} \right)^{|D|} = \frac{1}{e} $$
因此测试集占数据集的$\frac{1}{e} \approx 0.368$,是个合适的数据。
但值得一提的是,这种采样的方式很可能偏离原来的分布情况,因此如果数据足够就不要用这个方法。
至此我们完成了训练集和测试集的划分,那么整个模型学习的过程就分为以下几步:
- 首先基于训练集学习出模型
- 基于验证集调试参数,找出最合适和参数(此后参数将不会变动)
- 重新基于训练集训练出真正的模型(如果数据量较少的话可以加上验证集的数据一起训练)
- 基于测试集进行模型评估,并选择评估下来最好的模型
- 最后使用所有现有数据进行训练,得到最后的模型。
目前,我们已经完成了所有流程,看起来很美好,但还有一个点需要考虑:虽然我们假设数据是独立同分布的,并且在测试集上获得了令人满意的性能指标,但仍需考虑以下潜在问题,以确保模型在实际应用中的泛化能力:
- 测试集代表性问题: 即使数据是独立同分布的,我们采样的测试集也可能无法完全代表真实数据分布,导致性能评估存在偏差。
- 算法随机性问题: 机器学习算法本身可能具有随机性,即使使用相同的参数和数据集多次运行,也可能得到略微不同的结果。
因此,为了更可靠地评估模型的泛化能力,我们需要借助统计假设检验,验证模型性能的显著性,并排除偶然因素的影响。
2.3 假设检验
本节我们用误差率这个性能度量来进行说明,我们定义:
- 泛化误差为$\epsilon$,该值不可直接观测;
- 测试误差为$\hat{\epsilon}$,该值已知,且视为泛化误差的估计值。
本节目标是通过假设检验,基于测试误差$\hat{\epsilon}$在给定的置信水平下推断泛化误差$\epsilon$是否满足预设条件(如$\epsilon \leq \epsilon_0$),即我们希望通过假设检验来验证模型是否具有良好的泛化能力。
对泛化误差的估计:
我先用二分类任务说明将测试误差视为泛化误差的估计值是合理的:
考虑二分类任务,我们假设有$m$个测试样本,则被误分类的样本数为$m \times \hat{\epsilon}$,假设模型在这些数据上的判断是独立的且误差概率都是$\epsilon$(即服从二项分布)。那么具有$\epsilon$泛化误差的模型将$m \times \hat{\epsilon}$个样本误分类的概率为
$$ P(\hat{\epsilon};\epsilon) = \binom{m}{m \times \hat{\epsilon}}\epsilon^{m \times \hat{\epsilon}}(1-\epsilon)^{m-m \times \hat{\epsilon}} $$
其中$\binom{m}{m\times \hat{\epsilon}}$是组合数,且该函数仅仅是$\epsilon$的函数(不要忘了$\hat{\epsilon}$已知)。现在我们已知测试误差率是$\hat{\epsilon}$,那么可以认为目前这个状况是最可能出现的状况,即使得$P$最大的状况(最大似然估计思想)。取对数求导找极值点可以找到此时的$\epsilon$是什么,经计算此时有$\epsilon = \hat{\epsilon}$,即泛化误差的估计值就是测试误差本身。
其实不止二分类任务,任何一个机器学习任务将测试误差视为泛化误差的估计值都是合理且自然的。
注意,参数估计和假设校验是两个方面的问题,前者好说,后者是对我们提出的某个假设(机器学习通常就是假设泛化误差不能大于一个阈值)验证有多可靠,换句话说参数估计出来的值与下文无关。
2.3.1 t检验
现在我们要通过假设检验来判断,在一定的置信水平$\alpha$下(一般取$0.05$),泛化误差$\epsilon$是否显著大于我们预设的能够接受的泛化误差阈值$\epsilon_{0}$。
具体说来,我们定义两个假设:
- 零假设$H_{0}$:这个是我们试图推翻的假设,这里自然就是$\epsilon \geq \epsilon_{0}$了,或者为了便于计算,我们直接取其临界情况$\epsilon=\epsilon_{0}$
备择假设$H_{1}$:这个是我们希望的假设,即$\epsilon<\epsilon_{0}$。
二项检验
我们先假设零假设为真,即此时泛化误差为$\epsilon_{0}$,我们来计算误差比实际误差$\hat{\epsilon}$还要小的概率是$$ p = \sum_{i=0}^{m \times \hat{\epsilon}}\binom{m}{i}\epsilon_{0}^i(1-\epsilon_{o})^{m-i} $$
如果计算出来的$p < \alpha$,那么我们就说拒绝零假设,备择假设为真。
t检验
以上是对二项分布做出的假设检验。一般情况下我们会进行多次训练-测试过程,得到多个$\hat{\epsilon}$,基于这些$\hat{\epsilon}$,我们自然应该考虑他们的期望和方差,假设我们进行了$k$次独立重复实验,那么有$$ \begin{align*} \mu &= \frac{1}{k}\sum_{i=1}^{k} \hat{\epsilon_{i}}\\ s^{2} &= \frac{1}{k-1}\sum_{i=1}^{k} (\hat{\epsilon_{i}}-\mu)^{2} \end{align*} $$
我们不知道泛化误差的实际标准差$\sigma$为多少,因此不能使用正态分布,在小样本、只有样本标准差的时候需要考虑学生分布,构造变量
$$ t=\frac{\sqrt{ k }(\mu - \epsilon)}{s} $$
其服从$k-1$的t分布。后面就和二项检验类似,通过零假设$\epsilon = \epsilon_{0}$(带入t统计量),计算出落在双边置信区间的概率为$p$(或者查表),如果小于置信水平$\alpha$的话,我们就拒绝零假设。
这里修改了一点符号,$\sigma,\epsilon$是未知的真实标准差和错误率期望;$s,\mu$是样本标准差和样本错误率期望。
到目前为止,我们考虑的都是对单个模型的评估,那么如果是多个模型之间的比较要如何完成呢?
2.3.2 交叉验证t检验
对于两个模型$A,B$,如果使用$k$折法得到的错误率分别为$\epsilon_{i}^{A},\epsilon_{i}^{B}$。现在我们来考察它们的性能比较,一个可行的方法是交叉验证 t 检验。考虑$\Delta_{i} := \epsilon_{i}^{A} - \epsilon_{i}^{B}$这个差值,计算出其样本均值和标准差$\mu,s$。
零假设:模型$A,B$之间性能相同,即$\Delta_{0} = 0$。
再次使用t检验,构造t变量
$$ t = |\frac{\sqrt{ k }(\mu - 0)}{s}| $$
再次检验即可。
但仔细思考会发现k折的过程中,我们是对多个训练集进行了复用,并没有达到独立这个条件,所以t检测的结果可能不准确,一个处理方式是$5 \times 2$折交叉验证。
总的大逻辑没变,但因为$2$折并没有复用任何一个训练集学习,且我们在计算差值期望的时候只计算第一次2折的差值期望(减少复用),而标准差还是计算全部5次的训练结果,所以检验结果更有说服力,此时有
$$ \begin{align*} \mu &= \frac{1}{2}(\Delta_{1}^{1} + \Delta_{1}^{2})\\ t &= \frac{\sqrt{ 5 }\mu}{ \sum_{i=1}^{5} s_{i} } \end{align*} $$
2.3.3 McNemar检验
这是一个针对通过留出法的二分类任务的检验模型$A,B$性能方法。
我们的零假设依旧是模型$A,B$性能相同,但这次我们不关心错误率,而是分别关心两个模型分错样本之间的差异,分别设$A,B$只有自己分错的样本为$a,b$(对应书上的$e_{01},e_{10}$)。
那么针对$a$,其服从二项分布且概率为$0.5$,对$b$也一样。当样本数$|a|+|b|$足够大的时候,二项分布可以用正态分布近似(中心极限定理),我们关心模型之间性能的差异($b-a$),所以可以构造服从标准正态分布的统计量
$$ Z = \frac{|b-a|-1}{\sqrt{b+a}} \sim N(0,1) $$
当然我们更常用的是其对应的卡方分布
$$ \chi^{2} = \frac{(|b-a|-1)^{2}}{b+a} $$
来做假设检验。剩下的操作就是类似的了。
Z的构造
Z构造的目的是构造一个我们关心的统计量($b-a$)服从标准正态分布的一个量,一般构造方式是用统计量除以统计量原分布的标准差(这里$a,b$服从协方差为$0$的二项分布,所以标准差是$\sqrt{ b+a }$),另外从二项分布到正态分布会引入一个连续性修正,这里选的是$1$。
书中对于$b-a$服从正态分布且均值为1这一点我有点没看懂。
2.3.4 Friedman检验与Nementi后续检验
前两种检验方法均基于同一训练集对两种算法进行比较。然而,当需要在多个数据集上对多种算法进行综合比较时,可采用Friedman检验。当然如果喜欢的话,亦可基于前述方法对算法进行两两比较。
Friedman校验的核心思想是:
- 排序机制:
在个独立数据集上测试种算法,对每个数据集内的算法性能进行排序(最优算法排名为1,次优为2,依此类推,如果性能相同那么平分排名,比如$B,C$都是次优,那么都是$2.5$,不是$2$哦)。 检验假设:
- 零假设:所有算法性能相同 → 各算法的平均排名应相等
- 备择假设:至少存在两种算法性能显著不同
统计量构造:
计算各算法的平均排名,假设一共有$k$种算法$N$个数据集$$ R_{j} = \frac{1}{N}\sum_{i=1}^{N} r_{ij} $$
(其中$r_{ij}$为第$j$种算法在第$i$个数据集上的排名),再次用上中心极限定理,有$R_{j} \sim N\left( \frac{k+1}{2}, \frac{k^{2}-1}{12N}\right)$,于是构造Friedman统计量:
$$ \chi^{2} = \frac{12N}{k(k+1)}\left( \sum_{i=1}^{k} R_{i}^{2} - \frac{k(k+1)^{2}}{4} \right) $$
即服从自由度为$k-1$的卡方分布。
但是在样本量较小的时候改用另一个$F$分布:$$ F = \frac{(N-1)\chi^{2}}{N(k-1)-\chi^{2}} \sim F(k-1,(k-1)(N-1)) $$
平均排名正态分布的计算
基于零假设,所有算法性能相同,那么$r_{ij}$的取值是均匀离散的,取值$1,2,\dots,k$概率都一样为$\frac{1}{k}$。
所以其期望$E(r_{ij}) = \sum_{i=1}^{k}i \times \frac{1}{k} = \frac{k+1}{2}$,方差$D(r_{ij}) = E(r_{ij}^{2})-E^{2}(r_{ij}) = \frac{k^{2}-1}{12}$(利用了平方和)。
带入计算$R_{j}$发现期望和方差没变,所以$R_{j}$对应的正态分布就是$N\left( \frac{k+1}{2}, \frac{k^{2}-1}{12N}\right)$,然后将$R_{j}$减去期望,除以标准差得到标准正态分布$N(0,1)$,再平方求和,调整自由度($\frac{k-1}{k}$因子)得到开方分布统计量。
之后就是经典检验,针对检验结果
- 如果性能真的相同,那么可以结束
- 如果性能不相同,还需要后续检验即Nemenyi检验
Nemenyi检验书上没有推导,接受查表即可,其目的依旧是看哪些个算法性能差异显著。
难绷,数理统计基本都忘光了……希望这部分内容只在第二章出现吧
2.4 偏差与方差
在前面的工作中,我们投入了大量精力完成了模型评估与模型间的比较检验。然而,对于泛化误差的具体来源,我们尚未深入分析。此时,偏差-方差分解(Bias-Variance Decomposition)便成为一个关键工具,它能帮助我们系统性地解析泛化误差的构成。
它告诉我们泛化误差可以被分解为偏差、方差和噪声之和。
为了说明这三个量是什么,我们先考虑以下场景,设
- $x$为测试样本,$D$为训练集,$y_{D}$为$x$在$D$上的标记,而$y$是真实的标记,这种真实和数据集标记不一致的数据,我们称为噪声。
- $f(x;D)$为训练集$D$上样本$x$的预测输出
- 因为不同的训练集训练出来的模型不一样,所以用$\mathbb{E}_{D}$表示对所有训练集求期望
基于以上设定,对于给定的样本 $x$ ,我们可以定义以下概念: - 期望预测为$\bar{f}(x) = \mathbb{E}_{D}(f(x;D))$
- 方差为$var(x) = \mathbb{E}_{D}((f(x;D)-\bar{f}(x))^{2})$
- 噪声为$\epsilon^{2} =\mathbb{E}_{D}((y_{D}-y)^{2})$
- 偏差为期望输出与真实标记差值的期望即$bias^{2}(x)=(\bar{f}(x)-y)^{2}$
泛化误差的偏差-方差分解 (对于样本 xx 的期望泛化误差):
$$ E(f;D) = bias^{2}(x) + var(x) + \epsilon^{2} $$
其中
- 偏差:反映模型的拟合能力。高偏差意味着模型无法捕捉数据真实规律(欠拟合)。
- 方差:反映模型对数据扰动的敏感性。高方差表明模型过度拟合训练集细节(过拟合)。
- 噪声:问题的固有误差下界,不可通过算法优化降低。
一般来说,偏差和方差是有冲突的,一方高另一方低,具体说来:
- 低偏差 + 高方差:模型复杂,过拟合风险
- 高偏差 + 低方差:模型简单,欠拟合风险
目标:机器学习的目标是找到偏差与方差之间的最佳平衡点,从而最小化总的泛化误差。
分解的推导
一般性的推导需要加上$E(\epsilon)=0$且有$y_{D} = y+\epsilon$的假设,即噪声是随机的。此时简单对$E(f;D)$展开运用期望的线性就能推导出来。
本文由博客一文多发平台 OpenWrite 发布!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。