Keras深度学习实战——房价预测
Posted 盼小辉丶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Keras深度学习实战——房价预测相关的知识,希望对你有一定的参考价值。
Keras深度学习实战(8)——房价预测
0. 前言
我们已经学习了神经网络的基本概念,并且已经使用 Keras
构建神经网络模型用于手写数字的识别。本节中,我们将通过预测房价信息,来了解如何使用神经网络解决连续变量的预测问题。
1. 任务与模型分析
1.1 波士顿房价数据集
在本节中使用 Boston
房价数据集, 该数据集包含美国马萨诸塞州波士顿住房价格的有关信息,是常用的研究连续输出问题的数据集,在 Keras
中包含调用此数据集的方法。数据集中,每个住房的属性信息如下表所示:
属性 | 描述 |
---|---|
CRIM | 城镇犯罪率 |
ZN | 住宅用地所占比例 |
INDUS | 城镇中非商业用地占比例 |
CHAS | Charles River 变量,如果住房在河边,则为1,否则为 |
NOX | 一氧化氮浓度 |
RM | 每间住宅的房间数 |
AGE | 在1940年之前建造的自住单位比例 |
DIS | 与波士顿的五个就业中心的加权距离 |
RAD | 距离高速公路的便利指数 |
TAX | 每 10000 美元的全额物业税率 |
PTRATIO | 城镇中教师与学生比例 |
B | 1000 ( B k − 0.63 ) 2 1000(B_k - 0.63)^2 1000(Bk−0.63)2 其中 B k B_k Bk 是城镇中黑人比例 |
LSTAT | 人口中房东属于低等收入阶层比例 |
MEDV | 自有住房的中位数报价, 单位1000美元(此属性作为我们需要预测的房价变量,即目标变量) |
在本节中,我们将使用前 13
个属性来预测最后一个属性——房屋价格。
1.2 神经网络分析
模型的目标是通过尝试预测房屋的价格来研究连续输出问题,以可能影响房屋价格的 13
个变量作为输入。我们的目的是最大程度地减少我们预测房屋价格的误差。
鉴于目标是最小化误差,我们定义将要最小化的误差——绝对误差,或者也可以最小化平方误差。有了需要优化的目标后,接下来,定义解决这个问题的策略:
- 标准化输入数据集,将所有变量的范围缩放到
0-1
之间。 - 将给定数据拆分为训练和测试数据集。
- 神经网络模型使用一个隐藏层
- 使用
Adam
优化器编译模型,并定义损失函数为平均绝对误差值 - 拟合模型
- 对测试数据集进行预测
- 计算测试数据集预测中的误差
2. 使用神经网络实现房价预测
我们已经定义了模型方法,接下来,我们在代码中实现它。
- 导入相关的数据集:
from keras.datasets import boston_housing
import numpy as np
(train_data, train_targets), (test_data, test_targets) = boston_housing.load_data()
- 标准化输入和输出数据集,以便所有变量的范围从
0
到1
:
max_target = np.max(train_targets)
train_data2 = train_data/np.max(train_data,axis=0)
test_data2 = test_data/np.max(train_data,axis=0)
train_targets = train_targets/max_target
test_targets = test_targets/max_target
我们使用训练数据集中的最大值标准化测试数据集,因为在模型构建过程中不应使用测试数据集中的任何值。
- 准备好输入和输出数据集后,定义模型:
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.utils import np_utils
from keras.regularizers import l1
model = Sequential()
model.add(Dense(64, input_dim=13, activation='relu', kernel_regularizer=l1(0.1)))
model.add(Dense(1, activation='relu', kernel_regularizer=l1(0.1)))
model.summary()
该模型的简要信息输出如下:
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense (Dense) (None, 64) 896
_________________________________________________________________
dense_1 (Dense) (None, 1) 65
=================================================================
Total params: 961
Trainable params: 961
Non-trainable params: 0
_________________________________________________________________
我们在模型构建过程中执行了 L1
正则化,因此模型不会过拟合(训练数据中的数据点数量很少)。
- 编译模型以最小化平均绝对误差值:
model.compile(loss='mean_absolute_error', optimizer='adam')
- 最后,拟合模型:
history = model.fit(train_data2,
train_targets,
validation_data=(test_data2, test_targets),
epochs=100,
batch_size=64,
verbose=1)
- 计算并打印测试数据集上的平均绝对误差:
print(np.mean(np.abs(model.predict(test_data2) - test_targets))*50)
可以看到,平均绝对误差约为 7.7
。
7.670271360777928
在下一节中,将学习使用自定义损失函数,以进一步降低平均绝对误差值。
3. 使用自定义损失函数
在上一节中,我们使用预定义的平均绝对误差损失函数来执行目标优化。在本节中,我们将学习如何使用自定义损失函数。我们将使用的自定义损失函数是一个修正的均方误差值,其中误差是实际值的平方根与预测值的平方根之差:
def loss_function(y_true, y_pred):
return K.square(K.sqrt(y_pred) - K.sqrt(y_true))
接下来,在拟合过程中使用自定义损失函数,使用与上一节中相同的输入、输出数据集以及神经网络模型,编译模型:
model.compile(loss=loss_function, optimizer='adam')
在前面的代码中,我们将损失函数定义为自定义损失函数 loss_function
,最后拟合模型,并计算模型在测试数据集上的损失值。
history = model.fit(train_data2, train_targets,
validation_data=(test_data2, test_targets),
epochs=100,
batch_size=64,
verbose=1)
print(np.mean(np.abs(model.predict(test_data2) - test_targets))*50)
拟合模型后,可以看到平均绝对误差约为 6.6
,这比使用 mean_absolute_error
损失函数的要小一些:
6.566271535383652
小结
在本节中,我们探索了神经网络的实际应用,使用 Boston
房价数据集,通过尝试预测房屋的价格来研究连续输出问题,并学习了如何在网络训练过程中使用自定义损失函数。
系列链接
Keras深度学习实战(1)——神经网络基础与模型训练过程详解
Keras深度学习实战(2)——使用Keras构建神经网络
Keras深度学习实战(3)——神经网络性能优化技术
Keras深度学习实战(4)——深度学习中常用激活函数和损失函数详解
Keras深度学习实战(5)——批归一化详解
Keras深度学习实战(6)——深度学习过拟合问题及解决方法
Keras深度学习实战(7)——信用预测
以上是关于Keras深度学习实战——房价预测的主要内容,如果未能解决你的问题,请参考以下文章