之前我写过一篇博客 偏差与方差 https://www.cnblogs.com/yanshw/p/10684929.html , 解释的还算清楚,
但是读了吴恩达的书, 又有些新的体会, 这里稍作记录
首先思考一个问题
问: 如果数据独立同分布, 尝试获取足够多的数据, 就能提升模型的性能, 对吗?
答: 获取更多的数据是无害的, 但是对于模型的提升, 却不一定有很大帮助, 有时候获取更多数据只是浪费时间;
那何时才需要获取更多数据呢?
我在之前的博客中已经讲到, 误差分为 偏差和方差 两部分, 本文重点是应用,
依据此概念来决定是否该添加数据, 或者采用其他策略来提升模型的表现
假如我们希望建立一个 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. 误差分析
参考资料:
吴恩达: 完整翻译版《机器学习要领》
来源: http://www.bubuko.com/infodetail-3357640.html