模型评价

模型评估

过拟合(Overfitting)

在应用已经学过的算法时,可能会遇到过拟合的问题,致使泛化误差(generalization error)很大。如果我们有非常多的特征,我们通过学习得到的假设又“太过优秀”,能够非常好地适应训练集(代价函数可能几乎为0),但是假设很有可能已经把训练样本本身的特点当作所有潜在样本都有的性质,导致泛化的性能太差。

下图是一个回归问题的例子:

第一个模型是一个线性模型,不能很好地适应我们的训练集,我们称它为欠拟合(underfitting);第三个模型是一个四次方的模型,过于强调拟合原始数据,而丢失了预测新数据的本质,若给出一个新的值使之预测,它将表现的很差,我们称它为过拟合;而中间的模型似乎最合适。

如果发现了过拟合,应该如何处理?

  • 丢弃一些不能帮助我们正确预测的特征。可以手工选择保留哪些特征,或者使用一些模型选择的算法来帮忙(例如PCA)
  • 正则化。 保留所有的特征,但是减少参数的大小(magnitude)。

训练集&测试集&交叉验证集

为了检验算法是否过拟合,可以将数据分成训练集测试集,通常用70%的数据作为训练集,用剩下30%的数据作为测试集。很重要的一点是训练集和测试集均要含有各种类型的数据,通常我们要对数据随机打乱,然后再分成训练集和测试集。

在通过训练集让建立好的机器学习模型学习得出其参数$\theta$后,再对测试集运用该模型,我们有两种方式计算误差:

  • 对于线性回归模型,我们利用测试集数据计算代价函数$J_{test}(\theta)$

  • 对于逻辑回归模型,我们除了可以利用测试数据集来计算代价函数外,还可以通过误分类的比率来确定:

    然后再对所有的误差求和再平均即可。

交叉验证集(Cross Validation Set)用来在不同的模型中间来做出选择。假设我们要在10个不同次数的二项式模型之间进行选择:

显然高次数的多项式模型能够适应我们的训练数据集,但是次数过更高的模型会出现过拟合。我们可以用误差来挑选模型,但是适应训练数据集并不代表着能推广至一般情况,应该选择一个更能适应一般情况的模型。这样我们需要使用交叉验证集来帮助选择模型。使用$60\%$的数据作为训练集,使用$20\%$的数据作为交叉验证集,使用$20\%$的数据作为测试集。

模型选择的方法为:

  • 使用训练集训练出10个模型

  • 用10个模型分别对交叉验证集计算得出交叉验证误差$J_{cv}(\theta)$

  • 选取代价函数值最小的模型

  • 用选出的模型对测试集计算得出推广误差$J_{test}(\theta)$

诊断偏差和方差(Diagnosing Bias & Variance)

我们通常会通过将训练集和交叉验证集的代价函数误差与多项式的次数绘制在同一张图表上来帮助分析:

对于训练集,当多项式维度$d$较小时,模型拟合程度更低,误差较大;随着$d$的增长,拟合程度提高,误差减小;

对于交叉验证集,当$d$较小时,模型拟合程度低,误差较大;但是随着$d$的增长,误差呈现先减小后增大的趋势,转折点是我们的模型开始过拟合训练数据集的时候。

当训练集误差$J{train}(\theta)$过高,且交叉验证集与训练集误差相近($J{cv}(\theta) \approx J_{train}(\theta)$)时,出现偏差(bias)/欠拟合;

当训练集误差$J{train}(\theta)$过小,且交叉验证集远远大于训练集($J{cv}(\theta) \gg J_{train}(\theta)$)时,出现方差(variance)/过拟合。

正则化(Regularization)

正则化是处理过拟合的一种方式。例如上面的回归问题中,如果我们的模型是$h_\theta(x) = \theta_0+\theta_1x+\theta_1x^2+\theta_2x^3+\theta_3x^4$,则可以看出:正是那些高次项导致了过拟合的产生,所以如果我们能让这些高次项的系数接近于0的话,我们就能避免过拟合的产生。

正则化的基本方法,就是尽量减小诸如$\theta_3,\theta_4$这些参数。如果决定要减少$\theta_3,\theta_4$的大小,我们要做的便是修改代价函数,加入一些类似线性规划人工变量法的“罚因子”($-M$),在最小化时得出较小的$\theta_3,\theta_4$。

有几种正则化的方式,我会单独写一篇介绍,以最常见的岭回归为例,修改后的代价函数如下:

假如我们有非常多的特征,并不知道其中哪些特征需要惩罚,那么我们将对所有的特征进行惩罚,并且让代价函数最优化的软件来选择这些惩罚的程度,这样的结果是得到了一个较为简单的能防止过拟合问题的假设 :

其中$\lambda$称为正则化参数(Regularization Parameter);根据惯例,我们不对$\theta_0$进行惩罚。

正则化的线性回归

对于线性回归的求解,我们之前推导了两种学习算法:一种基于梯度下降,一种基于正规方程。

梯度下降

因为不对$\theta_0$进行正则化,所以梯度下降法分两种情形:

正则化线性回归的梯度下降算法时,每次都在原有算法更新规则的基础上令$\theta_j$值减少了一个额外的$\frac{\alpha\lambda}{m}$。

正规方程

也可以利用正规方程来求解正则化线性回归模型,如下所示:

正则化的偏差与方差

在训练模型的过程中会使用一些正则化方法来防止过拟合。但是在选择$\lambda$的值时,可能会导致正则化的程度太高或太小了,以至于出现方差或者偏差现象。

我们选择一系列的想要测试的$\lambda$值,通常是0-10之间的呈现2倍关系的值(如:$0,0.01,0.02,0.04,0.08,0.16,0.32,0.64,1.28,2.56,5.12,10$共12个)。我们同样把数据分为训练集、交叉验证集和测试集。

选择$\lambda$的方法为:

  • 使用训练集训练出12个不同程度正则化的模型
  • 用12个模型分别对交叉验证集计算的出交叉验证误差
  • 选择得出交叉验证误差最小的模型
  • 运用步骤3中选出模型对测试集计算得出推广误差

我们也可以同时将训练集和交叉验证集模型的代价函数误差与$\lambda$的值绘制在一张图表上:

  • 当$\lambda$较小时,训练集误差较小(过拟合)而交叉验证集误差较大
  • 随着$\lambda$的增加,训练集误差不断增加(欠拟合),而交叉验证集误差则是先减小后增加

学习曲线

学习曲线是将训练集误差和交叉验证集误差作为训练集实例数量$(m)$的函数绘制的图表。学习曲线不仅可以判断某个学习算法是否处于偏差、方差问题的一种很好的工具,也是学习算法的一个很好的合理检验(sanity check)。

如果我们有100行数据,我们从1行数据开始,逐渐向学习模型注入更多行的数据。当训练较少数据时,训练的模型将能够很好的适应这些数据,但是训练出来的模型却不能很好地适应交叉验证集数据或测试集数据。

上图是一个高偏差/欠拟合的例子:可以看出,无论训练集有多么大误差都不会有太大改观,因为模型本来就不够好,增加训练集的规模不会有太大帮助;

下图是一个高方差/过拟合的例子:假设我们使用一个非常高次的多项式模型,并且正则化系数$\lambda$非常小,当交叉验证集误差远大于训练集误差时,往训练集增加更多数据可以提高模型的效果。

误差诊断

在经过对高偏差和高方差的分析就可以对机器学习模型进行评估与诊断,并决定下一步做什么:

高方差 高偏差
获得更多的训练实例 尝试获得更多的特征
尝试减少特征的数量 尝试增加多项式特征
尝试增加正则化程度$\lambda$ 尝试减少正则化程度$\lambda$

构建一个学习算法的推荐方法为:

  • 从一个简单的能快速实现的算法开始,实现该算法并用交叉验证集数据测试这个算法;
  • 绘制学习曲线,决定是增加更多数据,或者添加更多特征,还是其他选择;
  • 进行误差分析,人工检查交叉验证集中我们算法中产生预测误差的实例,看看这些实例是否有某种系统化的趋势。 但误差分析并不总能帮助我们判断应该采取怎样的行动,有时我们需要尝试不同的模型,然后进行比较,在模型比较时,用数值(比如交叉验证集误差)来判断哪一个模型更好更有效。

误差分析

偏斜类的误差度量

使用一个合适的误差度量值,这有时会对于你的学习算法造成非常微妙的影响,这件重要的事情就是偏斜类(skewed classes)的问题。类偏斜情况表现为我们的训练集中有非常多的同一种类的实例,只有很少或没有其他类的实例。

例如我们希望用算法来预测一个人能否考入东北农业大学管理科学与工程专业研究生,在我们的训练集中,只有0.5%的实例才能考上。假设我们编写一个“聪明”的算法,在所有情况下总是预测没人考得上,那么误差只有0.5%。然而我们费半天劲通过训练而得到的(比如神经网络)算法却有1%的误差。看起来“瞎猜”的模型结果更准确,当然这是荒谬的。这时,误差的大小是不能视为评判算法效果的依据的。

我们引入查准率(Precision)和查全率(Recall)来度量这类问题的误差,将算法预测的结果分成四种情况:

  • 正确肯定(True Positive,TP):预测为真,实际为真;
  • 正确否定(True Negative,TN):预测为假,实际为假;
  • 错误肯定(False Positive,FP):预测为真,实际为假;
  • 错误否定(False Negative,FN):预测为假,实际为真;

我们将上面的四种情况,综合起来绘制成的表格称作混淆矩阵(confusion matrix):

Predicted Positive(1) Predicted Negative(0)
Actual Positive(1) TP FN
Actual Negative(0) FP TN

则查准率和查全率为:

对于上面的例子来说:在所有预测的能录取NEAU的人中,实际上能被录取的百分比就是查准率,越高越好;在所有实际上被NEAU录取的人中,成功预测处的能被录取的人的百分比,越高越好。

查准率和查全率的权衡

还是以上面的例子为例:有一个分类器$h\theta(x)$,当$h\theta(x)\geq 0.5$时,预测为$1$;当$h_\theta(x)\leq 0.5$时,预测为$0$。

如果希望只在非常确信的情况下预测为真(可以被录取),即我们希望更高的查准率,我们可以使用比0.5更大的阀值,如0.7,0.9。这样做我们会减少错误预测可以被录取的情况,同时却会增加未能成功预测可以被录取的情况;如果我们希望提高查全率,也就是说尽可能的把所有能考上的学生都筛选出来,不想错失人才,我们可以使用比0.5更小的阀值,比如0.3。

当然,查准率和查全率不是都可以兼得的,总体来说查准率和查全率成负相关,有一个可以帮助我们选择阀值的方法是F1值,其计算公式为: