Keras深度学习——使用神经网络进行房价预测

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第18天,点击查看活动详情

房价预测

在本节中,我们将通过尝试预测房屋的价格来研究连续输出问题。使用 Boston 房价数据集,以可能影响房屋价格的13个变量作为输入。我们的目的是最大程度地减少我们预测房屋价格的误差。探索神经网络的实际应用。

鉴于目标是最小化误差,我们定义将要最小化的误差——绝对误差,或者也可以最小化平方误差。既然我们已经有了需要优化的目标,让我们定义解决这个问题的策略:

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

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

  1. 导入相关的数据集:
from keras.datasets import boston_housing
import numpy as np
(train_data, train_targets), (test_data, test_targets) = boston_housing.load_data()
复制代码
  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
复制代码

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

  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
复制代码

在下一节中,将学习使用自定义损失函数,以进一步降低平均绝对误差值。

使用自定义损失函数

在上一节中,我们使用预定义的平均绝对误差损失函数来执行目标优化。在本节中,我们将学习使用定义自定义损失函数。

我们将使用的自定义损失函数是一个修正的均方误差值,其中误差是实际值的平方根与预测值的平方根之差。自定义损失函数定义如下:

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
复制代码

猜你喜欢

转载自juejin.im/post/7088693496931958797