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

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

 

误差的来源:偏差与方差

首先思考一个问题

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

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

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

 

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

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

 

假如我们希望建立一个 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. 误差分析

 

 

参考资料:

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