机器学习 - 过拟合与欠拟合

80

(本系列的 Jupyter Notebook 可以到我的码云下载。)

概述

过拟合与欠拟合是训练模型时经常遇到的现象。拟合表示模型与训练集的贴合程度。过拟合表示模型过于贴合训练集从而导致模型的泛化能力低的现象。欠拟合表示模型无法贴合训练集从而导致模型的泛化能力低的现象。本篇教程将通过实例讲解上述概念。

准备

首先构造本篇用到的数据集,代码如下:

1
2
3
4
5
6
7
8
9
10
11
m = 16
train_size = 12
test_size = m - train_size
np.random.seed(42)

X = np.linspace(0, 8, m).reshape(-1, 1)
y = 0.8 * X ** 2 + 2 * X + 4 + 2.5 * np.random.randn(m, 1)
X_train = X[0:train_size]
y_train = y[0:train_size]
X_test = X[train_size:]
y_test = y[train_size:]

上面的代码中,6~7 行构造了我们的数据集和模型:$ y = 0.8 x^2 + 2 x + 4 $,并加入了一些随机误差。
8~9 行构造训练集,大小为 $12$ .
10~11 行构造测试集,大小为 $4$ .

将数据集用 matplotlib 画出来,代码如下:

1
2
3
4
5
6
7
8
9
10
plt.figure(figsize=(7, 5))

plt.plot(X_train, y_train, 'b.', markersize=10, label="Training Set")
plt.plot(X_test, y_test, 'gs', label="Test Set")
plt.xlim(-0.5, 8.5)
plt.ylim(0, 75)
plt.legend(loc='upper left', fontsize='x-large')
plt.title("Dataset", fontsize='x-large')

plt.show()

结果如下:

图1 - 数据集

什么是拟合

现在让我们忘记测试集,仅用训练集来训练模型。在训练模型时,一个很好的策略是多训练几个不同的模型,将模型应用于测试集,选择预测效果最好的那个模型作为最终的模型。下面的三张图分别是使用了


\begin{align*} y &= \theta_0 + \theta_1 x \tag{1} \\ y &= \theta_0 + \theta_1 x + \theta_2 x^2 \tag{2} \\ y &= \theta_0 + \theta_1 x + \theta_2 x^2 + \theta_3 x^3 + \theta_4 x^4 + \theta_5 x^5 + \theta_6 x^6 + \theta_7 x^7 + \theta_8 x^8 + \theta_9 x^9 \tag{3} \end{align*}

作为回归方程训练出来的模型(图中的 degree 表示模型参数的个数):

图2 - 不同 degree 训练的模型

上面这种用模型模拟数据的方法就叫做拟合。可以看到上面三条曲线与数据的拟合程度不同,比如中间的图像中大概有 $6$ 个样本点在曲线上,而右面的图像中所有 $12$ 个样本点都在曲线上,因此右面图像的曲线与数据的拟合度更高。

模型的自由度

上面的 $(1)$$(2)$$(3)$ 式的模型参数数量各不相同,而参数越多则表示模型能模拟的情况也越多。比如 $(1)$ 式可以模拟三种线性规律:


\begin{equation} \begin{array}{l} y = \theta_0 \\ y = \theta_1 x \\ y = \theta_0 + \theta_1 x \end{array} \tag{4} \end{equation}

。而 $(2)$ 式除了可以模拟 $(1)$ 式的三种线性规律外,还可以模拟四种非线性规律:


\begin{equation} \begin{array}{lr} \left. \begin{array}{lr} y = \theta_0 & \\ y = \theta_1 x & \\ y = \theta_0 + \theta_1 x & \end{array} \quad\quad\quad \right\} \text{线性} \\ \left. \begin{array}{l} y = \theta_2 x^2 \\ y = \theta_0 + \theta_2 x^2 \\ y = \theta_1 x + \theta_2 x^2 \\ y = \theta_0 + \theta_1 x + \theta_2 x^2 & \end{array} \right\} \text{非线性} \end{array} \tag{5} \end{equation}

。至于 $(3)$ 式就可以模拟更多情况了,这里不再一一列出。从上面的分析可以知道模型参数越多,模型能做的事情就越多,即模型的自由度就越高(由于自由度完全由模型参数决定,因此 图2 中的 degree 也可以表示自由度)。

泛化

机器学习试图通过拟合现有数据找到其中的内在规律,它的产物就是模型。由于数据在采集过程中会存在误差,因此掩盖了内在规律,在训练模型时就变得困难。训练出的模型就有可能体现了内在规律,也可能与内在规律一点关系也没有。模型符合内在规律的程度越高,它的预测能力就越强,反之,模型符合内在规律的程度越低,它的预测能力就越差。这种预测的能力就是泛化能力

大家都听过盲人摸象的故事:

从前,有四个盲人很想知道大象是什么样子,可他们看不见,只好用手摸。胖盲人先摸到了大象的牙齿。他就说:“我知道了,大象就像一个又大、又粗、又光滑的大萝卜。”高个子盲人摸到的是大象的耳朵。“不对,不对,大象明明是一把大蒲扇嘛!”他大叫起来。“你们净瞎说,大象只是根大柱子。”原来矮个子盲人摸到了大象的腿。而那位年老的盲人呢,却嘟嚷:“唉,大象哪有那么大,它只不过是一根草绳。”原来他摸到的是大象的尾巴。

故事中胖盲人建立的模型就是:像大萝卜的动物就是大象。可以想象用这样的模型去预测是非常不准确的,可以说该模型泛化能力非常低。

过拟合与欠拟合

上面说到自由度越高的模型越能更好地拟合数据,那么是不是自由度越高的模型泛化能力就越强呢? 比如是不是可以说 图2 最右面的模型是最好的模型呢?答案是否定的。原因是数据通常都是带着噪声的,因此完全拟合数据的模型仅仅是记住了所有带着噪音的数据,并没有揭露其内在规律,因此缺乏泛化能力。这种用自由度过高的模型去拟合数据的现象叫过拟合

为了避免过拟合,就要降低自由度,也就是减少模型参数,那么减小到多少合适呢?比如减小到像 图2 最左面的模型可不可以呢?这需要根据实际情况而定,比如实际的内在规律可能是一个多项式模型,如果用线性模型来拟合,那么泛化能力就会降低。这种现象叫欠拟合

我们将测试集加上,观察上述三个模型的优劣:

图3 - 过拟合与欠拟合

上图中的绿色方块表示测试数据,可以看到,中间的模型正好拟合了数据的内在规律,因此测试数据与曲线相距很近;左边的模型自由度过低(模型太过简单),没有能力拟合内在规律,造成欠拟合,因此测试数据与曲线相距甚远;右面的模型自由度过高(模型太过复杂),仅仅记住带着噪音的数据而忽略了内在规律,造成过拟合,因此测试数据与曲线相距甚远。为了更仔细地观察不同自由度的模型在测试集上的优劣,我们将模型自由度和相应的 MSE 绘制在一张图上:

图4 - 自由度 vs MSE

上图中红色方块表示训练集的 MSE ,由于随着自由度的增加模型会更多地记住数据和噪音的特征,因此 MSE 不断减小,注意到 degree 1 的 MSE 很大,已经超出绘图范围了,这是因为 degree 1 时模型欠拟合造成的。蓝色圆圈表示测试集的 MSE,可以看到 MSE 先减小再增大,这是因为自由度过低时模型欠拟合,而自由度过高时模型过拟合,这两者都会造成模型在测试集上的表现很差。从 degree 5 开始模型在训练集上的 MSE 持续下降,而在测试集上的 MSE 持续上升,这正是因为模型在训练集上过拟合造成的。综上所述,一个欠拟合的模型会在训练集和测试集上表现出很大误差,一个过拟合的模型在训练集上的误差非常小而在测试集上的误差非常大。

数据太少也会造成过拟合,通常只有大规模数据才能揭示其内在规律(这也是机器学习需要依赖大数据的原因之一),而较少的数据或者仅仅反映了一部分的内在规律或者(针对数据量而言)引入了大量的噪音。比如仅仅计算2个人的平均身高并不能代表全人类的平均身高,仅仅摸到了象牙并不能描述整个大象。过少的数据不足以表现其内在规律,那么在这些数据上训练的模型当然也无法找到其内在规律,而仅仅是记住了这些数据以及它们引入的噪音,因此造成过拟合。下图是分别使用了样本个数为 $3$、$6$、$9$ 的训练集所训练出来的模型:

图5 - 训练集过小造成欠拟合

可以看到,同样是自由度为 $2$ 的模型,数据越多,越容易找到其内在规律;数据越少,越容易丢失内在规律而突出噪音,使训练的模型仅仅记住了数据和它们的噪音,造成过拟合。从杂质的角度看,数据越少,数据中杂质的比例就越大,内在规律就隐藏得越深,模型就越容易学到更多的噪音,造成过拟合;而数据越多,数据中杂质的比例就越小,内在规律就越容易浮出水面,模型就越容学到更少的噪音。

数据中杂质的多少也会影响模型的质量,同样多的数据,杂质越多,训练出的模型越差,杂质越少,训练出的模型越好。下面是同样多的数据,引入不同杂质(假设杂质服从 $(0, \sigma^2)$ 的正态分布)的情况:

图6 - 杂质对模型的影响

可以看到左面图中的数据杂质最少,训练出的模型更符合内在规律,因而泛化能力更强;而右面图中的数据杂质最多,导致模型因学习了过多的噪音而造成过拟合,因而泛化能力低下。

泛化误差

模型的泛化误差就是将模型应用于新数据时产生的误差。在测试集上进行测试时,很容易看到这个误差有多大,比如在测试线性模型时,MSE的大小就决定了泛化误差的大小。

泛化误差由三部分组成:

Bias 是由于对模型产生了错误的假设而引起的误差,比如假设模型是线性的,但实际规律是二次的,那么就会造成 Bias 误差。高 Bias 的模型通常是由于对训练数据的欠拟合造成的。

Variance 是由于模型对训练数据的小波动过度敏感造成的,自由度高的模型会造成高的 Variance,从而造成对训练数据的过拟合。

Irreducible error 是数据本身的噪声引起的误差。通常使用特征工程减小这个误差。

总结

  • 模型的自由度太低造成欠拟合
  • 模型的自由度太高造成过拟合
  • 数据杂质的多少回影响模型的优劣

以上就是对过拟合与欠拟合的讲解,感谢阅读!如果有任何问题或建议,请在留言区留言!

版权声明:本文为原创文章,转载请注明出处。http://cynhard.com/2018/07/04/ML-Overfitting-and-Underfitting/

推荐文章