Model Selection and Evaluation: Machine Learning Basics
本文最后更新于:1 年前
Overfitting
我们将模型输出与真实值之间的差异称为误差,如对于分类问题,我们可以使用模型分类错误的样本数量占总样本数的比例。模型在训练集(我们收集到的数据)上的误差称作是训练误差 (training error),而在新样本(这里指的是新的样本而不是测试集,训练集测试集是从我们收集到的数据上人为划分出来的)上的误差称作是泛化误差 (generalization error)。对于机器学习算法,我们希望算法能学到数据背后的普遍规律,所以我们总是希望模型的泛化误差越小越好。
不过测试集对训练过程来说是未知的,所以模型只能尽量从训练集中发掘数据的普遍规律,要是模型把训练集学得”太好“了,很可能把训练集中不属于普遍规律的部分特点作为了一般性质,这就会导致泛化性能下降,我们称这种情况为过拟合 (overfitting)。反之,模型对训练集的特性学得不够,就会出现欠拟合 (underfitting)。关于过拟合和欠拟合,周志华老师的《机器学习》中有一张很好的图:

一般来说,欠拟合比较容易克服,可以通过增加模型的复杂度来实现。而过拟合则比较难解决,一般而言可以通过增加数据量、加正则化约束来改善。
Model Selection
对于一个机器学习任务,一般我们有多种模型供我们选择,并且模型也有不同的超参数,我们希望得到泛化性能尽可能高的模型。不过根据前面的讨论,新样本是未知的,所以没法直接得到泛化误差,而过拟合的存在使得我们不能贸然的根据模型在我们收集到的数据上的表现来选择模型(训练误差低不代表泛化误差低)。
我们假设无论是我们收集到的数据还是新样本都是从数据的真实分布中独立同分布采样得来,为此我们可以从数据中划分出一部分”测试集“,然后将模型在测试集上的表现作为泛化误差的近似,而剩下的部分用来模型训练。
那么如何划分训练集和测试集呢?比较常见的方法是”\(k\)折交叉验证法“ (\(k\)-fold cross validation),一般\(k\)常取\(10\),其基本思想如下图所示:

\(k\)折交叉验证法首先将数据集均匀地划分为\(k\)个部分,然后进行\(k\)个循环,在每个循环中将第\(k\)份作为测试集,其余的作为训练集,最后得到的结果进行平均。
Evaluation Metrics
前面我们讨论了评测的框架,但是没有说具体的评测指标。实际上评测指标要根据任务来确定,并且不同的评测指标也有自己的特点。
Regression
回归任务比较常用的评测标准是均方误差 (Mean Squared Error): \[ \text{MSE}(f;D)=\frac{1}{m}\sum_{i=1}^m (f(x_i)-y_i)^2 \] 和平均绝对误差 (Mean Absolute Error): \[ \text{MAE}(f;D)=\frac{1}{m}\sum_{i=1}^m |f(x_i)-y_i| \]
Classification
Binary Classification
对于分类任务,最简单的想法是使用模型分类正确的比例来作为评测标准,我们称之为准确率 (Accuracy): \[ \text{ACC}(f;D)=\frac{1}{m}\sum_{i=1}^m \mathbb{I}(f(x_i)=y_i) \] 但准确率并不能满足我们的所有要求,比如说对于新冠病毒的分类任务,我们可能会更关注于对于所有患有新冠的病人,模型到底查出来了多少,而对于模型误把正常病人当作是患病的情况没有那么关注。对于二分类问题,我们可以将样例根据其真实类别与模型预测的类别划分为真正例 (true positive, TP)、假正例 (false positive, FP)、真反例 (true negative, TN) 和假反例 (false negative, FN) 四种,形成混淆矩阵 (Confusion Matrix):

下面给一个具体的例子:

比如我们的任务是预测一张手写数字图片是不是\(5\),根据上图,右下角就是我们正确预测的是\(5\)的图片,左下角就是本来是\(5\),但被预测成不是\(5\)的图片;左上角是本来不是\(5\),我们也正确地预测出其不是\(5\)的,右上角是本来不是\(5\)却被预测成是\(5\)的。是不是有点被绕晕了😀,只要记住T和F代表的是预测结果对还是不对,P和N代表的是模型预测当前样本是正例还是负例。
基于混淆矩阵,我们可以定义查准率 (Precision) 和查全率 (Recall) 这两个评测标准。
查准率,顾名思义,对于检测出来的正例,有多少是真正的正例,即查的准不准,公式为: \[ \text{Precision}=\frac{TP}{TP+FP} \] 分母就是模型预测为正例的样本总数。
查全率,就对应刚才举的新冠的例子,我们比较在乎对于数据集中的正例,有多少被查出来了,公式为: \[ \text{Recall} = \frac{TP}{TP+FN} \] 分母就是真实类别为正例的样本总数。一般来说,查准率和查全率是相互矛盾的,除非是特别简单的任务,很难兼顾查准率和查全率。
F1分数 (F1 Score) 综合了查准率和查全率: \[ \text{F}1=\frac{2\cdot\text{Precision}\cdot\text{Recall}}{\text{Precision}+\text{Recall}} \] 查准率和查全率中任意一项较低都会导致F1分数较低。有时候我们对待查准率和查全率的权重不同,这时候可以使用F\(_\beta\)分数: \[ \text{F}_\beta=\frac{(1+\beta^2)\cdot \text{Precision}\cdot\text{Recall}}{(\beta^2\cdot\text{Precision})+\text{Recall}} \] \(\beta=1\)时等价于F1分数,\(\beta>1\)代表偏重查全率,\(\beta<1\)代表偏重查准率。
Multi-classification
前面的讨论都是基于二分类任务,如果是多分类任务的话, 对于每一类,我们将该类作为正例,其他类别作为负例,都能得到一个混淆矩阵。如果我们在每个混淆矩阵上计算评测指标,然后进行平均,这样就得到宏查准率 (macro-Precision)、宏查全率 (macro-Recall) 和宏F1分数 (macro-F1)。如果我们事先将混淆矩阵的TP、FP、TN、FN先进行平均,再计算评测指标,就得到了微查准率 (micro-Precision)、微查全率 (micro-Recall) 和微F1分数 (micro-F1)。
PR-Curve
很多情况下模型的输出是样本为正例的“概率值”或者是分数,分数越高的样本代表越可能是正例。这种时候需要人为划定阈值,规定高于阈值的样本是正例。不过阈值的划分相当于超参数的选取,同时我们会认为一个鲁棒的模型的性能应该不受阈值选取的左右。这个时候我们可以使用PR曲线 (Precision-Recall Curve),即遍历所有可能的阈值,对于每个阈值,计算其对应的Precision和Recall,然后画在图上,最后会得到一系列离散的点(理论上应该是连续曲线,不过阈值是连续值,我们只能取离散值),形成PR-曲线。

模型性能越好,曲线就会越接近右上角的点,我们可以把PR曲线的曲线下面积 (PR-AUC) 作为评测标准。
ROC-Curve
ROC全称是受试者工作特征 (Receiver Operating Characteristic) 曲线, 和PR曲线类似,ROC曲线也是遍历不同的阈值计算点,不过ROC曲线计算的是真正例率 (True Positive Rate, TPR) 和假正例率 (False Positive Rate, FPR),两者定义分别是: \[ \begin{align} \text{TPR}=\frac{TP}{TP+FN}\\ \text{FPR}=\frac{FP}{TN+FP} \end{align} \] 其中TPR就是查全率,而FPR是所有负例中没有检测出来的比例,这一项是越低越好。

模型性能越好,曲线就会越接近左上角的点,我们可以把ROC曲线的曲线下面积 (ROC-AUC) 作为评测标准。
下面来总结一下PR曲线和ROC曲线之间的优缺点。
| 纵轴 | 横轴 | |
|---|---|---|
| PR | \(\text{Precision}=\frac{TP}{TP+FP}\) | \(\text{Recall} = \frac{TP}{TP+FN}\) |
| ROC | \(\text{TPR}=\frac{TP}{TP+FN}\) | \(\text{FPR}=\frac{FP}{TN+FP}\) |

ROC的优点:
- 相比PR仅关注正例,ROC同时关注正例和负例
- 相比PR不易受到正负例相对数量的影响,ROC的两个指标的计算都只涉及到P、N中的一列,正例或负例增加对总体影响不大。而PR曲线就不一样,两个指标的计算都涉及到了P、N两列,那么正例或负例样本数量的变化会造成较大影响。如负例突然增大,那么FP也会增大,这样Precision会降低,而Recall却不变。
ROC的缺点:
- 对于类别不平衡问题,存在大量负例,这样会带来大量的FP,而ROC的FPR却不会因为FP的大幅增长而剧烈改变,结果是这一类错误很难在ROC曲线中体现出来。所以ROC会呈现出一个过于乐观的评价。
我们来尝试下是否如此,下面是用随机森林分类器,测试样本正负例数量比为1:1的情况下的ROC曲线和PR曲线:


在我们将正负例数量比调整为1:9之后(总数量相同),可以看到ROC曲线比较稳定,没出现较大变化,而PR曲线则出现了剧烈变化:


Bias and Variance
在机器学习中,偏差-方差分解是解释学习算法泛化性能的重要工具。假设我们要预测某一个地区的房子的房价,每一套房子都是一个样本,我们认为每个样本都是从总体分布\(P(X)\)独立同分布采样得来的。不过我们不可能得到所有的样本,我们采样得到的训练集只是其中一个子集。那么,即使对于同样的测试样本,使用不同的训练集(训练集大小相同)训练出来的模型对测试样本的预测也是不一样的,我们将这一部分模型自身的不稳定性用方差 (Variance) 来描述:\(\text{Var}(X)=E_D\left[(\hat f(X)-E[\hat f(X)])^2\right]\),方差越小代表模型稳定性越强。模型输出的期望与真实值之间的差距我们用偏差 (Bias) 来描述:\(\text{Bias}(X)=E[\hat f(X)]-f(X)\)。
泛化误差与方差、偏差有下列关系: \[ \begin{align} \text{Err}(X)&=E\left[(y-\hat f(X))^2\right]\\ &=E\left[(f(X)+\varepsilon-\hat f(X))^2\right]\\ &= (E[\hat f(X)]-f(X))^2 + E\left[(\hat f(X)-E[\hat f(X)])^2\right]+\sigma_{\varepsilon}^2\\ &=\text{Bias}^2 + \text{Variance} + \text{Random Error} \end{align} \] 也就是说泛化误差可以分解为方差、偏差和随机噪声之和。偏差刻画了模型的期望预测与真实值之间的偏离程度,方差刻画了不同训练集对模型性能的影响,他们之间的关系如下图所示:

图中左上角的部分是比较理想的情况,即方差和偏差都较小。但实际上方差和偏差往往是相互冲突的,如下图所示:

模型复杂度不足的时候,模型的拟合能力不够强,偏差主导了泛化误差,而随着模型复杂度的提高,模型的拟合能力逐渐提高,训练数据的扰动会造成模型发生显著变化,这时方差逐渐主导了泛化误差。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!