Loading

李宏毅机器学习(三) 误差的来源

Error来自于哪里

Error来源

引入:在同样的测试数据集上,并非越复杂的模型,误差就越小。

image

横坐标表示模型的最高项阶数(模型复杂度),纵坐标为模型在测试集上的平均误差(Error)。

如图所示,最复杂的模型(5)的误差并非最小,并非随着模型复杂度上升, 模型误差也较小。

  • 模型误差来自于两个方面:biasvariance,误差可看作两个方面的和。

    \(Error = bias + variance\)

估测

若问题对应的真实模型为\(\hat{f}\),而我们设计的模型搜寻到最优的模型,也就是我们能找到的对应于问题的理想模型为\(f^*\)\(f^*\)就是\(\hat{f}\)的一个预估。

image

预测过程就相当于扔飞镖,靶心是\(\hat{f}\), 我投掷(预测)的结果是\(f^*\)

如果所示,真实模型\(\hat{f}\)和理想模型\(f^*\)之间存在差距,差距由bias和variance两部分构成。

估计x的bias

  • 假设 \(x\) 的均值是 \(\mu\),方差为 \(\sigma^2\)

评估平均值要怎么做呢?

  • 采样 \(N\) 个样本点:\(\{x^1,x^2,···,x^N\}\)
  • 计算\(N\)个点的平均值 \(m\), 得到

\[m=\frac{1}{N}\sum_n x^n \neq \mu \]

因为一次采样的均值和总体的均值不相等。

  • 如果计算很多组的\(m\),计算\(N\)个点的平均值\(m\)的期望,得到

\[E[m]=E\left[\frac{1}{N} \sum_{n} x^{n}\right]=\frac{1}{N} \sum_{n} E\left[x^{n}\right]=\mu \]

采样次数够多,\(m\)的期望等于\(x\)的期望\(\mu\),这个估计呢是无偏估计(unbiased),如下图所示。

image

然后 \(m\)分布对于 \(\mu\) 的离散程度(方差):

\[\begin{align} \operatorname{Var}[m]&=\operatorname{Var}[\frac{1}{N}\sum_n x^n]\\ &=\frac{1}{N^2}\operatorname{Var}[\sum_n x^n]\\ &=\frac{1}{N^2}\sum_n(\operatorname{Var}[x^n])\\ &=\frac{1}{N^2}\sum_n \sigma^2\\ &=\frac{1}{N^2} \cdot N \cdot \sigma^2\\ &=\frac{\sigma^2}{N} \end{align} \]

可以看出,\(m\)的方差取决于 \(N\),下图看出 \(N\)越小越离散:

image

估计x的variance

与上面一样。

  • 假设 \(x\) 的均值是 \(\mu\),方差为 \(\sigma^2\)

评估平均值要怎么做呢?

  • 采样 \(N\) 个样本点:\(\{x^1,x^2,···,x^N\}\)
  • 计算\(N\)个点的平均值 \(m\), 得到

\[m = \frac{1}{N}\sum_n{x^n} \]

  • \(m\)的方差\(s^2\)

    \[s^{2}=\frac{1}{N} \sum_{n}\left(x^{n}-m\right)^{2} \]

  • 计算\(s^2\)的期望值,得到

    \[E\left[s^{2}\right]=\frac{N-1}{N} \sigma^{2}\neq \sigma^{2} \]

    推导过程如下:

    方式1:

    image

    方式2:

    image

    可以看出,\(N\)越大,\(s^2\)的估测值越接近真实的方差\(\sigma^2\),一般小于真实的\(\sigma^2\),如下图所示。

image

理想中,我们希望得到一个偏差和方差都很小的模型(下图左上),但实际上往往很困难。

image

如图所示,蓝色点为我们的模型,红色靶心为真实的模型,\(\overline{f}\)为我们模型的期望值。

  • 点为什么不在\(f^*\)周围呢?
    可以看出我们模型的期望值和真实模型靶心差了一段距离,这段距离就是Bias,可以理解为枪(模型)有问题,使我们以为瞄准了,其实真实瞄准的位置是\(\overline{f}\)的位置。

  • 那为什么点都散布在\(\overline{f}\)周围呢?

    因为我们的模型\(f^*\)也并非打在我们真实瞄准的位置\(\overline{f}\)上,两者之间差了一些距离,这个距离叫做Variance,可以理解为打靶过程被一些因素(训练数据中的干扰值)干扰了,比如风。

选择相对较好的模型的顺序:方差小,偏差小 > 方差小,偏差大 > 方差大,偏差小 > 方差大,偏差大。

方差小,偏差大 之所以在实际中排位相对靠前,是因为它比较稳定。很多时候实际中无法获得非常全面的数据集,那么,如果一个模型在可获得的样本上有较小的方差,说明它对不同数据集的敏感度不高,可以期望它对新数据集的预测效果比较稳定。

  • 考虑不同模型的方差

一次模型的方差就比较小的,也就是是比较集中,离散程度较小。而5次模型的方差就比较大,同理散布比较广,离散程度较大。

所以用比较简单的模型,方差是比较小的(就像射击的时候每次的时候,每次射击的设置都集中在一个比较小的区域内)。如果用了复杂的模型,方差就很大,散布比较开。

image

简单模型受数据影响少一些,复杂的模型有能力去拟合每一个样本,所以容易被个例样本(不具有普遍性)带偏,所以简单模型更具有"鲁棒性"。

  • 考虑不同模型的偏差
    image

这里没办法知道真正的 \(\hat{f}\),所以假设图中的那条黑色曲线为真正的$ \hat{f}\(,蓝色的线为多个\)f^*\(的平均\)\bar{f}$。

结果可视化,一次平均的 \(\bar{f}\) 没有5次的好,虽然5次的整体结果离散程度很高。

一次模型的偏差比较大,而复杂的5次模型偏差比较小。

直观的解释:简单的模型函数集的拟合能力比较弱,所以可能拟合的范围里面就没有包含靶心,肯定射不中。而复杂的模型函数集的拟合能力比较强强,可能就包含的靶心,只是没有办法找到确切的靶心在哪,但足够多的,就可能得到真正的 。

  • 偏差v.s.方差

image

上图中,横坐标为模型的复杂程度,纵坐标为模型的Error,从图中可以看出,随着模型复杂程度的增加,模型的Bias减小,但是Variance增加,两者共同体现在模型的Error上。

如果模型太简单,误差主要为模型的bias,则称为欠拟合;如果模型太复杂,误差主要为variance,则称为过拟合;

拟合状态判断

分析

image

如果模型没有很好的训练训练集,就是偏差过大,也就是欠拟合 如果模型很好的训练训练集,即再训练集上得到很小的错误,但在测试集上得到大的错误,这意味着模型可能是方差比较大,就是过拟合。 对于欠拟合和过拟合,是用不同的方式来处理的

偏差大-欠拟合

此时应该重新设计模型。因为之前的函数集里面可能根本没有包含\(f^*\)

  • 改进方法1:使用更多特征作为输入

可以将更多的函数加进去,比如考虑高度重量,或者HP值等等。

  • 改进方案2:使用更复杂的模型

考虑使用更多次幂、更复杂的模型。

注意:如果此时强行再收集更多的data去训练,这是没有什么帮助的,因为设计的函数集本身就不好,再找更多的训练集也不会更好。

方差大-过拟合

改进方法1:加数据

使用更多的数据训练,以减小其中特殊样本对模型的影响。直观的理解,数据越多,数据越能反应真实情况,特殊样本的比例和对模型的影响将会减小。

问题:现实任务中,能够使用的数据比较有限,收集更多的数据并不容易。

改进方法2:加正则化

使用正则化,使得模型更加平滑,对个例样本不再那么敏感。

问题:可能会增加bias,需要注意正则化的权重。

image

模型选择

现在在偏差和方差之间就需要一个权衡 想选择的模型,可以平衡偏差和方差产生的错误,使得总错误最小。

但是下面这件事最好不要做:

image

用训练集训练不同的模型,然后在测试集上比较误差,模型3的误差比较小,就认为模型3好。但实际上这只是你手上的测试集,真正完整的测试集并没有。比如在已有的测试集上错误是0.5,但有条件收集到更多的测试集后通常得到的错误都是大于0.5的。

个人理解:训练集和测试集是同一批数据,他们有相同的“模式”,不能用来检验模型应对不同“模式”的能力。

交叉验证

除了训练集和测试集以外,我们需要一个用于选择模型的验证集(Validation Set),通常由训练集划分而来。
image

图中public的测试集是已有的,private是没有的,不知道的。交叉验证 就是将训练集再分为两部分,一部分作为训练集,一部分作为验证集。用训练集训练模型,然后在验证集上比较,确实出最好的模型之后(比如模型3),再用全部的训练集训练模型3,然后再用public的测试集进行测试,此时一般得到的错误都是大一些的,但是其应对真实数据的误差较不适用交叉验证时更低。不过此时看到在public数据集上比较大的Error,会比较想再回去调一下参数,调整模型,让在public的测试集上更好,但不太推荐这样。

上述方法可能会担心将训练集拆分的时候分的效果比较差怎么办?可以用下面的方法。

N-折交叉验证

将训练集分成N份,比如分成3份。

image

比如在三份中训练结果Average错误是模型1最好,再用全部训练集训练模型1。

posted @ 2021-07-16 17:05  c0co  阅读(387)  评论(0)    收藏  举报