文章作者:Tyan
博客:noahsnail.com | CSDN | 简书
注:本文为李沐大神的《动手学深度学习》的课程笔记!
欠拟合和过拟合
训练误差和泛化误差
机器学习模型在训练数据集上表现出的误差叫做训练误差,在任意一个测试数据样本上表现出的误差的期望值叫做泛化误差。
统计学习理论的一个假设是:训练数据集和测试数据集里的每一个数据样本都是从同一个概率分布中相互独立地生成出的(独立同分布假设)。
一个重要结论是:训练误差的降低不一定意味着泛化误差的降低。机器学习既需要降低训练误差,又需要降低泛化误差。
欠拟合和过拟合
- 欠拟合:机器学习模型无法得到较低训练误差。
- 过拟合:机器学习模型的训练误差远小于其在测试数据集上的误差。
模型的选择
模型拟合能力和误差之间的关系如下图:
训练数据集的大小
一般来说,如果训练数据集过小,特别是比模型参数数量更小时,过拟合更容易发生。除此之外,泛化误差不会随训练数据集里样本数量增加而增大。
多项式拟合
给定一个标量数据点集合x
和对应的标量目标值y
,多项式拟合的目标是找一个K阶多项式,其由向量w
和位移b
组成,来最好地近似每个样本x
和y
。用数学符号来表示就是我们将学w
和b
来预测
$$\hat{y} = b + \sum_{k=1}^K x^k w_k$$
并以平方误差为损失函数,一阶多项式拟合又叫线性拟合。
创建数据集
使用二阶多项式来生成每一个数据样本,$y=1.2x−3.4x^2+5.6x^3+5.0+noise$,噪音服从均值0和标准差为0.1的正态分布。
1 | # 导入mxnet |
1 | # 训练数据数量 |
1 | # 生成随机数据x |
(200L,)
定义训练和测试步骤
1 | %matplotlib inline |
三阶多项式拟合(正常)
1 | train(X[:num_train, :], X[num_train:, :], y[:num_train], y[num_train:]) |
('learned weight',
[[ 1.22117233 -3.39606118 5.59531116]]
<NDArray 1x3 @cpu(0)>, 'learned bias',
[ 4.98550272]
<NDArray 1 @cpu(0)>)
线性拟合(欠拟合)
1 | train(x[:num_train, :], x[num_train:, :], y[:num_train], y[num_train:]) |
('learned weight',
[[ 19.74101448]]
<NDArray 1x1 @cpu(0)>, 'learned bias',
[-0.23861444]
<NDArray 1 @cpu(0)>)
训练量不足(过拟合)
1 | train(X[0:2, :], X[num_train:, :], y[0:2], y[num_train:]) |
('learned weight',
[[ 3.10832024 -0.740421 4.85165691]]
<NDArray 1x3 @cpu(0)>, 'learned bias',
[ 0.29450524]
<NDArray 1 @cpu(0)>)
结论
- 训练误差的降低并不一定意味着泛化误差的降低。
- 欠拟合和过拟合都是需要尽量避免的。我们要注意模型的选择和训练量的大小。