《动手学深度学习》笔记---3.11&3.12&3.15

3.11 模型选择、欠拟合和过拟合

3.11.1 训练误差和泛化误差

  1. 训练误差:模型在训练数据集上表现出的误差
  2. 泛化误差:模型在任一测试数据样本上表现出的误差的期望
  3. 机器学习模型应关注降低泛化误差

3.11.2 模型选择

  1. 验证数据集
    训练数据集合和测试数据集之外的数据
  2. k折交叉验证
    2.1 把训练数据集分割成k个不重合的子数据集,然后做k次模型训练和验证
    2.2 每一次,使用一个子数据集验证模型,使用其他k-1个子数据集来训练模型
    2.3 在这k次训练和验证中,每一次用来验证模型的子数据集都不同。
    2.4 对这k次训练误差和验证误差分别求平均。

3.11.3 欠拟合和过拟合

  1. 欠拟合:模型无法得到较低的训练误差
  2. 过拟合:模型的训练误差远小于它在测试数据集上的误差
  3. 给定数据集,如果模型复杂度过低,很容易出现欠拟合;
  4. 给定数据集,如果模型复杂度过高,很容易出现过拟合。
  5. 泛化误差不会随训练数据集中的样本数量增加而增大。

3.11.4 多项式函数拟合实验

# 以多项式函数为例,来理解模型复杂度和训练集大小对欠拟合和过拟合的影响。
%matplotlib inline
import d2lzh as d2l
from mxnet import autograd, gluon, nd
from mxnet.gluon import data as gdata, loss as gloss, nn

1. 生成数据集

# 生成人工数据集。
# 在trainsets和testsets中,给定样本特征x,使用 y = 1.2x - 3.4x^2 + 5.6x^3 +5 + ε来生成样本标签
# 其中ε是均值为0,方差为0.1的正态分布
# 训练样本和测试样本数量都设为100
# nd.concat(x, y)函数,默认dim = 0, 将x, y按列合并,(增加列数)
# nd.power(x,2)是按元素计算x的平方
n_train, n_test, true_w, true_b = 100, 100, [1.2, -3.4, 5.6], 5
features = nd.random.normal(shape = (n_train + n_test, 1)) # 训练集和测试集一块生成
poly_features = nd.concat(features, nd.power(features, 2),
 nd.power(features, 3))
labels = (true_w[0] * poly_features[:, 0] + true_w[1] * poly_features[:, 1] # 生成多项式
 + true_w[2] * poly_features[:, 2] + true_b)
labels += nd.random.normal(scale = 0.1, shape = labels.shape) # 添加随机误差
# 看看生成数据的前两个样本
features[: 2], poly_features[: 2], labels[: 2]
output:

([[-0.24919763]
 [-1.2863069 ]]
 <NDArray 2x1 @cpu(0)>,
 [[-0.24919763 0.06209946 -0.01547504]
 [-1.2863069 1.6545854 -2.1283045 ]]
 <NDArray 2x3 @cpu(0)>,
 [ 4.4988413 -14.094537 ]
 <NDArray 2 @cpu(0)>)

2. 定义、训练模型

# 先定义作图函数semilogy, 其中对y轴做了对数尺度
def semilogy(x_vals, y_vals, x_label, y_label, x2_vals = None, y2_vals = None,
 legend = None, figsize = (3.5, 2.5)):
 d2l.set_figsize(figsize)
 d2l.plt.xlabel(x_label)
 d2l.plt.ylabel(y_label)
 d2l.plt.semilogy(x_vals, y_vals)
 if x2_vals and y2_vals:
 d2l.plt.semilogy(x2_vals, y2_vals, linestyle = ':')
 d2l.plt.legend(legend)
# 和线性回归一样,多项式函数拟合也使用平方损失函数
# 我们将尝试使用不同复杂度的模型来拟合生成的数据集,因此把模型定义部分放在
# fit_and_plot函数中
num_epochs, loss = 100, gloss.L2Loss()
def fit_and_plot(train_features, test_features, train_labels, test_labels):
 net = nn.Sequential() # 创建容器
 net.add(nn.Dense(1)) # 加入输出全连接层,有1个输出节点
 net.initial
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值