Keras深度学习实战——房价预测

0. 前言

我们已经学习了神经网络的基本概念,并且已经使用 Keras 构建神经网络模型用于手写数字的识别。本节中,我们将通过预测房价信息,来了解如何使用神经网络解决连续变量的预测问题。

1. 任务与模型分析

1.1 波士顿房价数据集

在本节中使用 Boston 房价数据集, 该数据集包含美国马萨诸塞州波士顿住房价格的有关信息,是常用的研究连续输出问题的数据集,在 Keras 中包含调用此数据集的方法。数据集中,每个住房的属性信息如下表所示:

属性 描述
CRIM 城镇犯罪率
ZN 住宅用地所占比例
INDUS 城镇中非商业用地占比例
CHAS Charles River 变量,如果住房在河边,则为1,否则为0
NOX 一氧化氮浓度
RM 每间住宅的房间数
AGE 在1940年之前建造的自住单位比例
DIS 与波士顿的五个就业中心的加权距离
RAD 距离高速公路的便利指数
TAX 每 10000 美元的全额物业税率
PTRATIO 城镇中教师与学生比例
B 1000 ( B k − 0.63 ) 2 1000(B_k - 0.63)^2 1000(Bk0.63)2 其中 B k B_k Bk 是城镇中黑人比例
LSTAT 人口中房东属于低等收入阶层比例
MEDV 自有住房的中位数报价, 单位1000美元(此属性作为我们需要预测的房价变量,即目标变量)

在本节中,我们将使用前 13 个属性来预测最后一个属性——房屋价格。

1.2 神经网络分析

模型的目标是通过尝试预测房屋的价格来研究连续输出问题,以可能影响房屋价格的 13 个变量作为输入。我们的目的是最大程度地减少我们预测房屋价格的误差。
鉴于目标是最小化误差,我们定义将要最小化的误差——绝对误差,或者也可以最小化平方误差。有了需要优化的目标后,接下来,定义解决这个问题的策略:

  • 标准化输入数据集,将所有变量的范围缩放到 0-1 之间。
  • 将给定数据拆分为训练和测试数据集。
  • 神经网络模型使用一个隐藏层
  • 使用 Adam 优化器编译模型,并定义损失函数为平均绝对误差值
  • 拟合模型
  • 对测试数据集进行预测
  • 计算测试数据集预测中的误差

2. 使用神经网络实现房价预测

我们已经定义了模型方法,接下来,我们在代码中实现它。

  1. 导入相关的数据集:
from keras.datasets import boston_housing
import numpy as np
(train_data, train_targets), (test_data, test_targets) = boston_housing.load_data()
  1. 标准化输入和输出数据集,以便所有变量的范围从 01
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

我们使用训练数据集中的最大值标准化测试数据集,因为在模型构建过程中不应使用测试数据集中的任何值。

  1. 准备好输入和输出数据集后,定义模型:
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 正则化,因此模型不会过拟合(训练数据中的数据点数量很少)。

  1. 编译模型以最小化平均绝对误差值:
model.compile(loss='mean_absolute_error', optimizer='adam')
  1. 最后,拟合模型:
history = model.fit(train_data2,
                    train_targets,
                    validation_data=(test_data2, test_targets),
                    epochs=100,
                    batch_size=64,
                    verbose=1)
  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深度学习实战——信用预测
Keras深度学习实战——新闻文本分类
Keras深度学习实战——音频分类
Keras深度学习实战——股价预测

猜你喜欢

转载自blog.csdn.net/LOVEmy134611/article/details/122430093