使用keras框架编写三层神经网络解决房价预测问题

最近接触到了keras框架,因为需要做一些神经网络的实验。之前学过tensorflow框架,但是对于研究而言,这个框架确实上手难度比较大,即便是tensorflow的运算速度上要比keras高。
学习keras框架,我选择的书籍是《python深度学习》,因为我想研究的领域大多是一些拟合问题,所以第三章的前半部分大致读一下就略过了,重点放在了用于拟合问题的神经网络学习上,在书中给出的问题是:波士顿房价预测,房价预测也是吴恩达在讲述机器学习用于举例的第一个问题(为什么都喜欢用房价预测?)

数据集:

用的是keras自带的数据集,用代码即可加载。包含 506 个样本,分为 404 个训练样本和 102 个测试样本,每个样本13条属性,且都是连续值属性。

网络结构:

因为是讲解,选用3层bp神经网络,至于具体选用的优化器等参数,在程序的解释中会有。

评价指标:

网络损失值和绝对值误差

代码:

from keras import models
from keras import layers
import matplotlib.pyplot as plt
# 载入数据
from keras.datasets import boston_housing
(train_data, train_targets), (test_data, test_targets) = boston_housing.load_data()
print(train_data.shape)
# 数据预处理,去均值和除标准差得到平均值为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

# 网络模型选择序贯模型(可以自己去keras的中文文档中去查到序贯模型,就是一般的从前往后计算网络的一种普通模型)
model = models.Sequential()
model.add(layers.Dense(64, activation='relu', input_shape=(train_data.shape[1],))) #加入第一层网络,神经元64个,激活函数选择relu
model.add(layers.Dense(64, activation='relu')) #同上
model.add(layers.Dense(1)) #输出层,因为房价就是一个标量,所以就一个神经元
model.compile(optimizer='rmsprop', loss='mse', metrics=['mae']) #对网络进行编译,优化器选择rmsprop(以后会具体讲),损失计算使用均方误差(MSE, mean squared error),metrics是指在训练和测试期间的模型评估标准,选择平均绝对误差(MAE, mean absolute error)


num_epochs = 100  # 设置迭代次数

history = model.fit(train_data, train_targets, epochs=num_epochs*10, batch_size=50, verbose=1) #网络训练,使用的训练数据就是波士顿房价数据集,迭代次数是1000,每批输入数据是50,运行日志模式选1
fore_data = model.predict(test_data)  # 通过predict函数输出网络的预测值

plt.figure(1) # 图像1显示测试数据的房价和网络利用测试数据得到的预测房价
plt.plot(test_targets, label='real data')
plt.plot(fore_data, label='forecasting data')
plt.xlabel('epochs')
plt.ylabel('housing price')
plt.title('predict housing price')
plt.legend()

plt.figure(2) # 图像2显示网络训练过程中的损失值变化
plt.plot(history.history['loss'])
plt.title('loss')

plt.figure(3) # 图像3显示网络训练过程中的绝对值误差变化
plt.plot(history.history['mean_absolute_error'])
plt.title('mean absolute error')
plt.show()

注意:为什么在载入数据集之后要对数据做标准化处理

引书中原话:将取值范围差异很大的数据输入到神经网络中,这是有问题的。网络可能会自动适应这种取值范围不同的数据,但学习肯定变得更加困难。对于这种数据,普遍采用的最佳实践是对每个特征做标准化,即对于输入数据的每个特征(输入数据矩阵中的列),减去特征平均值,再除以标准差,这样得到的特征平均值为 0,标准差为 1。
其实很好理解,加入存在两个特征,一个特征的均值是100,而另一个特征的均值是1,将这些数据输入网络,由于数值大小的影响,导致了均值为100的特征对网络权值训练的影响要大,但是均值为1的特征影响就会很小,从数值大小去看一个特征的重要性显然是不对的,所以先对数据做标准化处理,使所有特征对神经网络权值训练的影响都差不多。

算法运行结果

使用keras框架编写三层神经网络解决房价预测问题_第1张图片
使用keras框架编写三层神经网络解决房价预测问题_第2张图片
使用keras框架编写三层神经网络解决房价预测问题_第3张图片

你可能感兴趣的:(深度学习,神经网络,keras,keras,神经网络,拟合问题)