机器学习笔记二——模型性能度量

685 阅读9分钟

经验误差与过拟合

error rate 错误率 and accuracy 精度

mm个样本中有aa个分类错误则错误率E=a/mE=a/m,精度=1E=1-E

traning error 训练误差 or empirical error 经验误差

学习器在训练集上的误差称之为训练误差(经验误差)

generalization error 泛化误差

学习器在新样本(测试集)上的误差称之为泛化误差

overfittting 过拟合

学习器把训练样本上学得“太好了”,将其中存在的一些特点当成了所有潜在样本的一般性质,导致泛化性能下降,称之为过拟合。

与过拟合相反的叫underfitting 欠拟合

image.png

评估方法

对于一个包含mm个样本的数据集D={(x1,y1),...,(xm,ym)}D=\{(\pmb{x}_1,y_1),...,(\pmb{x}_m,y_m)\},怎么将其分成测试集和训练集?以下介绍几个方法

hold-out 留出法

直接将数据集拆分成两个互斥的合集,一个作为训练集SS,另一个是测试集TTD=ST,ST=D=S \cup T,S\cap T=\emptyset

cross alidation 交叉验证法

将数据集划分成kk个大小相似的互斥子集(又称k折交叉验证),每次用k1k-1个子集训练剩下一个子集做测试,因此可以获得kk组训练/测试结果,再求均值得到最终的结果,kk常取值为10。

image.png

boostrapping 自助法

以自主采样法(boosrtapping sampling)为基础,通过对包含mm个样本的数据集DD采样获得数据集DD'。每次从DD中随机采样一个样本放到DD'中,再将采样过的样本放回DD中,这样样本在下一次采样中还可能被采样到。mm次后获得包含mm个样本的DD'DD中一些样本会在DD'中反复出现,样本在mm次中不被采样到的概率为(11m)m(1-\frac{1}{m})^m,求极限得到(计算方法见微积分求极限方法及公式):

limm(11m)m1e0.368\lim_{m\rightarrow \infty}(1-\frac{1}{m})^m\rightarrow\frac{1}{e}\approx 0.368

可知DD中约有36.8%的样本未出现在DD'中。

performance measure 性能度量

性能度量反映了任务需求,用于衡量模型泛化能力,预测任务中给定样本集D={(x1,y1),...,(xm,ym)}D=\{(\pmb{x}_1,y_1),...,(\pmb{x}_m,y_m)\},其中yiy_ixi\pmb{x}_i的真实标记,通过比较学习得到映射函数f(x)f(\pmb{x})yy来评估模型性能。

mean squared error 均方误差

回归任务最常用的性能度量:

E(f;D)=1mi=1m(f(xi),yi)2E(f;D)=\frac{1}{m}\sum^m_{i=1}(f(\pmb{x}_i),y_i)^2

对于数据分布D\mathcal{D}和概率密度函数p()p(\cdot),均方误差可以描述为:

E(f;D)=xD(f(x)y)2p(x)dxE(f;\mathcal{D})=\int_{\pmb{x} \sim \mathcal{D}}(f(\pmb{x})-y)^2p(\pmb{x})d\pmb{x}

错误率与精度

分类任务中最常用的两种性能度量,同时适用于二分类和多分类任务。对于样本集DD,错误率为(Ⅱ表示取0或1):

E(f;D)=1mi=1m(f(xi)yi)E(f;D)=\frac{1}{m}\sum^m_{i=1}Ⅱ(f(\pmb{x}_i)\neq y_i)

精度的定义为:

acc(f;D)=1mi=1m(f(xi)=yi)=1E(f;D)acc(f;D)=\frac{1}{m}\sum^m_{i=1}Ⅱ(f(\pmb{x}_i)= y_i)=1-E(f;D)

使用概率密度函数p()p(\cdot)和数据分布D\mathcal{D}得到的描述方法为:

E(f;D)=xD(f(x)y)p(x)dxE(f;\mathcal{D})=\int_{\pmb{x} \sim \mathcal{D}}Ⅱ(f(\pmb{x})\neq y)p(\pmb{x})d\pmb{x}
acc(f;D)=xD(f(x)=y)p(x)dxacc(f;\mathcal{D})=\int_{\pmb{x} \sim \mathcal{D}}Ⅱ(f(\pmb{x})= y)p(\pmb{x})d\pmb{x}

precision recall and F1 score 准确率、召回率与F1分数

可以把真实分类和预测器分类结果的组合划分成四个类别如下表所示: image.png

准确率PP和召回率RR的定义为:

P=TPTP+FP,R=TPTP+FNP=\frac{TP}{TP+FP},R=\frac{TP}{TP+FN}

准确率和召回率是一堆矛盾的度量,一个高时另一个就可能会低,如下图所示。 image.png

因此在学习中人们希望能找到一个点来平衡两个度量,从而找到最合适的取值。

平衡点(Break-Event Point,BEP)是准确率等于召回率时的点,在上图中学习器C的BEP是0.64,学习器A的平衡点最高因此可以认为A是最优的学习器。

BEP的方法还是比较简单,F1分数是一个更好的度量方法(它是两个度量的调和平均(harmonic mean)值的倒数):

F1=2×P×RP+R=2×TP样本总量+TPTNF1=\frac{2\times P\times R}{P+R}=\frac{2\times TP}{样本总量+TP-TN}

在一些应用中用户可能会对准确率和召回率存在“偏好”,因此定义F1分数的一般形式FβF_\beta

Fβ=(1+β2)×P×R(β2×P)+RF_\beta=\frac{(1+\beta^2)\times P\times R}{(\beta^2 \times P)+R}

通过调节β\beta的值来调节两个度量对F1分数的影响程度,β=1\beta =1时,两个度量平等,1>β>01>\beta >0时,准确率影响更大,β>1\beta >1时,召回率影响更大(因为调和平均的方法更注重比较小的值)。

ROC曲线和AUC面积

二分类学习器通过映射函数为测试样本生成一个实值或概率预测,然后将这个预测值与某个分类阈值(threshold)比较来确定其分类。这个阈值如何确定影响到学习器的泛化性能,通常学习过程中会按照某种规则(如准确率或召回率的值)将测试样本进行排序然后确定一个“截断点(cut point)来将样本分为两部分,截断点的值即为分类阈值。

ROC(Receiver Operating Characteristic)曲线基于样本的测试结果绘制曲线,其原理与P-R曲线相似,但其横轴为FPR,纵轴为TPR:

TPR=TPTP+FN,FPR=FPTN+FPTPR=\frac{TP}{TP+FN},FPR=\frac{FP}{TN+FP}

若学习器A的ROC曲线被学习器B完全包裹住,则学习器B优于学习器A;若二者有交叉一般则比较其AUC(Area Under ROC Curv)面积,AUC通过计算ROC曲线下各部分的面积和求得,假定ROC曲线由坐标值为{(x1,y1),...(xm,ym)},x1=0,xm=1\{(x_1,y_1),...(x_m,y_m)\},x_1=0,x_m=1的点构成(样本点是离散的因此ROC曲线实际上是由离散的样本点取值连接后平滑而成),如下图(b)所示,则AUC面积可以估算为:

AUC=12i=1m1(xi+1xi)×(yi+yi+1)AUC=\frac{1}{2}\sum^{m-1}_{i=1}(x_{i+1}-x_i)\times (y_i+y_{i+1})

image.png

cost-sensitive 代价敏感错误率和代价曲线

错误会被赋予不均等代价,前面一些性能度量中大多将所有类型的错误都设置为代价均等的,没有考虑不同错误可能会造成不同的后果,某些错误造成后果产生的“代价更大”,某些代价则较小。因此在代价敏感任务的度量中不是简单的最小化错误率而是希望最小化“总体代价”(total cost)。

下表展示了一个二分类代价矩阵: image.png

基于表内信息得到的代价敏感错误率为(D+,DD^+,D^-表示样本集的两个分类子集):

E(f;D;cost)=1m(xiD+(f(xi)yi)×cost01+xiD(f(xi)yi)×cost10)E(f;D;cost)=\frac{1}{m}(\sum_{\pmb{x}_i \in D^+}Ⅱ(f(\pmb{x}_i)\neq y_i)\times cost_{01}+\sum_{\pmb{x}_i \in D^-}Ⅱ(f(\pmb{x}_i)\neq y_i)\times cost_{10})

这种情况下ROC曲线不能反映学习器的总体期望,因此需要使用代价曲线(cost curve)来做问题的形式化展现,代价曲线的横轴取值为[0,1][0,1]的正例概率代价:

P(+)cost=p×cost01p×cost01+(1p)×cost10P(+)_{cost}=\frac{p\times cost_{01}}{p\times cost_{01}+(1-p)\times cost_{10}}

其中pp是样本为正例的概率,纵轴的取值是[0,1][0,1]区间的归一化代价。 image.png

比较检验

基于上述的实验评估方法和性能度量,怎么对学习器的性能做评估呢?性能评估存在几个需要解决的问题:

  • 大多数人希望比较的是泛化性能,但实验评估得到的是测试集上的性能,二者不一定共通。
  • 测试集上的性能和测试集选择有很大的联系,如何排除测试集的影响?
  • 机器学习算法大多包含一定的随机性,即使相同的参数在相同的测试集测试也可能得到不同的结果,如何在这种情况下比较学习器的性能?

接下来的内容中以错误率(ϵ\epsilon)为性能度量讨论比较检验方法。

hypothesis test 假设检验

假设表示对学习器泛化错误率分布的一种猜想或推断,例如ϵ=ϵ0\epsilon=\epsilon_0,任务中并不能感知学习器的泛化错误率,只能通过测试集获取其测试错误率ϵ^\hat{\epsilon},二者不一定相同,但总体趋势比较接近(相差很远的可能性很小),因此可以通过ϵ^\hat{\epsilon}来推断ϵ\epsilon

对于包含mm个测试样本的集合,ϵ^\hat{\epsilon}意味着有ϵ^×m\hat{\epsilon} \times m个样本被分类错误,而泛化错误率为ϵ\epsilon,它将mm'个样本全部分类正确的概率是ϵm(1ϵ)mm\epsilon^{m'}(1-\epsilon)^{m-m'}、因此可以计算学习器恰好将ϵ^×m\hat{\epsilon} \times m个样本分类错误的概率为(即泛化错误率为ϵ\epsilon的学习器测试得到ϵ^\hat{\epsilon}的概率):

P(ϵ^;ϵ)=(mϵ^×m)ϵϵ^×m(1ϵ)mϵ^×mP(\hat{\epsilon};\epsilon)= \left( \begin{matrix} m\\ \hat{\epsilon}\times m \end{matrix} \right) \epsilon^{\hat{\epsilon}\times m}(1-\epsilon)^{m-\hat{\epsilon}\times m}

给定ϵ^\hat{\epsilon}的情况下求得P(ϵ^;ϵ)ϵ=0\frac{\partial P(\hat{\epsilon};\epsilon)}{\partial\epsilon}=0,可知当ϵ^=ϵ\hat{\epsilon}=\epsilon时,P(ϵ^;ϵ)P(\hat{\epsilon};\epsilon)最大,符合二项分布的原理。

binomial test 二项检验

下图展现了一个二项分布的误分类概率直方图:

image.png

考虑假设ϵϵ0\epsilon \leq \epsilon_0,则1α1-\alpha的概率内观测到的最大错误率如下式所示(s.t. 即 subject to):

ϵˉ=max ϵ s.t. i=ϵ0×m+1mϵi(1ϵ)mi<α\bar{\epsilon}= max\ \epsilon\ s.t. \ \sum^m_{i=\epsilon_0\times m + 1}\epsilon^i(1-\epsilon)^{m-i} < \alpha

1α1- \alpha表示置信度(confidence),即图2.6中非阴影部分的范围。

t-test t检验

在多次训练和测试的情况(如交叉验证),会得到多个ϵ^\hat{\epsilon},这次情况二项检验不适用,可采用t检验法,假定得到了kk个测试错误率:ϵ^1,...,ϵ^k\hat{\epsilon}_1,...,\hat{\epsilon}_k,求得其平均错误率μ\mu和方差σ2\sigma^2

kk个测试错误率可看做ϵ0\epsilon_0的独立采样,变量Tt=k(μϵ0)σ\mathcal{T}_t=\frac{\sqrt{k}(\mu-\epsilon_0)}{\sigma}服从自由度k1k-1tt分布,如下图所示: image.png

交叉验证t检验

对于学习器A和B使用kk折交叉验证得到测试错误率:(ϵ1A,...,ϵkA),(ϵ1B,...,ϵ1B)(\epsilon_1^A,...,\epsilon^A_k),(\epsilon_1^B,...,\epsilon_1^B),这种情况可以使用成对t检验(paired t-tests)来进行比较检验。

先对像个结果求差:Δi=ϵiAϵiB\Delta_i=\epsilon_i^A-\epsilon^B_i,若Δi=0\Delta_i=0则两个学习器性能相同;若不为0,则使用:Δ1,...,Δk\Delta_1,...,\Delta_k来对两个学习器性能相同这个假设做t检验,计算均值和方差,在显著度为α\alpha的情况下若变量:

Tt=kμσ\mathcal{T}_t=\frac{\sqrt{k}\mu}{\sigma}

小于临界值tα/2,k1t_{\alpha /2,k-1}则假设不能拒绝,即两个学习器性能没有显著差异,若大于临界值则错误率平均值较小的学习器显著较优。

McNemar 检验

对于学习器A和B,不仅可以估计其测试错误率还能计算其分类结果差别(即都对、都错或一个对一个错),如下表所示:

image.png

若两个学习器性能相同,应有e01=e10e_{01}=e_{10},变量e01e10|e_{01}-e_{10}|应服从正态分布,且均值为1,方差为e01+e10e_{01}+e_{10}。变量:

TX2=(e01e101)2e01+e10\mathcal{T}_{\mathcal{X}^2}=\frac{(|e_{01}-e_{10}|-1)^2}{e_{01}+e_{10}}

应服从自由度为1的X2\mathcal{X}^2分布(卡方分布)。

Friedman 检验与 nenyl 后续检验

上述方法都是关于两个算法比较的方法,当涉及多个算法比较时,一种的分别两两进行比较,另一种方法是使用基于算法排序的Freidman检验。

假设有A、B、C三个学习算法,在D1,D2,D3,D4D_1,D_2,D_3,D_4四个数据集上比较,根据测试性能的好坏赋予序值1,2,...。如下表所示: image.png

使用Freidman检验来判断这些算法的性能是否相同,若相同则其平均序值应相近。假定在NN个数据集上比较kk个算法,rir_i表示第ii个算法的平均序值,rir_i服从正态分布,其均值和方差为(k+1)/2,(k21)/12(k+1)/2,(k^2-1)/12。变量:

TX2=k1k×12Nk21i=1k(rik+12)2\mathcal{T}_{\mathcal{X}^2}=\frac{k-1}{k}\times \frac{12N}{k^2-1}\sum^k_{i=1}(r_i-\frac{k+1}{2})^2

k,Nk,N较大时,服从自由度为k1k-1X2\mathcal{X}^2分布。

通过表2.5可以画出Friedman 检验图,直观看出差别,若有交界则算法性能相似,若没有交界则算法性能存在显著差别。

image.png

bias-variance 偏差-方差

估计学习器的泛化性能后,通常大家还希望能解释其具有这样(好的或坏的)泛化性能的原因,偏差-方差分解 (bias-variance decomposition)是其中一个重要的解释工具。

偏差-方差分解通过拆解对学习算法的期望来解释其构成,对于测试样本x\pmb{x}yDy_Dx\pmb{x}在数据集中的标记集,yyx\pmb{x}的真实标记,f(x;D)f(\pmb{x};D)为基于训练集DD得到的学习模型ffx\pmb{x}上的输出,学习算法的期望预测为:

fˉ(x)=ED[f(x;D)]\bar{f}(x)=\mathbb{E}_D[f(\pmb{x};D)]

使用样本数相同的不同训练集产生的方差为:

var(x)=ED[(f(x;D)fˉ(x))2]var(\pmb{x})=\mathbb{E}_D[(f(\pmb{x};D)-\bar{f}(\pmb{x}))^2]

噪声为:

ε2=ED[(yDy)2]\varepsilon^2=\mathbb{E}_D[(y_D-y)^2]

期望输出与真实标记的差值称为偏差(bias):

bias2(x)=(fˉ(x)y)2bias^2(\pmb{x})=(\bar{f}(\pmb{x})-y)^2

假定噪声为0(便于简化问题),则可以通过多项式展开合并来分解算法的期望泛化误差:

image.png

最后得到(泛化误差可分解为偏差、方差与噪声之和):

E(f:D)=bias2((x)2)+var(x)+ε2E(f:D)=bias^2(\pmb(x)^2)+var(\pmb{x})+\varepsilon^2