zoukankan      html  css  js  c++  java
  • 吴恩达读书笔记【1】-偏差与方差

    之前我写过一篇博客 偏差与方差,解释的还算清楚,

    但是读了吴恩达的书,又有些新的体会,这里稍作记录

    误差的来源:偏差与方差

    首先思考一个问题

    :如果数据独立同分布,尝试获取足够多的数据,就能提升模型的性能,对吗?

    :获取更多的数据是无害的,但是对于模型的提升,却不一定有很大帮助,有时候获取更多数据只是浪费时间;

    那何时才需要获取更多数据呢?

    我在之前的博客中已经讲到,误差分为 偏差和方差 两部分,本文重点是应用

    依据此概念来决定是否该添加数据,或者采用其他策略来提升模型的表现

    假如我们希望建立一个 5% 错误率的猫识别器,

    如果目前的模型在 训练集上错误率为 15%,在 测试集上错误率为 16%,

    在这种情况下,增加数据是无用的应该选择其他策略

    实际上,增加数据只会降低模型在训练集上的表现

    当前模型的重点是提高其在 训练集上的性能,在测试集上的性能往往会低于训练集,所以,如果训练集性能差,不要指望测试集性能好

    在这里我们用另一种方式来描述误差,在上例中,16% 就是误差,它分为两部分

    第一部分是算法在训练集上的错误率,上例中就是 15%,我们非正式地将其看作偏差

    第二部分是算法在测试集上的性能比训练集差多少,上例中就是 1%,我们非正式地将其看作方差

    在有些论文中,我们看到这样的描述:偏差是针对训练集的,方差是针对测试集的,就是一种非正式地理解

    模型性能分析

    理解偏差与方差,能够让我们分析模型的瓶颈在偏差还是方差,从而选择合适的策略来提升模型的性能

    举例说明

    还以猫识别器为例,一个理想的分类器,比如人类,可以得到近乎完美的表现

    如果我们的模型表现如下

    训练集错误率 3%
    测试集错误率 15%

    模型的误差为 15%,它由偏差 3% 和方差 12% 构成,这是一个高方差的模型,重点是降低方差

    训练集上错误率较低,但是没能很好的泛化在测试集上,这叫 过拟合

    如果我们的模型表现如下

    训练集错误率 15%
    测试集错误率 16%

    模型的误差为 16%,它由偏差 15% 和方差 1% 构成,这是一个高偏差的模型,重点是降低偏差

    训练集上错误率很高,而且测试集上的表现不比训练集上差很多,这叫 欠拟合

    那么思考这种情况

    训练集错误率 15%
    测试集错误率 30%

    偏差和方差都是 15%,都很高,这是什么情况,又如何优化?我们姑且称为 同时过拟合欠拟合

    很差的模型

    如果表现如下

    训练集错误率 1%
    测试集错误率 2%

    恭喜,模型很好

    最优错误率

    考虑如下两个场景:

    我们构建了一个猫识别器,表现如下

    训练集错误率 5%
    测试集错误率 8%

    我们构建了一个推荐系统,表现如下

    训练集错误率 15%
    测试集错误率 18%

    那我们是否能说,第一个模型比第二个模型好呢?不能

    猫识别器,一个理想的模型,比如人类,可以做到近乎 100% 的准确率,而该模型错误率高达 8%,应该是个很差的模型;

    推荐系统,即使是人类,也很难做出精准的推荐,该模型错误率仅为 18%,是个不错的模型;

    鉴于此,我们提出了最优错误率的概念,也叫贝叶斯错误率,通俗的理解就是一个完美模型所能达到的上限;

    比如在 图像 领域,准确率都是 99%左右,而 业务分析领域,很难到达这么高的水准,但依然是个很好的模型;

    最优错误率把误差进一步细分为 三个部分

    第一部分是不可避免偏差,我们也可以把这部分偏差叫最优错误率,也就是模型的最高表现能力,由于某些原因,它可能比较大;

      // 以上面推荐系统为例,假设 最优错误率 为 14%

    第二部分是可避免偏差,即模型可以优化的部分,训练错误率与最优错误率之差;

      // 可避免偏差为 15% - 14% = 1%,此时,模型的偏差已没多少优化空间

    第三部分为方差,与之前定义相同

    从理论上讲,拥有一个超大规模的数据集可以将模型的方差减少到 0,所以 方差没有不可避免之说

    了解最优错误率可以帮助我们更好的分析模型,但是某些场景下最优错误率不太好捕捉

    偏差与方差的权衡 

    在之前的博客中讲到,方差与偏差的权衡,这里不再赘述,只说一点

    如果选择了合适的模型,可以同时减少 偏差和方差,只是这种模型不好选择

    偏差与方差的处理

    解决偏差和方差最简单的方法:

    • 偏差过大,可通过增加模型的复杂度,如神经网络,增加层数,每层节点数等
    • 方差过大,增加数据集

    增加复杂度需要注意

    1. 不能无限的增加模型复杂度,一是因为训练时间太长,二是因为需要的训练样本太多,而事实上可能没有那么多样本

    2. 增加复杂度可能造成方差增加,甚至过拟合,

      // 然而这种过拟合只在你不使用正则化技术时出现,如果有一个精心设计的正则化方法,则可以尽情增加复杂度,不必担心过拟合;

      // 比如深度学习使用了 L2 正则和 dropout 技术,并且得到了在测试集上表现很好的正则化参数,那么增加模型复杂度,即使不会明显提升,也不会明显的降低模型性能,

    此外,还需注意

    1. 正则化是增加偏差的技术,目的是减小方差

    2. 不同的模型对于同样的数据可能有不同的偏差和方差,所以,更换模型的效果难以预测

    减少偏差的技术归纳

    偏差大,直观上可以理解为模型太简单,这样便于想到解决方案

    减小偏差,就可能增加方差,所以最好加入正则化

    1. 增加模型规模

    2. 增加特征:特征越多,模型越复杂

    3. 减少正则化

    4. 更换模型或者修改模型:比较难

    增加数据集并不能减少偏差,相反很可能使得模型在训练集上的表现更差;

    训练集上表现差,不要幻想测试集表现好;

    还有一种比较通用的方法,叫误差分析,简单理解就是把模型分错的样本拿出来,看看这些样本有什么共性,针对性的进行解决

    减少方差的技术归纳

    方差很大,直观上可以理解为过拟合,模型太复杂,这样便于想到解决方案

    1. 增加数据集

    2. 加入正则化

    3. 加入提前终止策略,如 early stopping,根据测试集或者验证集的表现,提前终止迭代

    4. 减少特征

    5. 修改模型或者更换模型

    6. 误差分析

    参考资料:

    吴恩达:完整翻译版《机器学习要领》

  • 相关阅读:
    设定cookie 获取cookie数据的转换
    cookie cookie的获取
    常见的请求方式 json字符串
    请求报文和响应报文
    http协议
    php分页查询 子查询
    MAC 地址为什么不需要全球唯一
    ceph分布式存储简介
    一文看懂为什么边缘计算是大势所趋
    真香!Windows 可直接运行 Linux 了
  • 原文地址:https://www.cnblogs.com/yanshw/p/12112243.html
Copyright © 2011-2022 走看看