• 机器学习基础(5)—— 模型选择之性能度量


    • 参考:西瓜书第二章

    • 之前的文章介绍了多种模型选择的概念,其关键是设计一个对比各个方法所得模型及其模型参数的规范流程,并利用它从假设空间中选出泛化能力最强的模型,形式化地讲是做以下两件事
      1. 确定模型类型(决策树、线性回归、神经网络…)·
      2. 确定参数,包括模型参数(算法)超参数。这一步是模型选择的核心,而比较不同模型(即不同参数)的性能是这一步的核心,“比较” 方法进一步细化为三步
        1. 设计模型性能的 评估方法,上篇文章已经详细介绍过了
        2. 设计性能的量化指标 性能度量,本文进行介绍
        3. 设计合适的比较方法,通常用数理统计中的 假设检验 方法,本文进行介绍

    1 性能度量

    • 模型评估的核心是评估泛化能力,相应的评价标准称为 性能度量performance measure。不同的性能度量可能导致不同的评估结果(即模型的 “好坏” 是相对的),我们应基于任务需求设计性能度量

    1.1 回归任务常用的性能度量

    • 给定样本集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) } D = \{(\pmb{x}_1,y_1),(\pmb{x}_2,y_2),...,(\pmb{x}_m,y_m)\} D={(xx1,y1),(xx2,y2),...,(xxm,ym)},回归任务的评估对象是学习器 f f f 的预测结果 f ( x ) f(\pmb{x}) f(xx) 和真实标记 y y y 的差异,这时最常用的性能度量就是 “均方误差”
    • 均方误差mean squared error:对于离散和连续的数据分布,如下定义均方误差
      离散: E ( f ; D ) = 1 m ∑ i = 1 m ( f ( x i ) − y i ) 2 连续: E ( f ; D ) = ∫ x ∼ D p ( x ) ( f ( x ) − y ) 2 d x E(f;D)=1mmi=1(f(xxi)yi)2E(f;D)=xxDp(xx)(f(xx)y)2dxx
      离散:E(f;D)=m1i=1m(f(xxi)yi)2连续:E(f;D)=xxDp(xx)(f(xx)y)2dxx

    1.2 分类任务常用的性能度量

    • 分类任务中的性能度量比较多样,下面逐一介绍

    1.2.1 错误率和精度

    • 这是分类任务中最常用的两种性能度量,既适用于二分类任务,也适用于多分类任务
    • 给定样本集 D D D,错误率和精度定义如下
      1. 分类错误率:对于离散和连续的数据分布,如下定义分类错误率
        离散: E ( f ; D ) = 1 m ∑ i = 1 m I ( f ( x i ) ≠ y i ) 连续: E ( f ; D ) = ∫ x ∼ D p ( x ) I ( f ( x ) ≠ y ) d x E(f;D)=1mmi=1I(f(xxi)yi)E(f;D)=xxDp(xx)I(f(xx)y)dxx
        离散:E(f;D)=m1i=1mI(f(xxi)=yi)连续:E(f;D)=xxDp(xx)I(f(xx)=y)dxx
      2. 精度:对于离散和连续的数据分布,如下定义分类精度
        离散:acc ( f ; D ) = 1 m ∑ i = 1 m I ( f ( x i ) = y i ) = 1 − E ( f ; D ) 连续:acc ( f ; D ) = ∫ x ∼ D p ( x ) I ( f ( x ) = y ) d x = 1 − E ( f ; D ) acc(f;D)=1mmi=1I(f(xxi)=yi)=1E(f;D)acc(f;D)=xxDp(xx)I(f(xx)=y)dxx=1E(f;D)
        离散:acc(f;D)=m1i=1mI(f(xxi)=yi)=1E(f;D)连续:acc(f;D)=xxDp(xx)I(f(xx)=y)dxx=1E(f;D)

    1.2.2 查准率、查全率 F 1 F1 F1

    • 如果我们想进一步考察评估分类性能,只用错误率和精度就力不从心了。考虑最简单的二分类问题,利用错误率和精度可以评估出多少比例的样本被分类错误,但是无法考察 “判断为正例的样本中有多少比例真的是正例”、“所有正样本中有多少被分类正确” 这样的细化指标。对于二分类问题,考虑样本真实类别和预测类别的所有组合情况,可以得到如下的 混淆矩阵confusion matrix (其中 T P + F P + T N + F N = 样例总数 TP+FP+TN+FN=样例总数 TP+FP+TN+FN=样例总数
      在这里插入图片描述
      这样我们可以进一步提出针对二分类问题的两个指标:

      1. 查准率precision P P P:预测为正例的样本中真正正样本的比例
      2. 查全率/召回率recall R R R:真正正样本中预测为正例的比例
        查准率: P = T P T P + F P 查全率: R = T P T P + F N P=TPTP+FPR=TPTP+FN
        查准率:P=TP+FPTP查全率:R=TP+FNTP
    • 查准率和查全率是一对矛盾的度量,一个量较高时另一个就较低

      以判断西瓜是不是好瓜为例

      1. 若想提高查全率(将好瓜尽可能多地选出来)可以增加选瓜的数量,极端情况下所有瓜全判断为好瓜,则所有好瓜都一定选出, R = 1 R=1 R=1。但此时也误判了大量坏瓜,导致查准率 P P P
      2. 若想提高查准率若(希望选的瓜中好瓜比例尽可能高)可以只挑选最有把握的瓜,但这样就难免会漏掉不少好瓜,使得查全率较低

      通常分类器会输出一个样本判断为正例的概率,可以把所有样本按判正的概率排序,调整概率阈值使得判正的样本数从 0 逐一增加到全体样本,每次计算查准率和查全率,这样就能绘制 查准率-查全率曲线(P-R曲线)
      在这里插入图片描述
      考虑如何用查准和查全率这两个评估指标对比模型

      1. 如果一个学习器的 P-R 曲线被另一个完全包住,则可以断定后者性能更好,如上图中 B 一定优于 C
      2. 如果两个学习其的 P-R 曲线交叉,则可以通过比较 P-R 曲线下面积的大小来对比性能,但是这个值不太好估算,所以人们设计一些综合考虑查准和查全率的性能度量
    • 综合考虑查准和查全率的性能度量主要有以下三种

      1. 平衡点 Break-Event Point,BEP P = R P=R P=R 时的值,如上图中学习器 A 的 BEP 就是 0.8,这样也能比较模型性能,但是有些过于简化了
      2. F1度量:查准率和查全率的调和平均,定义为
        1 F 1 = 1 2 ⋅ ( 1 P + 1 R ) ⇒ F 1 = 2 × P × R P + R = 2 × T P 样例总数 + T P − T N \frac{1}{F_1} = \frac{1}{2}·(\frac{1}{P}+\frac{1}{R}) \Rightarrow F_1 = \frac{2\times P\times R}{P+R} = \frac{2\times TP}{样例总数+TP-TN} F11=21(P1+R1)F1=P+R2×P×R=样例总数+TPTN2×TP 这个指标中 P P P R R R 的重视程度是一致的,是比较常用的指标
      3. Fβ度量:查准率和查全率的调和平均,定义为
        1 F β = 1 1 + β 2 ⋅ ( 1 P + β 2 R ) ⇒ F β = ( 1 + β 2 ) × P × R ( β 2 × P ) + R \frac{1}{F_\beta} = \frac{1}{1+\beta^2}·(\frac{1}{P}+\frac{\beta^2}{R}) \Rightarrow F_\beta = \frac{(1+\beta^2)\times P\times R}{(\beta^2\times P)+R} Fβ1=1+β21(P1+Rβ2)Fβ=(β2×P)+R(1+β2)×P×R 这是 F 1 F1 F1 度量的推广,这里的 β > 0 \beta>0 β>0 度量了查全率 R R R 对查准率 P P P 的相对重要性,通过它可以调节对 P P P R R R 的相对重视程度,从而可以更好地满足不同场景的需求
        • 例如在商品推荐系统中,为了尽可能少打扰用户,更希望推荐内容确是用户感兴趣的,此时查准率更重要;而在逃犯信息检索系统中,更希望尽可能少漏掉逃犯,此时查全率更重要
        • 相比算数平均和几何平均,调和平均更重视较小值
    • 有时我们想综合考虑多个混淆矩阵来对比模型,比如

      1. 进行多次训练/测试
      2. 执行多个任务
      3. 多分类任务,每两两类组合得到一个混淆矩阵

      这时有两种方式进行综合

      1. 先在对各个混淆矩阵计算对应的 P P P R R R,再计算出平均值 P ˉ , R ˉ \bar{P},\bar{R} Pˉ,Rˉ,进而利用他们计算 F 1 F1 F1 度量,这样得到的称为 宏查准率macro-P宏查全率macro-R宏F1 macro-F1
      2. 先把所有混淆矩阵的对应元素进行平均得到一个平均混淆矩阵,再按上面的方法计算三个度量,这样得到的称为 微查准率micro-P微查全率micro-R微F1 micro-F1

    1.2.3 ROC 和 AUC

    • 上面介绍 P-R 曲线时已经提到了大多数分类器的分类原理,即首先对测试样本产生一个实值或概率值,用它和设定的分类阈值比较,大于就分为正类,反之分为负类。我们可以按分类器输出对测试样本排序,最可能是正例的排在最前,最不可能是正例的排在最后,并根据任务需求设置不同的分类阈值截断点

      1. 若更重视 “查准率”,则选择排序中靠前的位置进行截断
      2. 若更重视"查全率",则可选择靠后的位置进行截断

      注意到,这个排序本身的质量好坏,体现了综合考虑不同任务下的 “期望泛化性能” 的好坏,即 “一般情况下” 泛化性能的好坏。ROC 和 AUC 就是从模型输出排序质量的角度来评估分类器泛化性能的度量标准

    • ROC受试者工作特征:是一个类似 P-R 曲线的曲线,也是逐一调整分类阈值,每次计算两个值作为横纵坐标作图,分别为

      1. 横轴 假正例率FPR:真正负样本中预测为正例的比例
      2. 纵轴为 真正例率TPR:真正正样本中预测为正例的比例(同查全率)
        T P R = T P T P + F N F P R = F P T N + F P TPR=TPTP+FNFPR=FPTN+FP
        TPR=TP+FNTPFPR=TN+FPFP

      这样就能绘制出 ROC 曲线图如下
      在这里插入图片描述
      显然,图中的虚线对角线对应于 “随机猜测” 模型,而点 ( 0 , 1 ) (0,1) (0,1) 对应于将所有正例排在反例之前的 “理想模型”,对于任意给定的假正例率,对应的真正例率越高越好,从整体上看,就是曲线上凸越多越好。和 P-R 曲线类似,在利用 ROC 指标评估对比模型时

      1. 若一个学习器的曲线将另一个完全包住,则可断定前者性能更好
      2. 如果两个学习器的 ROC 曲线出现交叉,则围出面积更大的学习器好,这个面积指标就是 AUC(Area Under ROC Curve)
    • 使用有限样本集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) } D = \{(\pmb{x}_1,y_1),(\pmb{x}_2,y_2),...,(\pmb{x}_m,y_m)\} D={(xx1,y1),(xx2,y2),...,(xxm,ym)} 评估时,ROC 曲线如上图 b 所示,可以将其分割成很多长方形估计面积(AUC) ,定义为
      AUC = 1 2 ∑ i = 1 m − 1 ( x i + 1 − x i ) ⋅ ( y i + y i + 1 ) \text{AUC} = \frac{1}{2}\sum_{i=1}^{m-1}(x_{i+1}-x_i)·(y_i+y_{i+1}) AUC=21i=1m1(xi+1xi)(yi+yi+1) 形式化地看,AUC 考虑的是样本预测的排序质量,因此它与排序误差有紧密联系,给定 m + m^+ m+ 个正样本和 m − m^- m 个负样本,令 D + , D − D^+,D^- D+,D 分别表示正负样本集合,则排序损失定义为
      l r a n k = 1 m + m − ∑ x + ∈ D + ∑ x − ∈ D − ( I ( f ( x + ) < f ( x − ) ) + 1 2 I ( f ( x + ) = f ( x − ) ) ) \mathcal{l}_{rank} = \frac{1}{m^+m^-}\sum_{x^+\in D^+}\sum_{x^-\in D^-} \Big(\mathbb{I}\big(f(x^+)lrank=m+m1x+D+xD(I(f(x+)<f(x))+21I(f(x+)=f(x)))考虑每一对正负样本,若学习器对正样本的输出值小于负样本就进行 − 1 -1 1 的罚分; 若学习器对正样本的输出值等于负样本就进行 − 0.5 -0.5 0.5 的罚分,容易看出 l r a n k \mathcal{l}_{rank} lrank 对应的是 ROC 曲线之上的面积,有
      AUC = 1 − l r a n k \text{AUC} = 1-\mathcal{l}_{rank} AUC=1lrank

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

    • 1.2.2 节介绍 度量时,提到了对于不同的任务,对查全率和查准率之间需求的倾向可能不等;类似的,在某个特定任务中,各个类别分类出错导致的代价也可能不等

      例如在医疗诊断中,错误地把患者诊断为健康人与错误地把健康人诊断为患者,看起来都是犯了"一次错误"但后者的影响是增加了进→步检查的麻烦,前者的后果却可能是丧失了拯救生命的最佳时机

      前面介绍的性能度量都只是从各类预测错误的次数/比例的角度去构造,隐式地假设了不同的错误代价均等。考虑到不同错误的代价,对于一个多分类任务,设 c o s t i j cost_{ij} costij 表示将第 i i i 类样本预测为 j j j 类的代价,这样就能构造出 代价矩阵。以最简单的二分类任务为例,代价矩阵为
      在这里插入图片描述
      注意到通常设置 c o s t i i = 0 cost_{ii}=0 costii=0,将上图的 0/1 类看作正/负类, D + , D − D^+,D^- D+,D 分别表示正负样本集合,则可如下计算出 代价敏感cost-sensitive 错误率
      E ( f ; D ; c o s t ) = 1 m ( ∑ x i ∈ D + I ( f ( x i ) ≠ y i ) × c o s t 01 + ∑ x i ∈ D − I ( f ( x i ) ≠ y i ) × c o s t 10 ) E(f;D;cost) = \frac{1}{m}\Big(\sum_{x_i\in D^+}\mathbb{I}\big(f(x_i)\neq y_i\big)\times cost_{01}+\sum_{x_i\in D^-}\mathbb{I}\big(f(x_i)\neq y_i\big)\times cost_{10} \Big) E(f;D;cost)=m1(xiD+I(f(xi)=yi)×cost01+xiDI(f(xi)=yi)×cost10) 这个式子也可以简单地推广到连续的数据分别和多分类问题

    • 代价曲线 cost curve 可以在考虑非均等代价的情况下体现学习器的期望总体代价,具体而言

      1. 横轴 正例概率代价 是把正样本误判为负的代价在代价度量中的重要性,取值 [ 0 , 1 ] [0,1] [0,1],如下(其中 p p p 是样本为正的概率)
        P ( + ) c o s t = p × c o s t 01 p × c o s t 01 + ( 1 − p ) × c o s t 10 P(+) cost=\frac{p \times cost_{01}} {p \times cost_{01}+(1-p) \times cost _{10}} P(+)cost=p×cost01+(1p)×cost10p×cost01
      2. 纵轴 归一化代价 是各种错误判断情况的综合代价,取值 [ 0 , 1 ] [0,1] [0,1],如下
        c o s t n o r m = F N R × p × c o s t 01 + F P R × ( 1 − p ) × c o s t 10 p × c o s t 01 + ( 1 − p ) × c o s t 10 cost_{n o r m}=\frac{ FNR \times p \times cost_{01}+FPR \times(1-p) \times cost_{10}}{p \times cost_{01}+(1-p) \times cost_{10}} costnorm=p×cost01+(1p)×cost10FNR×p×cost01+FPR×(1p)×cost10 其中 F P R FPR FPR 是 1.2.3 节的假正例率(正样本误判为负概率); F N R = 1 − T P R FNR =1-TPR FNR=1TPR 是假反例率(负样本误判为正概率)

      直观上看,给定一组 ( F P R , F N R ) (FPR,FNR) (FPR,FNR) 参数,即给定一个学习器的分类性能,就对应 “归一化代价-正例概率代价“ 图中一条从 ( 0 , F P R ) (0,FPR) (0,FPR) ( 1 , F N R ) (1,FNR) (1,FNR) 的线段,反应了各个代价不等情况下的期望总代价

      1. 横轴代表所有代价不等情况,即从 “只在意正样本误判(不在意负样本误判)”,到 “不在意正样本误判(只在意负样本误判)”
      2. 纵轴反映各种倾向情况下,某个 ( F P R , F N R ) (FPR,FNR) (FPR,FNR) 参数对应的学习器的期望总代价

      在评估模型进行比较时,我们要综合考虑所有可能的 ( F P R , F N R ) (FPR,FNR) (FPR,FNR) 参数情况,这一步通过把 ROC 曲线转化为代价曲线来实现。具体而言,把 ROC 曲线上的每一个点转化为对应的 ( F P R , F N R ) (FPR,FNR) (FPR,FNR) 参数,然后在 “归一化代价-正例概率代价“ 图中把所有参数对应的线段都画出来,然后取所有线段的下界,就得到了 代价曲线,它围出的面积即为在所有条件下学习器的期望总体代价,如下所示
      在这里插入图片描述

    2. 比较检验

    • 利用前一篇文章介绍的实验评估方法,计算出第1节的各个性能度量结果,是不是之间 “比大小” 就能对学习器的性能进行比较了?事实上,机器学习中性能比较这件事比看起来复杂很多
      1. 我们希望比较的是泛化性能,而实验评估只能得到测试集上的性能,两者的对比结果未必相同
      2. 测试集上的性能与测试集本身的选择有很大关系,测试集的尺寸和包含的测试样例都会影响测试结果
      3. 很多机器学习算法本身有一定的随机性,即便用相同的参数设置在同一个测试集上多次运行,其结果也会有不同
    • 这里很容易联想到数理统计中的假设检验,比如用简单的错误率 ϵ \epsilon ϵ 作为性能度量,我们可以先对学习器的泛化错误率做出假设 ϵ = ϵ 0 \epsilon=\epsilon_0 ϵ=ϵ0,然后再用假设检验方法计算该假设的置信度、拒绝域等统计信息。基于假设检验结果我们可推断出,若在测试集上观察到学习器 A 比 B 好,则 A 的泛化性能是否在统计意义上优于 B,以及这个结论的把握有多大
    • 对于假设检验的说明请参考 数理统计 —— 参数估计与假设检验,西瓜书上这里介绍了交叉验证 t 检验McNemar 检验Friedman检验Nemenyi后续检验 等方法,还是比较复杂,待续
  • 相关阅读:
    大话STL第一期——初识相见恨晚
    SpringBoot (1)
    【第五章:Java开发岗:Spring篇】
    linux提权辅助工具linux-smart-enumeration(三种工具)
    MongoDB数组查询
    项目管理基础
    [Rust学习:四] Vec和栈
    LeetCode笔记:Weekly Contest 306
    将CSV、Excel、XML文件转换为MySQL数据库
    【【萌新的SOC学习之 VDMA 彩条显示实验之一】】
  • 原文地址:https://blog.csdn.net/wxc971231/article/details/126654297