1 数据集简介与数据的分析
1.1 数据背景简介
波士顿房价数据集是统计的20世纪70年代中期波士顿郊区房价的中位数,统计了当时教区部分的犯罪率、房产税等共计13个指标,统计出房价,试图能找到那些指标与房价的关系。本例子明显的是属于回归模型的案例。在数据集中包含506组数据,其中404是训练样本,剩下的102组数据作为验证样本。
1.2 数据结构的分析
先来看看数据集的数据结构,输入
from keras.datasets import boston_housing
(train_data,train_targets),(test_data,test_targets) = boston_housing.load_data()
如图所示整个训练集的结构是一个403*13的矩阵列表,每一行代表一组指标。随机打开第一组数据,发现数据并没有一个明显的特征,比如说都在0~1之间,而事实上,这些指标的取值范围有很大的差异,有的取值范围是0~1有的是0~100等等,差异巨大。因此我们在数据输入之前应当将数据做归一化处理。
2 数据的预处理
2.1 0均值标准化(Z-score standardization)
所谓数据的归一化就是将数据“去量纲化”,这是一个物理学的概念,简单来说我们就是要把这些数据指标的单位的影响去掉,使得他们都在同一个量纲上——无量纲上进行讨论,这样数据之间的相互关系还在,其他的一些干扰因素就少了很多。归一化基本方法有线性函数归一化与0均值标准化两种(详见https://blog.csdn.net/zbc1090549839/article/details/44103801),在数据大致呈现正态分布的前提下一般采用0均值标准化(Z-score standardization),公式为
含义就是将数据减去数据组的平均数再除以标准差,这样处理后每项指标数据均成平均值为0,标准差为1的正态分布。代码实现如下:
(train_data,train_targets),(test_data,test_targets) = boston_housing.load_data()
mean = train_data.mean(axis = 0)
train_data -= mean
std = train_data.std(axis = 0)
train_data /= std
test_data -= mean
test_data /= std
这里要着重注意的是,对测试数据的处理使用的平均值和标准差都是训练集的,绝对不可以动用测试集的任何数据做任何脱离训练集的处理。
3 构建网络
3.1 模型定义
def build_model():
model = models.Sequential()
model.add(layers.Dense(64,activation = 'relu',input_shape = (train_data.shape[1],)))
model.add(layers.Dense(64,activation = 'relu'))
model.ad