回归问题它预测的是一个连续值而不是离散的标签。
本次要预测的是波士顿郊区房屋价格的中位数。
首先,我们通过keras加载数据集
from keras.datasets import boston_housing
(train_data,train_targets),(test_data,test_targets) = boston_housing.load_data()
我们有404个训练样本和102个测试样本。每个样本都有13个特征值。
print(train_data.shape,'\n',test_data.shape)
目标是房屋价格的中位数
print(train_targets)
一 准备数据
将取值范围差异很大的数据输入到神经网络中,会使学习变得困难。所以我们要对每个特征做标准化:减去特征平均值,再除以标准差。
这样的到的特征平均值为0,标准差为1
#数据标准化
mean =train_data.mean(axis=0)
train_data -= mean
std = train_data.std(axis=0)
train_data /= std
#我们不能使用测试数据的任何计算结果。所以用训练集的标准差和均值来计算
test_data -= mean
test_data /= std
二 构建网络
网络的最后一层只有一个单元,没有激活。因为激活函数会限制输出范围。
from keras import models
from keras import layers
def build_model():
model = models.Sequential()
model.add(layers.Dense(64,activation='relu',
input_shape=(test_data.shape[1],)))
model.add(layers.Dense(64,activation='relu'))
model.add(layers.Dense(1))
model.compile(optimizer='rmsprop',loss='mse',metrics=['mae'])
#平均绝对误差(mae)是预测值与目标值之差的绝对值
return model
因为这个数据集数据点很少,验证集也会很小,所以验证结果很不稳定。
这里我们采用K折交叉验证:将数据划分为k个分区,实例化k个相同的模型,将每个模型在k-1分区上训练,并在剩下的一个分区上进行评估。模型的验证分数等于k个验证分数的平均值。
#k折验证
import numpy as np
k = 4#将数据分为四份
num_val_samples = len(train_data) // k
num_epochs = 100
all_scores = []
for i