模型的评估与选择

309 阅读3分钟

误差

训练误差与泛化误差(generalization error)


模型在训练样本上的误差是训练误差

在新的样本上的误差是泛化误差

训练误差也称经验误差

过拟合 Overfitting


模型过度依赖训练样本的特征,导致泛化能力下降

发生原因通常是模型有着很大规模的参数,但训练样本复杂度很低并且数量很少

体现出来的测试集的精度先上升后下降(普遍情况)

欠拟合 Underfitting


发生的原因通常是模型复杂度不够,泛化能力不足,无法提取更多潜在特征

评估方法

训练集


顾名思义,用于训练模型的样本集合

测试集


模型在测试集上的误差的“测试误差”被视作近似于泛化误差

模型不得依赖测试集来调整自身,测试集上的精度反映的是泛化能力

验证集


验证集不参加与训练,它被用于验证模型的性能和参数的好坏,模型不能基于测试集调整自身,但可以基于验证集调整

划分样本

留出法(Hold-out)

将样本划分为两个互斥的集合

测试集和训练集的数据分布应当保持一致,避免因为数据划分带来的偏差影响最终结果

单次使用得出的估计结果往往不够可靠,应当多次使用

问题

留出法并没有一个规定,测试集和训练集样本的比例

训练集需要尽可能模拟整个样本,如果训练集划分的比例较少就很难与原样本相似

如果划分较多,由于测试集样本数量较少,多次评估时的结果就会不稳定

交叉验证法

先将样本划分为 k 个互斥的子集,每一个子集的数据分布都需与总样本的分布相似(通过分层采样),然后每次用 k-1 个子集用于训练,剩下一个用于评估,这样训练 k 次后取平均的评估精度

根据 k 值的不同称其为“k折交叉验证”,k常取10,5,20等

留一法(Leave-One-Out)

当 k 等于样本数量时,只会留下一个样本用于测试,留一法的评估结果比较准确

但样本数量非常大时,则需要训练样本数量次模型

自助法(Bootstrapping)

每次随机从 m 个样本的原始数据集 DD  和里抽取一个并放回,m 次后获得一个新的数据集 DD' ,取

DD' 为训练集, DD (DD)\complement _ D D' (D - D') 为测试集

样本在 m 次采样均没采样到的概率为 (1  1m)m(1 - \frac{1}{m})^m ,取极限为 limm(1  1m)m = 1e  0.368\lim_{m\to \infty }(1 - \frac{1}{m})^m =  \frac{1}{e} \approx 0.368 自助法总有着 1/3 的测试集样本量

在样本量很大时,自助法并不常用,它会改变样本的分布,从而带来估计偏差

它在数据量小,很难有效划分训练/测试集时很有用

性能度量

度量模型的性能好坏

均方误差(Mean Squared Error MSE)


一般公式

E(f;D) = x  D (f(x)y)2 p(x) dxE(f; D) = \int_{x \sim D} (f(x) - y )^2 p(x) dx   p()p(*) 为概率

常见形式

E(f; D)=1mi=1m(f(xi)yi)2 E(f; D) = \frac{1}{m} \sum_{i=1}^m(f(x_i) - y_i)^2 

查准率(precision)、查全率(recall)和F1


对于二分类模型

真实情况 / 预测结果正例(Positive)反例(Negative)
正例TPFN
反例FPTN

查准率 P = TPTP+FPP = \frac{TP}{TP + FP} ,查全率 R = TPTP+FNR = \frac{TP}{TP + FN}

查准率和查全率往往互相矛盾,查准率越高,查全率就会越低,反之亦然

P-R 曲线

分类问题通过设置不同的置信度阈值,可以得到不同的P值和R值,可以将其绘制成 P-R 曲线

阈值越高,被判断为正例越困难,查准率越高,图像越往左上方走

阈值越低,被判断为正例越容易,查全率越高,图像越往右下方走

度量标准

  • 平衡点(Break-Even Point BEP)

    • 当 P=R 时,P和R的取值
    • 有点捞
  • F1 度量

    • F1 = 2PRP+R = 2TP样本总数+TPTNF1 = \frac{2*P*R}{P+R} = \frac{2*TP}{样本总数+TP-TN}

    • F1 的定义是 R 和 R 的调和平均(harmonic mean),即 1F1 = 12 (1P+1R)\frac{1}{F1} = \frac{1}{2} (\frac{1}{P} + \frac{1}{R})

    • Fβ = 11+β2 (1P+β2R)F_{\beta} = \frac{1}{1 + \beta^2} (\frac{1}{P} + \frac{\beta^2}{R})  加权 F1

      • β\beta 度量了查全率对查准率的相对重要性

        • β > 1\beta > 1  时查全率有更大影响
        • β < 1\beta < 1 时查准率有更大影响

有多个混淆矩阵

  • 宏 F1 (macro-F1)

    • 对所有混淆矩阵的 P 和 R 求一次平均,然后对 P, R 平均值求一次 F1,记作宏 F1
  • 微 F1 (micro-F1)

    • 对 TP, FP, TN, FN 求一次平均,然后求出 R, P, F1,记作微 F1

ROC 和 AUC

ROC 用于描绘模型在均等代价下的“期望泛化”能力

  • 只能在均等代价下

ROC(Receiver Operating Characteristic  受试者工作特征)

  • 二战期间用于敌机检测的雷达信号分析技术
  • 后用于心理学、医学检测、最终被引入机器学习领域

AUC(Area Under ROC Curve)

  • ROC 曲线下的面积
  • ROC

    • 横轴是假正例率 (False Positive Rate FPR)

      • FPR = FPTN+FPFPR = \frac{FP}{TN + FP}
    • 纵轴是真正例率 (True Positive Rate TPR)

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

大概长这样

对角线对应的模型类似一个 “随机猜测” 模型,预测时五五开

排序误差

给定 m+ m^+  个正例和 mm^- 个反例,令 D+ , DD^+ , D^-  分别表示正例和反例的集合

则排序“损失”为

rank = 1m+mx+D+xD (int(f(x+)<f(x)) + 12int(f(x+)=f(x)))\ell_{rank} = \frac{1}{m^+*m^-}\sum_{x^+\in D^+}\sum_{x^-\in D^-} (int(f(x^+) < f(x^-)) + \frac{1}{2} int(f(x^+) = f(x^-)))

对正反例集合里对每一对正反例,如果正例的预测概率低于反例的预测概率,则记上一个损失,如果相等,则记上 0.5 个损失,可以得出 rank \ell_{rank}  就是 ROC 曲线上半部分的面积

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

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

错误的“非均等代价” (unequal cost)

  • 医院里将健康人判断为患者的错误代价远远比将患者判断为健康人的代价小

代价矩阵(cost matrix)

二分类模型下,代价矩阵将考虑不同情况下预测错误的代价

真实类别 / 预测类别第 0 类第 1 类
第 0 类0cost01cost_{01}
第 1 类cost10cost_{10} 0

代价敏感(cost-sensitive)下的错误率

E(f;D;cost) = 1m(xiD+int(f(xi) yi) cost01 + xiDint(f(xi) yi) cost10)E(f; D; cost) = \frac{1}{m}(\sum_{x_i \in D^+} int(f(x_i) \not= y_i) * cost_{01} + \sum_{x_i \in D_-}int(f(x_i) \not= y_i) * cost_{10})

代价曲线

  • 横轴是正例概率的代价

    • P(+)cost = pcost01pcost01+(1p)cost10P(+)cost = \frac{p * cost_{01}}{p * cost_{01} + (1 - p ) * cost_{10}}  p 是样例为正例的概率
  • 纵轴是归一化后的代价

    • costnorm = FNRpcost01+FPR(1p)cost10pcost01+(1p)cost10cost_{norm} = \frac{FNR *p * cost_{01} + FPR * (1 - p) * cost_{10}}{p * cost_{01} + (1 - p)*cost_{10}}

      • FPR 假正例率 在上面已经定义, FNR = 1TPRFNR = 1 - TPR  假反例率

代价曲线的绘制

ROC 曲线上每一个点都对应代价曲线上的一条线段

对于 ROC 曲线上某一点 (FPR, TPR),可以计算出 FNR,然后绘制从 (0, FPR) 到 (1, FNR) 的线段

线段下的面积表示该点下的期望总体代价

最后取 ROC 上所有的点,绘制对应的曲线,取所有曲线下方区域的交集,围成的面积即为在所有条件下模型的期望总体代价

比较检验

直接将性能度量指标进行比较来对比模型的优劣不够准确

统计假设检验(hypothesis test)为机器学习模型性能比较提供了重要的依据

下面将以 错误率 为性能度量

假设检验


类似高中学过的 卡方统计量 判断 X Y 之间是否有关联

在假设检验中,“假设”是对模型的泛化错误率的猜想和假设,并以概率度量假设成立的可能性

对于模型在测试集上的错误率有 ϵ^\hat{\epsilon} ,而模型的泛化错误率 ϵ\epsilon 是无法得知的,直观上这二者应该十分相近,它们之间有很大差距的 可能性 比较低

测试错误率分布

假设对于测试错误率为 ϵ^ \hat{\epsilon}  的分类模型,它有 ϵ^  m \hat{\epsilon} * m   个样本被错误分类了,那么该模型在未知的泛化错误率 ϵ\epsilon 下,它将 mm'  个样本分类错误,剩余 m  mm - m'  个样本正确分类的 概率 是 Cmm ϵm(1ϵ)mmC_m^{m'} \epsilon^{m'}(1-\epsilon)^{m-m'} (解释:在 m 个样本中选取 mm'  个分类错误的可能组合数量,每一个可能选取结果下的可能性均为 ϵm(1ϵ)mm\epsilon^{m'}(1-\epsilon)^{m-m'} ),也可以记为 (mm)ϵm(1ϵ)mm\begin{pmatrix} m \\ m' \end{pmatrix}\epsilon^{m'}(1-\epsilon)^{m-m'}

那么该模型在泛化错误率为 ϵ\epsilon 下,被测的的测试错误率为 ϵ^\hat{\epsilon}  的概率为

P(ϵ^; ϵ) = Cmϵ^mϵϵ^m(1ϵ)mϵ^mP(\hat{\epsilon}; \epsilon) = C_m^{\hat{\epsilon}*m}\epsilon^{\hat{\epsilon}*m}(1-\epsilon)^{m-\hat{\epsilon}*m}

发现了没有,对于不同的 ϵ^m\hat{\epsilon}*m ,即对于不同的 ϵ^\hat{\epsilon} ,这个概率符合二项分布 (binomial)

给定了测试错误率下,对其求导,即 P(ϵ^; ϵ)ϵ = 0\frac{\partial P(\hat{\epsilon}; \epsilon)}{\partial \epsilon} = 0 ,解得 ϵ = ϵ^\epsilon = \hat{\epsilon}  时,P 取极大值(也就是最大值),也就是说测试错误率被测得等于泛化错误率的可能性最大

二项检验

对于一个给定的“显著度” α\alpha ,有“置信度” 1  α1 - \alpha ,对泛化错误率小于等于 ϵ0\epsilon_0  进行检验(即得出泛化错误率小于 ϵ0\epsilon_0  的可能性)

求解 ϵˉ = min (ϵ)  s.t. k=ϵ0  m + 1mCmk ϵk (1ϵ)mk < α\bar{\epsilon} = min (\epsilon)  s.t. \sum_{k=\epsilon_0 * m + 1}^m C_m^k \epsilon^k (1-\epsilon)^{m-k} < \alpha  (在给定的 ϵ0\epsilon_0  下寻找一个满足条件的最小的错误率,条件是在需要寻求的最小错误率作为泛化错误率下,被测的测试错误率为 ϵ0\epsilon_0  及其之后的错误率的概率总和不得大于 α\alpha ) (但是这个 ϵˉ\bar\epsilon  比较难解出)

若求解出的 ϵˉ\bar\epsilon  大于此时测出的测试错误率 ϵ^\hat\epsilon ,那么就可以得出结论:在 α\alpha 的显著度下,假设 ϵ  ϵ0\epsilon \le \epsilon_0  不能被拒绝,即有 1α1-\alpha  的把握认为,模型的泛化错误率小于 ϵ0\epsilon_0

反之,可以认为模型在 α\alpha  的显著度下,泛化错误率大于 ϵ0\epsilon_0


模型通常不会仅仅做一次评测,在使用不同的方法,训练不同次,都会得到一个测试错误率

则有一个测试错误率集合,假设为 ϵ^1, ϵ^2,...ϵ^k\hat\epsilon_1, \hat\epsilon_2,...\hat\epsilon_k ,那就会有一个 方差 σ2\sigma^2  和偏差(平均错误率) μ\mu

每一次测出测试错误率可以被认作是对泛化错误率的一次采样,且符合正态分布 N(ϵ, σ02)N(\epsilon, \sigma_0^2)

其中,泛化标准差 σ0\sigma_0  未知,关于泛化错误率的假设 H0: ϵ = ϵ0H_0: \epsilon = \epsilon_0 的检验 ( t 检验)

变量 τt = k(μ  ϵ0)σ\tau_t = \frac{\sqrt{k}(\mu - \epsilon_0)}{\sigma}  当观察到 τt|\tau_t| 过分大时( τt > k|\tau_t| > k  ),就拒绝初始条件 H0H_0

交叉验证 t 检验


当有两个模型 A 和 B,在使用 k 折交叉验证后,得到的测试错误率为 ϵ1A, ϵ2A,..., ϵkA\epsilon_1^A, \epsilon_2^A,..., \epsilon_k^A  和 ϵ1B, ϵ2B,..., ϵkB\epsilon_1^B, \epsilon_2^B,..., \epsilon_k^B ,可用 k 折交叉验证 “成对 t 检验” 来进行检验

令 Δi = ϵiA  ϵiB\Delta_i = \epsilon_i^A - \epsilon_i^B ,计算出 Δ\Delta  分布的均值 μ\mu  和方差 σ2\sigma^2 ,若变量 τt = kμσ\tau_t = |\frac{\sqrt{k}\mu}{\sigma}| 小于临界值,则假设:模型 A 和 B 的性能相同( μ0 = 0\mu_0 = 0 )  不能被拒绝

实际操作

通常情况下,不同轮次的交叉验证训练集会有一定程度的重叠,这就会让测试错误率并非对泛化错误率的“独立”采样(采样得到的不同测试错误率之间可能会因为训练集重叠程度不同导致采样结果不同),为了缓解这种问题,可以降低采样多轮 2 折交叉验证,每轮之前都打乱数据集,同时,只采样第一轮的差值作为 μ\mu ,然后对每一轮的实验结果都计算出其方差 σ2\sigma^2

McNemar 检验


对于二分类模型,有两个模型 A 和 B,在同一样本上进行测试,将它们的测试结果可以组合成一个

“列联表”(contingency table)

模型B / 模型A正确错误
正确e00e_{00} e01e_{01}
错误e10e_{10} e11e_{11}

假设模型 A 和模型 B 的性能相同,应该有 e01 = e10e_{01} = e_{10} (表示两个模型分类出现差异时正确程度都五五开,就像学霸和普通学生,只看都做对的题和都做错的题是看不出差距的,可能是题目本身原因,只有比较学霸做对的题,普通学生做错的题和普通学生做对的题,学霸做错的题的数量才能看得出差距),变量 e01e10|e_{01} - e_{10}|  应当符合正态分布

McNemar 检验考虑变量 τχ2 = (e01e101)2e01+e10\tau_{\chi^2} = \frac{(|e_{01} - e_{10}| - 1)^2}{e_{01} +e_{10}} ,服从自由度为 1 的 χ2\chi^2  分布,然后给定显著度 α\alpha ,当其小于临界值时,不能拒绝假设,即认为两个模型之间的性能没有显著差异

Friedman 检验和 Nemenyi 后续检验


上述检验方法是对单个数据集的两个算法的对比检验

实际中的数据集有多个,算法也有多个,基于算法排序的 Friedman 检验更为常用

将不同的数据集对不同的算法进行比较,最后得出比较出来的排序序号,绘制成表

如图

数据集算法 A算法 B算法 C
D1D_1 123
D2D_2 12.52.5
D3D_3 123
D4D_4 123
平均序号12.1252.875

然后假设所有算法的性能都是一样的,那么平均序号就应该一样

则在 N 个数据集上比较 k 个算法,令 rir_i  为第 i 个算法的平均序号,那么 rir_i  的均值和方差应该是 (k+1)2\frac{(k+1)}{2}  和 (k21)12N\frac{(k^2 - 1)}{12N} . 变量 τχ2 = k1k 12Nk21i=1k(rik+12)2\tau_{\chi^2} = \frac{k-1}{k} \frac{12N}{k^2 - 1}\sum_{i=1}^{k}(r_i - \frac{k + 1}{2})^2  符合自由度为 k - 1 的 χ2\chi^2  分布,不过通常使用的是下面的变量 τF\tau_F

τF = (N1)τχ2N(k1)τχ2\tau_F = \frac{(N - 1)\tau_{\chi^2}}{N(k-1)-\tau_{\chi^2}} ,服从自由度为 k - 1 和 (k-1)(N-1) 的 F 分布,最后对其检验即可

当“所有算法性能相同”这个假设被拒绝后,则需要进一步进行检验,常用的有 Nemenyi 检验

Nemenyi 检验首先需要计算出平均序号差别的临界值域

CD = qαk(k+1)6NCD = q_\alpha\sqrt{\frac{k(k+1)}{6N}} qαq_\alpha  是 Tukey 分布的临界值)

如果两个算法之间的序号差距超过了 CD,则可以用相应的置信度拒绝“两个算法性能相同”这一个假设

例子

对于上表格中出现的数据,计算它的 τF = 24.429\tau_F = 24.429 ,它大于 α = 0.05\alpha = 0.05  时的 5.143,因此拒接“所有算法性能相同”这一个假设,然后使用 Nemenyi 检验,算出 CD = 1.657CD = 1.657 ,表格中 A,B 和 B,C 算法之间的序号距离都小于这个距离,可以得出算法 A,B之间 和 B,C之间 的性能没有显著差别,而算法 A, C 之间超过了这个距离,则算法 A, C 之间有显著差异

偏差与方差

解释模型的性能

“偏差-方差分解”(bias-variance decomposition)是解释学习算法泛化能力的一种重要的工具

它试图将学习算法的期望泛化错误率进行分解

对于一个测试样本 xx , 令yDy_D 为 xx  在数据集上的标记, yy  为 xx  的真实标记, f(x;D)f(x; D)  为模型 ff  在训练集上的输出

有期望预测 fˉ(x) = ED[f(x;D)]\bar f(x) = \mathbb{E}_D[f(x; D)] ,在样本数相同的不同数据集上的方差为 var(x) = ED[(f(x;D)fˉ(x))2]var(x) = \mathbb{E}_D[(f(x; D) - \bar{f}(x))^2] ,噪声为 ε2 = ED[(yDy)2]\varepsilon^2 = \mathbb{E}_D[(y_D - y)^2] ,期望输出和真实标记的差别为偏差 (bias) bias2(x) = (fˉ(x)  y)2bias^2(x) = (\bar{f}(x) - y)^2

推导:

泛化误差 = 偏差 + 方差 + 噪声

  • 偏差刻画了模型的本事拟合能力
  • 方差刻画了训练集变动时对模型性能的影响
  • 噪声刻画了问题本身的难度

偏差-方差窘境 (bias-variance dilemma)

训练不足时,模型的拟合能力不够,偏差较大,占主导地位,此时训练数据的变动对模型影响较小

训练充足后,方差的主导性上升,模型容易受训练数据变化的影响,若训练数据自身的、非全局的特性被模型学习到了,则将会发生过拟合