# 欠拟合和过拟合

### 欠拟合和过拟合

• 欠拟合：机器学习模型无法得到较低训练误差。
• 过拟合：机器学习模型的训练误差远小于其在测试数据集上的误差。

### 多项式拟合

ŷ =b+∑k=1Kxkwky^=b+∑k=1Kxkwk

\hat{y} = b + \sum_{k=1}^K x^k w_k

## 创建数据集

# 导入mxnet
import mxnet as mx

# 设置随机种子
mx.random.seed(2)

from mxnet import gluon
from mxnet import ndarray as nd
from mxnet import autograd
# 训练数据数量
num_train = 100
# 测试数据数量
num_test = 100
# 多项式权重
true_w = [1.2, -3.4, 5.6]
# 多项式偏置
true_b = 5.0
# 生成随机数据x
x = nd.random.normal(shape=(num_train + num_test, 1))
# 计算x的多项式值
X = nd.concat(x, nd.power(x, 2), nd.power(x, 3))
# 计算y
y = true_w[0] * X[:, 0] + true_w[1] * X[:, 1] + true_w[2] * X[:, 2] + true_b
# 查看数据
('x:', x[:5], 'X:', X[:5], 'y:', y[:5])
(200L,)

## 定义训练和测试步骤

%matplotlib inline
import matplotlib as mpl
mpl.rcParams['figure.dpi']= 120
import matplotlib.pyplot as plt

# 定义训练过程
def train(X_train, X_test, y_train, y_test):
# 定义线性回归模型
net = gluon.nn.Sequential()
with net.name_scope():
net.add(gluon.nn.Dense(1))
# 权重初始化
net.initialize()
# 学习率
learning_rate = 0.01
# 迭代周期
epochs = 100
# 训练的批数据大小
batch_size = min(10, y_train.shape[0])
# 创建训练数据集
dataset_train = gluon.data.ArrayDataset(X_train, y_train)
# 读取数据
data_iter_train = gluon.data.DataLoader(dataset_train, batch_size, shuffle=True)
# 训练方法SGD
trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate': learning_rate})
# 定义损失函数
square_loss = gluon.loss.L2Loss()
# 训练损失
train_loss = []
# 测试损失
test_loss = []
# 进行训练
for e in range(epochs):
for data, label in data_iter_train:
with autograd.record():
# 进行预测
output = net(data)
# 计算预测值与实际值之间的损失
loss = square_loss(output, label)
# 损失进行反向传播
loss.backward()
# 更新权重
trainer.step(batch_size)
# 保存训练损失
train_loss.append(square_loss(net(X_train), y_train).mean().asscalar())
# 保存测试损失
test_loss.append(square_loss(net(X_test), y_test).mean().asscalar())
# 绘制损失
plt.plot(train_loss)
plt.plot(test_loss)
plt.legend(['train','test'])
plt.show()
return ('learned weight', net[0].weight.data(), 'learned bias', net[0].bias.data())

## 三阶多项式拟合（正常）

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)>)

## 线性拟合（欠拟合）

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)>)

## 训练量不足（过拟合）

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)>)

## 结论

• 训练误差的降低并不一定意味着泛化误差的降低。
• 欠拟合和过拟合都是需要尽量避免的。我们要注意模型的选择和训练量的大小。

0 条评论

• ### 动手学深度学习(二)——正则化(gluon)

版权声明：博客文章都是作者辛苦整理的，转载请注明出处，谢谢！ https://blog.csdn....

• ### Python的命令行参数解析

命令行参数解析在编程语言中基本都会碰到，Python中内置了一个用于命令项选项与参数解析的模块argparse。下面主要介绍两种解析Python命令行参数的方式...

• ### Leetcode 797. All Paths From Source to Target

版权声明：博客文章都是作者辛苦整理的，转载请注明出处，谢谢！ https://blog.csdn....

• ### Radial Basis Function Network

使用高斯核函数方式把数据维度扩展到无限维度进而得到一条粗壮的分界线。仔细看一下这个分割函数，其实就是一些Gaussian函数的线性组合，y就是增长的方向。 ...

• ### Radial Basis Function Network

使用高斯核函数方式把数据维度扩展到无限维度进而得到一条粗壮的分界线。仔细看一下这个分割函数，其实就是一些Gaussian函数的线性组合，y就是增长的方向。 ...

• ### Pytorch实战Kaggle房价预测比赛

这是分享的第一个Kaggle比赛，也是Kaggle中难度最低的比赛之一，房价预测是一个回归问题，给出了房子的一些特征要求预测房子的价格。本文使用Pytorch构...

• ### 《模式识别与智能计算》模板匹配法

模板匹配法说白就是特征一一对应，将数据每个特征相差加起来，然后总的特征值最小的就是相似度最大的

• ### 《模式识别与智能计算》基于类中心的欧式距离法分类

算法过程： 1 选取某一样本 2 计算类中心 3 计算样本与每一类的类中心距离，这里采用欧式距离 4 循环计算待测样品和训练集中各类中心距离找出距离待测...

• ### TIANCHI-津南数字制造算法挑战赛【赛场一】基本分析&Baseline

有趣的是，训练集中缺失值比较多的A23和A21在测试集中并无缺失，同样地，测试集中缺失概率达67%的A25、A27和A20反而在训练集中并无缺失。(此处作者笔误...