深度学习入坑笔记之一----房价预测

实战房价预测问题

本文数据来自tensorflow教程官网。
房价预测问题属于监督学习的一种。所谓监督学习,是指给定一组输入x和输出y的训练集,学习y和x之间的函数关系。通常情况下,输出y很难自动收集,需要由人来提供“监督”,因此成为监督学习,不过该术语也适用于训练集目标可以被自动收集的情况。

目录

数据的录入
搭建模型
训练模型
预测房价

数据的录入

房价预测的深度学习,首先要有原始的数据及对应的标签,这是模型学习的基础。通过让计算机不断匹配原始数据与相应标签,得到一组合适的数学模型,再利用学习好的数学模型,根据新的数据去进行预测接下来的房价走势。这就是本章节的主要内容。

数据输入

根据tensorflow的官方教程,数据输入方式大体可以分为以下几种:
(1)预加载数据:此方式适用于数据量较小时使用,直接在程序中定义常量或者变量保持数据;
(2)数据供给feeding:通过给run()函数输入feed_dict参数的方式将数据传输到占位符placeholder中,再启动运算;
(3)从文件读取数据:该方法读取数据代表Tensorflow图的开始,让一个输入路线从文件读取开始。常用的读取格式有TFRecord和CSV两种,本章采用读取CSV文件。
(4)网上直接下载数据,本章内容涉及数据即直接从网上下载得到。

首先加载数据库

import warnings
warnings.filterwarnings('ignore') #忽略运行过程中的警告命令

#加载数据库
import tensorflow as tf
from tensorflow import keras
import numpy as np
print(tf.__version__)
1.14.0

下载数据波士顿房价数据信息

boston_housing = keras.datasets.boston_housing
(train_data, train_labels, test_data, test_labels) = boston_housing.load_data()
#波士顿房价数据下载,包含了训练数据、训练标签、测试数据、测试标签
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/boston_housing.npz
57344/57026 [==============================] - 0s 0us/step

到这一步为止,训练所需数据即下载完毕。

接下来检查以下下载的数据内容:

print("Training set: {}".format(train_data.shape))  # 404 examples, 13 features
print("Testing set:  {}".format(test_data.shape))   # 102 examples, 13 features
Training set: (404, 13)
Testing set:  (102, 13)

数据总共包含506个样本,其中训练样本为404个,测试样本为102个。这些样本包含13个特征属性,这里不一一罗列。

数据标签
标签及房价,在数据集中代表已有数据对应的房价,在未来的模型中及代表预测的房价,即回归问题的目标。

print(train_labels[0:10])  # Display first 10 entries
[32.  27.5 32.  23.1 50.  20.6 22.6 36.2 21.8 19.5]

数据标准化

打开数据集可以发现,房屋的特征参数在数值上差距巨大,且单位标准不一,这会影响到模型计算结果,因此在建立模型之前需要将量纲统一为1,即数据归一化处理。

mean = train_data.mean(axis=0)
std = train_data.std(axis=0)
train_data = (train_data - mean) / std
test_data = (test_data - mean) / std

print(train_data[0])  # First training sample, normalized

归一化的计算公式即:特征值减去平均值的差除以标准偏差

模型的搭建
def build_model():      #建立模型,给模型添加层,本示例全部采用全连接层,并结合relu激活函数
  model = keras.Sequential([
    keras.layers.Dense(64, activation=tf.nn.relu, 
                       input_shape=(train_data.shape[1],)),
    keras.layers.Dense(64, activation=tf.nn.relu),
    keras.layers.Dense(1)
  ])

  optimizer = tf.train.RMSPropOptimizer(0.001) #采用RMSProp算法,学习率为0.001

#采用均方误差作为损失函数
  model.compile(loss='mse',
                optimizer=optimizer,
                metrics=['mae'])
  return model

model = build_model()
model.summary()  #输出网络结构
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense (Dense)                (None, 64)                896       
_________________________________________________________________
dense_1 (Dense)              (None, 64)                4160      
_________________________________________________________________
dense_2 (Dense)              (None, 1)                 65        
=================================================================
Total params: 5,121
Trainable params: 5,121
Non-trainable params: 0
_________________________________________________________________
训练模型

我们把模型训练次数设定为500,并且每完成一次训练,打印一个“.”,训练过程如下:

# Display training progress by printing a single dot for each completed epoch.
class PrintDot(keras.callbacks.Callback):
  def on_epoch_end(self,epoch,logs):
    if epoch % 100 == 0: print('')
    print('.', end='')

EPOCHS = 500

# Store training stats
history = model.fit(train_data, train_labels, epochs=EPOCHS,
                    validation_split=0.2, verbose=0,
                    callbacks=[PrintDot()])

训练过程的数据都保存在了history里面,现在通过matplotlib将图像表示出来,比较一下训练结果和测试结果的不同:

import matplotlib.pyplot as plt


def plot_history(history):
  plt.figure()
  plt.xlabel('Epoch')
  plt.ylabel('Mean Abs Error [1000$]')
  plt.plot(history.epoch, np.array(history.history['mean_absolute_error']), 
           label='Train Loss')
  plt.plot(history.epoch, np.array(history.history['val_mean_absolute_error']),
           label = 'Val loss')
  plt.legend()
  plt.ylim([0,5])

plot_history(history)

在这里插入图片描述

[loss, mae] = model.evaluate(test_data, test_labels, verbose=0)

print("Testing set Mean Abs Error: ${:7.2f}".format(mae * 1000))
Testing set Mean Abs Error: $2679.54

误差为2600附近,相较于房价而言,这个误差是偏大的。

房价预测
test_predictions = model.predict(test_data).flatten()

print(test_predictions)
[ 7.832362  18.450851  22.45164   34.88103   27.348196  22.26736
 26.963049  21.669811  19.895964  22.601202  19.965273  17.110151
 16.567072  44.0524    21.04799   21.103464  26.45786   18.709482
 20.825438  27.020702  11.160862  13.017411  22.807884  16.611425
 21.076998  26.213572  32.766167  32.652153  11.298579  20.164223
 19.82201   14.905633  34.83156   24.764723  19.957857   8.5664625
 16.906912  17.79298   18.071428  26.850712  32.625023  29.406805
 14.310859  44.013615  31.179125  28.41265   28.72704   19.22457
 23.301258  23.555346  37.15091   19.271719  10.640091  14.898285
 36.21053   29.63736   12.255004  50.43345   37.141464  26.562092
 25.075682  15.84047   15.081948  20.062723  25.168509  21.119642
 14.220254  22.637339  12.629622   7.517413  25.981508  30.909727
 26.12176   12.866787  25.869745  18.303373  19.470121  24.58047
 36.444992  10.777396  22.28932   37.976543  16.47492   14.191712
 18.707952  19.026419  21.038057  20.713434  21.794077  32.14987
 22.412184  20.55821   27.877415  44.4067    38.00193   21.748753
 35.57821   45.50506   26.612532  48.747063  34.60436   20.451048 ]

想要获得较好的预测数据,我们需要更大的数据集进行训练。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐