一. 误差error的来源

两个重要因素:bias(偏差)与variance(方差)

error取决于两件事

  • 离靶心的偏移位置,f^-f-的距离为看成bias(点距中心的远近)
  • f*与f-的距离,看成是variance(点的分散程度)
    如下图可见bias与variance的区别:

在这里插入图片描述
完美函数:f^是一个最佳的function
估测函数:从训练数据中,我们可以发现一个估测的f*

1.bias偏差分析

在这里插入图片描述

模型在拟合数据时,越简单的模型,受到特殊的取样数据点的影响越小,所以方差越小。
一般来说:

  • 简单模型:有大的bias,小的variance(瞄得会不准)
  • 复杂模型:有小的bias,大的variance(瞄得会越来越准,但error会越来越大)

2.variance方差分析

首先分布情况有model复杂程度决定,越简单的model(图中左侧),分布越集中,越复杂的model(图中右侧),分布则越分散。
在这里插入图片描述

3.bias vs variance

在这里插入图片描述
3.1上图中,随着model的不断复杂:

  • bias逐渐减小,bias所造成的error也逐渐下降,也就是打靶的时候瞄得越来越准。(红线)
  • variance逐渐变大,variance所造成的error也逐渐增大,也就是虽然瞄得越来越准,但是每次射出去以后,误差是越来越大的。(绿线)
  • 综合考虑两者,即可得到蓝线所示,实际综合观测到的误差error先是减小然后又增大,因此实际error为最小值的那个点,即为bias和variance的error之和最小的点,就是表现最好的model模型。

3.2 欠拟合(underfitting):误差来源于bias——模型不能很好地拟合训练数据。(靶心未包含在其space)

  • 解决方案: redesign model重塑模型(因为收集更多数据是无用的)
    1.增加更多的feature作为输入
    2.选择更复杂的模型

3.3 过拟合(overfitting):误差来源于variance——模型拟合了训练数据,但在测试数据上有很大误差。(过分的包含了靶心所在的space)

解决方案
1.增加更多的training data (可假设data 以达到增加数据)(不会伤害bias)
2.regularization正则化(可能会伤害bias)

  • 正则化的目的:防止过拟合!
  • 正则化的本质:约束(限制)要优化的参数。(此处理解还有欠缺)
    在loss function里面加一个与model高次项系数相关的term,它会希望你的model里高次项的参数越小越好,也就是说希望你找出来的曲线越平滑越好;这个新加的term前面可以有一个weight,代表你希望你的曲线有多平滑。正则化后就不会出现很不平滑的曲线,如果再增加weight的话,会让曲线变得更平滑。这个时候variance会变小,但可能会伤害bias。
    如图所示:在这里插入图片描述
    下图很好的解释了一个优化过程
    在这里插入图片描述

我们希望找一个model,它variance够小,bias也够小,这两个合起来给我们最小的testing data的error

二.model selection

首先须知:
1.如果你的手上有training set,有testing set,model1、model2、model3里面,分别得到三个error为0.9,0.7,0.5,这里很直觉地会认为是model3最好(错,这是不对的)
2.但是现在可能的问题是,这个testing set是你自己手上的testing set,是你自己拿来衡量model好坏的testing set,真正的testing set是你没有的;
3.所以你今天那这个testing set来选择最好的model的时候,它在真正的testing set上不见得是最好的model,通常是比较差的,所以你实际得到的error是会大于你在自己的testing set上估测到的0.5。

如何解决呢?
training data分成training set(训练集)和validation set(验证集)
把你的training set分成两组:
1)一组是真正拿来training model的,叫做training set(训练集)
2)另外一组不拿它来training model,而是拿它来选model,叫做validation set(验证集)
在这里插入图片描述
假设你手头上有3个model,你先把这3个model用training set训练出三个f^,接下来看一下它们在validation set上的performance。
假设现在model3的performance最好,那你可以直接把这个model3的结果拿来apply在testing data上
如果你担心现在把training set分成training和validation两部分,感觉training data变少的话,可以这样做:已经从validation决定model3是最好model,那就定住model3不变(function的表达式不变),然后用全部的data在model3上面再训练一次(使用全部的data去更新model3表达式的参数)
这个时候,如果你把这个训练好的model的f^到public testing set上面,你可能会得到一个大于0.5的error,虽然这么做,你得到的error表面上看起来是比较大的,但是这个时候你在public set上的error才能够真正反映你在private set上的error。

小结
在考虑真实的测试集的情况下:
1.流程:training set(部分训练集) -> validation set(部分验证集) -> 自己的testing data(测试集) -> 实际的testing data (该流程使用自己的testing data和validation来模拟testing data的bias误差,可以真实地反映出在实际的data上出现的error)
2.N-flod Cross Validation
在这里插入图片描述

也就是说,如果你不相信某一次分train和validation的test结果的话,那你就分很多种不同的样子。
1.比如说,如果你做3-flod的validation,意思就是你把training set分成三份,你每一次拿其中一份当做validation set,另外两份当training;分别在每个情境下都计算一下3个model的error,然后计算一下它的average error;然后你会发现在这三个情境下的average error,是model1最好

2.然后接下来,你就把用整个完整的training data重新训练一遍model1的参数;然后再去testing data上test

3.原则上是,如果你少去根据public testing set上的error调整model的话,那你在private testing set上面得到的error往往是比较接近public testing set上的error的

注1:将训练数据分为测试集和验证集。
做实验、发表论文时所谓的测试集,实际上是一个public testing set,而真正的测试集是一个private testing set,是一个谁也不知道的东西(我们不知道后面的人会输入什么数据到模型中),因此,我们不应该以public testing set作为选择模型的标准,而是应该以validation的结果来选择最好的模型。
注2:用validation选好模型后,可以把测试集和验证集一起作为训练数据,再对模型进行一次训练。但是,千万不要在看到public testing set的结果后,再想着去调整训练好的模型,这样的调整是无意义的。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐