什么是泛化误差?它和训练误差的区别?

首先评判一个machine是否good的方法是其泛化能力,泛化能力可以由泛化误差来体现。

那么泛化误差是什么?

我们已经很熟悉的训练误差, 其公式是 E_T(w) = sum_{i=1}^n(hat{f}(x_i|w)-y_i)^2= sum_{xin D}(hat{f}(x|w)-f(x))^2 ,其中 hat{f}(x|w) 是预测值, f(x) 则是目标值,而 D = {(x_i,y_i = f(x_i))}_{i=1}^N 集合D是表示一个全集 chi 的一个样本量为N的子集。

泛化误差的公式 E_G(w) = sum_{xinchi}p(x)(hat{f}(x|w)-f(x))^2p(x) 表示的是在全集 chi 中x出现的概率(此处的x可以是一个数据点也可以是一个数据点集合)。

是不是可以观察到他们的不同了?

训练误差计算了训练集的误差,而泛化误差是计算全集的误差。相比泛化误差来说,训练误差可以说只是计算了一部分的误差。举个例子。假设我们现在需要计算某个模型。假设在整个世界中,所有的数据有150个,如下图。

数据全集

然而现实情况是,我们不可能能够找到所有的数据,因此假设我们能够观测到其中一部分的数据。并且,由于不同的实验条件,每次实验都有可能取到其中不同的部分。

下图为进行多次实验的结果,(假设实验次数为2,每次仅能够找到50个数据)。

数据集1

数据集2

两次的训练误差为 E_i = sum_{xin D_i}(hat{f}(x|w)-f(x))^2 , 而泛化误差则为 E_G = frac{50}{100}E_1 + frac{50}{100}E_2 ,计算概率的时候都是针对可观测量,因为不可观察量我们是无法计算的。

验证集的加入

上面的两个数据集可以被视为平时训练模型时的训练集training set和测试集test set,当然测试集往往不在建模型者手中,测试集往往用验证集validation set代替。泛化误差在这里可以看作是训练集误差和验证集误差的加权和。

这也是为什么使用泛化误差来衡量模型比使用训练误差来衡量更有科学性。显而易见过分追求低训练误差会使得模型过拟合于训练集反而不适用于其他数据。

下图是回归问题的训练误差和泛化误差的对比,可以看到存在一个临界点使得泛化误差最小,这个时候就是最好的模型复杂度。

另外,交叉验证也是使用了这个原理。

偏差bias和方差variance与泛化误差的联系

我们将真实模型的范围用黄色区域表示。由于条件的限制和知识的限制,我们已知可达的预测范围是橙色范围。 f(x) 是实际的目标值,假设使用某个数据集实验的预测结果为 f(x|w) ,他们的泛化误差也就是距离为实线部分。对于每次实验都会有不同的误差。因此泛化误差的期望是 ar{E_G} = frac{1}{N}sum_{i=1}^NE_G(w_{D_i}) = frac{1}{N}sum_{i=1}^N[sum_{xinchi}p(x)(hat{f}(x|w_{D_i})-f(x))^2]

引入一个新的中间项 hat{f_m}(x) 它表示的是多次实验后的平均预测结果。也就是图中最集中的那个点。因此泛化误差的期望可以写成

简要概括即为,第一项为variance第二项为bias

偏差-方差引理 欠拟合与过拟合

Bias衡量的是训练模型的平均泛化效果,当模型特别简单比如维度特别低时,平均预测离真实值往往偏离较远,因此bias比较大,此时属于欠拟合。

Variance衡量的是使用不同数据集的预测模型泛化效果波动情况,当模型特别复杂维度特别高时,对于每次不同数据集训练出的模型预测效果差别都很大,因此此时variance会比较大,此时属于过拟合。

因此让bias和variance达到一个平衡点会使得效果最好。

知乎高分回答将bias和variance也说的很明白。


推荐阅读:
相关文章