本节主要总结以下几个内容:
- 对model泛化能力进行评估的实验方法
- model性能的度量指标
- 用统计检验的方法 比较不同model之间性能的差异
- 解析 model 的 bias and variance
一、对model泛化能力进行评估的实验方法
当我们训练好一个模型时,往往希望知道的并不是他在training_data上的表现,而是在实际应用中的预测精度,接下来介绍3种在实际中常用的用来评估model泛化能力的方法:
- 留出法
1)将training data分为 train_set 和 test_set,利用train_set训练 机器学习模型,用test_set来测试机器学习模型的 泛化能力。
2)需要注意的是,train_set和test_set的distribution应该尽可能的保持一致(可以采用分层采样的方法保证distribution的一致性)。
3)一般train_set应占 training data 的 (2/3 , 4/5),其余的data用作test_set。
4)用 留出法 估计的模型 泛化能力 并不稳定,因此,在实际中,应该 多次利用 留出法 评估 模型的泛化能力,取平均 作为 模型最后的泛化能力。
5)我们通常希望利用所有training data来训练model,但是,留出法中 必须留出一部分样本用来test 模型的泛化能力,因此,无法做到这一点,也即我们最终得到的model使用train_set训练得到的,而非training data。 - cross validation
1)cross validation的原理是将training data分为k份,用其中k-1份data作为train_set,剩下的1份data作为test_set,此为k-fold cross validation,常用的cross validation为10-fold cross validation(5,20 fold cross validation)。
2)与留出法 一样,cross validation 中 也应保证 各 fold data 的 distribution 一致,避免evaluation出现偏差。
3)与留出法 一样,corss validation中train_set和test_set的random 划分方式,也会使得evaluation出现随机性,为防止这种情况的发生,可以使用多次cross validation。如:使用10次10-fold cross validation。
4)cross validation的一个特例是,leave-one-out,即将 1 个data 作为 test_set,其余的作为 train_set,这种方法使得最终训练好的model与用training data训练好的model几乎一模一样,增加了evaluation的准确度,但是,当training data数量很大时,leave-one-out所要进行的次数,消耗的计算量 往往是令人难以忍受的。 - 自助法(bootstrapping)
1)bootstrapping适用于 training data较小的情况,他的核心思想是:有放回的随机抽样m次(m为training data的数据量)。
2)根据公式可知,m次随机抽样中,约有 1/3 的 data 没有被抽到,我们可以利用这些data测试model的泛化能力,这样的测试结果称为“包外估计(out-of-bag-estimate)”。
3)bootstrapping有一个致命的缺陷,即:他会改变 training data 的 distribution,引入估计偏差,因此,这种方法引用较少。
实际中,我们常用“留出法” ,或者 “cross validation”来评估不同model的泛化能力。
当用如上评估方法,选定好我们想要使用的model type时,应利用所有training data对该model进行一次完全的训练。
在选好想要使用的model后,往往model自身会有几个参数需要调节,我们可以用grid的方法,来设定需要调节的参数。所谓grid,即假如我们要调节参数a,可以在[0 , 0.2]范围内以步长0.05,将所有point作为参数的候选值,从中选取可使model泛化能力最好的那个参数值,参数选取方法与model的选取方法一样,可以用“留出法”,也可以用“cross validation”。
除此以外,还有一点需要强调,即:
我们通常把学得的模型在实际中遇到的数据称为“测试数据”;
模型评估与选择中用于评估测试的数据称为“验证集”。
在实际中,我们常把training data划分为train_set 和 validation_set,用于训练 和 评估。而用实际的数据作为“测试数据”,测试model在实际中的泛化能力。
二、model性能的度量指标
性能度量反映了任务需求,在对比不同模型的能力时,使用不同的性能度量往往会导致不同的评判标准;这意味着模型的“好/坏”是相对的,什么样的模型是好的,不仅取决于算法和数据,还取决于任务需求。
本小结介绍几种 衡量模型泛化能力 的 评价标准(性能度量):
- 均方误差
- 错误率 与 精度
- 查准率 、查全率、FI
对于二分类任务而言,查准率P,查全率R,定义如下:
以查全率 和 查准率 为基础,我们可以用如下2种方法来判定 不同 机器学习model 性能的优劣:
首先,绘制P-R曲线,其绘制方法如下:
在P-R曲线中,model A完全包裹住了 model C 的曲线,说明A的学习性能要优于C。如果不同model之间的P-R曲线出现交叉,则要具体看两个model的曲线下面积,面积较大者,其学习性能更优。
除可直观的通过P-R曲线查看不同model的学习性能外,我们还可通过以下2种方法查看model的学习性能:
1)平衡点(Break event point BEP):它是 “查全率” = “查准率” 时的取值。如:在P-R图中可以看出,当P=R时,C的取值<0.65,而A的取值>0.65,说明A的学习性能要优于C。
2)BEP方法过于简单,还有一种更为复杂的方法为FI度量:
在实际任务中,我们往往对P和R的关注度不同,如:在推荐系统中,为了能够较少的打扰用户,我们希望推荐系统的精确度P较高,为了根据实际需求,实现对P和R的不同关注度,我们可以将FI度量,重定义为如下形式:
当 beta > 1时,查全率R有更大影响;
当 beta < 1时,查准率P有更大影响;
当 beta = 1时,退化为FI的标准形式;
上述定义的是“二分类”任务中 的 查全率R 和 查准率P 。
在“多分类”任务中,我们可以用如下两种方法定义“查全率R”和“查准率P”:
1)求所有二分类任务的P和R,然后求平均:
2)求所有二分类任务的TP,TN,FP,FN,然后求各项平均,最后求P,R,FI:
- ROC 与 AUC
ROC曲线的纵坐标为“真正例率TPR”,ROC曲线的横坐标为“假正例率FPR”,二者计算公式如下:;
ROC曲线的绘制过程如下:
以下为ROC曲线 以及 AUC示意图(ROC曲线下面积):
我们可以通过ROC曲线查看不同 机器学习model 的学习性能,其查看方式 与 P-R曲线一致,即:若一个model的ROC曲线完全被另一个model的ROC曲线包裹,则后者的学习性能更优;
除此以外,还可以通过AUC来判定model学习性能的好坏,AUC=0.5,表明model的学习性能接近random,AUC >> 0.5 或 AUC << 0.5 都表明 model具有很好的学习性能,一个具有positive学习性能,一个具有negative学习性能;
AUC的计算公式如下(AUC计算的是各个小格的梯形面积):
;
- 代价敏感错误率 与 代价曲线
在很多分类任务中,不同的错分情况可能会造成不同的后果,如:在“患者诊断”中,把 患者诊断为健康人 较 把健康人诊断为患者 要付出更大的代价,为了在评估model学习性能时,将这种错分代价也考虑在内,我们可以定义一个 分类代价矩阵:,cost01表示将第0类错分为1类的代价,cost10表示将第1类错分为0类的代价。
在计算分类任务的 平方误差 时,我们可以将 代价系数 cost01 和 cost10加入进去,从而对不同分类错误造成的代价予以 区别对待:
。
类似的,也可以对“多分类任务”中的分类错误予以区分对待。
在非均等代价下,ROC曲线不能直接反应model的学习性能,此时我们可以用“代价曲线(cost curve)”来描述model的学习性能,其绘制方法如下:
言简意赅的说,就是将ROC上的每一点point(FPR,TPR),在“代价曲线”上计算一条线段{(0,FPR),(1,FNR)},ROC上所有point在“代价曲线”上计算得到的线段围成的曲线,即为代价曲线。其具体绘制过程 及 公式 如下图所示:
三、用统计检验的方法 比较 不同 model之间性能的差异
本小节主要讲解通过几种统计检验,判定不同model学习性能差异的方法:
- T检验
- McNemar检验(卡方分布)
- Friedman检验 与 Nemenyi 后续检验
1、T检验
1)利用Test检验判定model的“测试错误率” 与 “泛化错误率” 是否 近似相等:
假设我们现有k个“测试错误率”:,给定泛化错误率为ekson_0_,为验证测试错误率 与 泛化错误率 是否等同,我们首先求出 测试错误率 均值 以及 方差:
,然后,利用T检验公式:
来判定 测试错误率 是否可以 等同于 泛化错误率。
以下为T分布示意图:
当我们所求的Tt 在 1-alpha 的置信度 内,其值在临界区间[t-alpha/2 , talpha/2]内,则说明 测试错误率 与 泛化错误率 没有明显差别,否则,测试错误率 与 泛化错误率 显著不同。
2)利用T检验 判定不同model的学习性能差异
T检验判定的具体过程如下:
T检验:,亦称student t检验(Student’s t test),主要用于样本含量较小(例如n < 30),总体标准差σ未知的正态分布。 T检验是用t分布理论来推论差异发生的概率,从而比较两个平均数的差异是否显著。它与f检验、卡方检验并列。t检验是戈斯特为了观测酿酒质量而发明的,并于1908年在Biometrika上公布 。
2、McNemar检验(卡方分布)
3、Friedman检验 与 Nemenyi 后续检验
T检验 和 McNemar检验 都是针对一个数据 对 两个算法 之间的性能差异度 进行比较。
而Friedman检验 与 Nemenyi检验 是针对 多组数据 D1,D2,D3,… 对若干个算法A,B,C,… 的性能差异 进行比较。其核心思想为:首先,利用Friedman检验(卡方分布)检验 各个算法之间性能是否有显著差异,如果有,则进行 Nemenyi后续检验。如果在Nemenyi后续检验 中 依然有 算法性能差异显著 这个结论,则说明 这些算法之间 确实存在 性能差异。
下面具体介绍 “Friedman 检验 与 Nemenyi后续检验” 核心原理:
first:根据“留出法” 或 “cross validation”,判断各个算法在不同数据中 validation_set 中的学习性能,并根据 各算法学习性能 优劣 对各个算法进行排序:{1: 优,2:次优,…},假设算法A,B,C在数据集D1,D2,D3,D4 下的排序结果,具体如下图所示:
second:利用Friedman检验 来判定这些算法 是否性能相同。
假设ri 表示 第 i 个算法的 平均序值,且服从正态分布,其均值 和 方差分别为:,(k为算法个数)。则可知,标准化的ri的平方和 服从“卡方分布”,其计算公式为:
,此即原始的Friedman检验公式。
上述原始Friedman公式过于简单,因此优化如下:,其中N为数据集的个数。根据TF的计算结果,对比相对应的"置信度,N,k",下的临界区间,如果TF 在临界区间内,则说明“各个算法性能无显著差异”,否则,说明“各个算法性能之间有显著差异”。若算法性能有显著差异,则用 Nemenyi后续检验 进行进一步的检验。
third:如果利用Friedman检验 结果显示 各算法性能之间有显著差异,则用Nemenyi后续检验 对 各个算法 进行进一步检验。
Nemenyi检验 可以计算出 算法 平均序值差值 的 临界区域,其计算公式如下:,其中q_alpha_ 可以通过查表获得,根据公式计算出 平均序值差值 的 临界区域后,比较算法A, B, C, 3者 平均序值的差值,如果差值>临界区域,则说明 两个算法之间 性能存在显著差异,在validation_set上误差较小的算法,性能更优。否则,说明 两个算法之间 性能没有显著差异。
卡方分布:若n个相互独立的随机变量ξ₁,ξ₂,…,ξn ,均服从标准正态分布(也称独立同分布于标准正态分布),则这n个服从标准正态分布的随机变量的平方和构成一新的随机变量,其分布规律称为卡方分布(chi-square distribution)。
上述“Friedman检验 与 Nemenyi后续检验” 结果可以直观的用 “Friedman检验图”显示,具体如下:
圆点:表示各个算法的平均序值;
线段:表示各个算法 平均序值 的临界区域;
当两个算法 的 临界区域 有交集时,说明 两算法性能没有显著差异;
当两个算法 的 临界区域 没有交集时,说明两算法性能存在显著差异;
四、解析 model 的bias and variance
本小节主要证明一个问题,即:model的泛化误差 = 方差 + 偏差 + noise。
对于一个model,当bias降低时,往往意味着variance增加,这是因为,bias评估的是model拟合train_data的能力,而vairance评估的是model泛化的能力,关于bias,variance的关系,如下图所示: