吴恩达机器学习(六)模型选择与评估,误差分析与优化

  :  + \color{#f00}{***\ 点击查看\ :吴恩达机器学习 \ —— \ 整套笔记+编程作业详解\ ***}
注:本章没有枯燥的算法讲解,主要讲的是在机器学习实践过程中的一些应用建议。

概述

前5周我们学习了线性回归,逻辑回归,神经网络来训练数据得到预测模型。但是如何评价预测模型的优劣,如何对预测模型进行误差分析以及如何改进,这是实际应用中所关注的。

本周,将要针对模型的评估,优化改进进行学习,旨在对模型进行进一步完善做出明确的指导。

1. 模型选择与评估——训练集,验证集,测试集

以往的做法是:用训练集进行训练得到最终参数,并还是用训练集计算模型的准确率。
该做法的问题:易产生过拟合,将模型推广到新的数据集上效果并不好。

改进的做法:将数据集分为训练集和测试集,训练集用于训练得到最优参数,测试机用于评估模型准确率。
提出新问题:假如我们还未确定训练模型,需要在以下多项式模型中选择最优的模型进行训练,用哪部分数据进行训练得到最优模型呢?

在这里插入图片描述

进一步改进为:在数据集中再抽出一部分来作为交叉验证集用于上述模型选择。

我们可以把数据集分为三个部分:训练集(Training Set)、交叉验证集(Cross Validation Set)、测试集(Test Set)。这三者的分配比例可以是:60%,20%,20%。(注意:分配数据前需要将数据打乱)

这三部分的误差计算公式如下:
在这里插入图片描述
需要注意的是,当计算训练集、交叉验证集和测试集误差时,不计算正则项。

可以大致理解训练模型的步骤:

  • Step 1:用训练集训练各种模型,线性的,多项式的,有正则化的,无正则化的,追求训练误差的最小化。
  • Step 2:用验证集去计算训练出来的模型的验证误差,并选出表现最好的一个作为最终模型。
  • Step 3:用测试集,评估最终模型的表现优劣。

2. 误差分析

2.1 偏差与方差

评价模型,一般评价其偏差和方差:

  • 偏差(Bias) 反映了模型无法正确的描述数据规律,导致预测误差很大(欠拟合 Underfitting)
  • 方差(Variance )反映了模型对训练数据过度敏感,导致了其泛化能力很差(过拟合 Overfitting)

在这里插入图片描述

  • 以多项式回归为例,训练集的误差 Jtrain(θ)J_{train}(θ) 以及交叉验证集的误差 Jcv(θ)J_{cv}(θ) 随多项式次数 dd 的变化曲线如下图:
    在这里插入图片描述曲线左边 多项式的次数过小欠拟合,导致无论在训练集还是交叉验证集上拟合效果都不好,即 高偏差
    曲线右边 多项式的次数太大过拟合,虽然在训练集上拟合得很好,但在交叉验证集上的误差则很大,即 高方差

  • 同理,我们也可以得到正则化系数 λ\lambda 的大小与 Jtrain(θ)J_{train}(θ)Jcv(θ)J_{cv}(θ)的关系:

在这里插入图片描述

2.3 学习曲线

学习曲线是训练集的误差 Jtrain(θ)J_{train}(θ) 与交叉验证集的误差 Jcv(θ)J_{cv}(θ)关于训练集样本数量mm的函数图像。

  • 低偏差、低方差下的学习曲线:
    在这里插入图片描述
  • 对于训练误差 Jtrain(θ)J_{train}(θ) :当只有几个数据训练算法时(例如1、2、3),很容易就可以得到零误差,因为我们总能找到一条二次曲线与它们完美拟合。但是随着数据的增加,二次曲线的误差就会越大,经过一定的 mm值以后,误差就会趋于稳定。
  • 对于交叉验证误差 Jcv(θ)J_{cv}(θ):当训练集大小 mm 很小时,拟合出的假设函数泛化到新样本的能力很差,交叉验证误差就很大,随着训练集不断增大,可能会拟合出更好的假设函数,泛化到新样本的能力增强,交叉验证误差会逐渐减小。
  • 高偏差:
    +
    结论:当 Jtrain(θ)J_{train}(θ)Jcv(θ)J_{cv}(θ) 都很大时,属于高偏差(欠拟合)问题,此iu时 增加训练数据是没有用的
  • 对于训练误差 Jtrain(θ)J_{train}(θ)
    • 当训练集 mm 很小时,拟合出的直线对于每个样本的拟合效果不算差,因此训练误差 Jtrain(θ)J_{train}(θ) 也较小;
    • 随着训练集不断增大,直线对训练样本的拟合能力就差了很多,因此训练误差 Jtrain(θ)J_{train}(θ) 续增大直到接近交叉验证误差;
    • mm 大到一定值之后,对于训练样本的拟合就没那么准确了,故训练误差 Jtrain(θ)J_{train}(θ) 会持续增大直到接近交叉验证误差 Jcv(θ)J_{cv}(θ)
  • 对于交叉验证误差 Jcv(θ)J_{cv}(θ)
    • 当训练集集 mm 很小时,拟合出的直线泛化到新样本的能力很差,交叉验证误差 Jcv(θ)J_{cv}(θ) 很大;
    • 随着训练集不断增大,训练出的直线更好的适应训练集,泛化到新样本的能力略有增强,交叉验证误差 Jcv(θ)J_{cv}(θ) 稍有减小
    • mm 大到一定值之后,训练出的还是一条差不多的直线,交叉验证误差 Jcv(θ)J_{cv}(θ) 将不再变化并接近水平。
  • 高方差:
    在这里插入图片描述
    结论:高方差(过拟合)时,增加训练数据可能会有用,因为随着训练数据增多 Jcv(θ)J_{cv}(θ)Jtrain(θ)J_{train}(θ) 越来越接近。
  • 当训练集大小 mm很小时,因为存在过拟合,训练误差 Jtrain(θ)J_{train}(θ) 会非常小,同时过拟合的存在使假设函数泛化到新样本的能力不足,交叉验证误差 Jcv(θ)J_{cv}(θ) 很大 ;
  • 随着训练集不断增大,想要完美拟合所有训练数据变得没那么容易,训练误差 Jtrain(θ)J_{train}(θ) 会稍微增大,但因为 hθ(x)hθ(x) 的阶次很高,仍然存在过拟合,总体来说 Jtrain(θ)J_{train}(θ) 还是很小的。训练集增大让交叉验证误差 Jcv(θ)J_{cv}(θ) 有减小的趋势,但因为过拟合依然存在,故 Jcv(θ)J_{cv}(θ) 只是稍微减小,仍然较大, Jcv(θ)J_{cv}(θ)Jtrain(θ)J_{train}(θ) 间还是有很大差距。

总而言之,学习曲线能让我们发现是否存在高方差/高偏差问题,以及采取某些手段(如:增加训练样本数)是否有意义,避免我们在调试学习算法时浪费时间。

2.3 总结方法

  1. 获得更多的训练样本——解决高方差
  2. 尝试减少特征的数量——解决高方差
  3. 尝试获得更多的特征——解决高偏差
  4. 尝试增加多项式特征——解决高偏差
  5. 尝试减少正则化程度 λλ——解决高偏差
  6. 尝试增加正则化程度 λλ——解决高方差

3. 类偏斜的误差度量

(Error Metrics for Skewed Classes)

以我们之前提到的肿瘤恶性与良性检测问题为例。患有癌症为 1,没有患癌症为 0。假如我们在测试集上进行测试,结果只有 1% 的误分类率,看起来结果好像不错,但如果测试集中真正患有癌症的病人只有 0.50%,这个结果就不太理想了。

这个例子中,正样本的数量远远大于负样本,这种情况我们称之为偏斜类(Skewed Class)。对于这种情况,原来的误分类率不能再作为算法好坏的度量标准。所以我们需要另一种的评估方法,叫做 查准率(Precision)和召回率(Recall)(或称 查全率)

在这里插入图片描述
在这里插入图片描述
查准率和召回率越高,算法性能越好。

仍然以肿瘤良性与恶性为例。之前我们的预测结果如下:

在这里插入图片描述

  • 如果我们希望在更确定的情况下再判断患者得了癌症,因为这是一个坏消息,误诊可能造成患者的恐慌。这样的话,我们可以把临界值 0.5 改为 0.7,这样就可以得到较高的查准率,但召回率相对会降低。

  • 如果我们希望保证癌症患者及时得到医治,不放过任何一个可能病例,我们需要把临界值降低,比如改为 0.3。这样会得到较高的召回率,但查准率相对会降低。

那么我们可不可以自动选取临界值呢?

如下面几个算法(可能算法相同,临界值不同),我们如何判断哪个更好?

在这里插入图片描述
可能会有人想到求平均值 Average=P+R2Average=\frac{P+R}{2},看哪个更高。但显然这并不是一个很好的解决办法。因为按平均值来看,算法3是最高的,但这不是我们希望的。

一般来说,我们用 F1Score=2PRP+RF_1Score=2\frac{PR}{P+R} 值来评估(调和平均数):

在这里插入图片描述

参考:机器学习笔记week6

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章