keras-boston房价回归

先简单介绍数据集,然后基于keras构建一个多层神经网络,实现对房价的回归预测。

波士顿房价数据集(Boston House Price Dataset)

[code: https://github.com/zylhub/More_Python/blob/e646b6bad152c09a15a003a674df6631c93e0963/keras_TOT/simple-network-boston.py ]

  • 每个类的观察值数量是均等的,共有 506 个观察,13 个输入变量和1个输出变量。
  • 每条数据包含房屋以及房屋周围的详细信息。其中包含城镇犯罪率,一氧化氮浓度,住宅平均房间数,到中心区域的加权距离以及自住房平均房价等等。
CRIM 城镇人均犯罪率
ZN 占地面积超过2.5万平方英尺的住宅用地比例
INDUS 城镇非零售业务地区的比例
CHAS 查尔斯河虚拟变量 (= 1 如果土地在河边;否则是0)
NOX 一氧化氮浓度(每1000万份)
RM 平均每居民房数
AGE 在1940年之前建成的所有者占用单位的比例
DIS 与五个波士顿就业中心的加权距离
RAD 辐射状公路的可达性指数
TAX 每10,000美元的全额物业税率
PTRATIO 城镇师生比例
B 1000(Bk - 0.63)^2 其中 Bk 是城镇的黑人比例
LSTAT 人口中地位较低人群的百分数
MEDV 以1000美元计算的自有住房的中位数

整个数据集包含13个特征,涵盖了用地情况、教育、人种、收入、环保、犯罪等多个方面。(这是一个标准数据集,特征包含的物理因素也是特征工程的参考。) 同时这是一个1970的数据集,出现的一些数据会和现在有明显的差异。

keras-boston房价回归_第1张图片

更多关于波士顿数据集介绍可以参考:http://www.cnblogs.com/wwwjjjnnn/p/7323862.html 或 http://sklearn.apachecn.org/cn/0.19.0/sklearn/datasets/descr/boston_house_prices.html

该数据集在sklearn和keras都内置了,直接调用,开箱即用。

# coding=utf-8
# ---------------------------
# @Time   : 17-12-24 上午9:01
# @Author : zylhub
# @File   : simple-network-boston.py       
# ---------------------------

from keras.datasets import boston_housing

# boston房价数据集,预测房价变化
(train_data, train_targets), (test_data, test_targets) = boston_housing.load_data()

print('train_data shape ', train_data.shape)
print('test_data.shape ', test_data.shape)

print('train_targets: ', train_targets)

# 预处理数据,转化为正态分布
mean = train_data.mean(axis=0)  # 求均值
train_data -= mean

std = train_data.std(axis=0)  # 求标准差
train_data /= std

test_data -= mean
test_data /= std

# 搭建模型

from keras import models
from keras import layers


def build_network():
    network = models.Sequential()
    network.add(layers.Dense(64, activation='relu', input_shape=(train_data.shape[1], )))
    network.add(layers.Dense(64, activation='relu'))
    network.add(layers.Dense(1))
    network.compile(optimizer='rmsprop', loss='mse', metrics=['mae'])  # 均方误差作为损失
    return network

# k-fold 验证 , 基于numpy实现
import numpy as np

k = 4
num_val_samples = len(train_data)//k
num_epochs = 500
all_scores = []
all_mae_histories = []

for i in range(k):
    print("processing fold #", i)
    # Prepare the validation data
    val_data = train_data[i*num_val_samples: (i+1)*num_val_samples]
    val_targets = train_targets[i*num_val_samples: (i+1)*num_val_samples]

    #Prepare the training dataa: data from all other partitions
    partial_train_data = np.concatenate(
                            [train_data[: i*num_val_samples],
                             train_data[(i+1)*num_val_samples:]],
                            axis=0
                            )
    partial_train_targets = np.concatenate(
                            [train_targets[: i*num_val_samples],
                             train_targets[(i+1)*num_val_samples:]],
                            axis=0
                            )
    network = build_network()
    # 记录每次迭代的训练集和验证集 acc和loss
    history = network.fit(partial_train_data, partial_train_targets, epochs=num_epochs,
                          batch_size=1, verbose=1,
                          validation_data=(val_data, val_targets))

    mae_history = history.history['val_mean_absolute_error']
    all_mae_histories.append(mae_history)
    # val_mse, val_mae = network.evaluate(val_data, val_targets, verbose=1)
    #
    # all_scores.append(val_mae)

# print('all_scores: ', all_scores)
# print('mean ', np.mean(all_scores))
average_mae_history = [np.mean([x[i] for x in all_mae_histories]) for i in range(num_epochs)]
print('average_mae_history: ', average_mae_history)

# Plotting validation scores
import matplotlib.pyplot as plt

plt.plot(range(1, len(average_mae_history)+1), average_mae_history)
plt.xlabel('Epochs')
plt.ylabel('Validation MAE')
plt.show()

# -------------------------------
plt.clf()

def smooth_curve(points, factor=0.9):
    smoothed_points = []
    for point in points:
        if smoothed_points:
            previous = smoothed_points[-1]
            smoothed_points.append(previous*factor + point*(1-factor))
        else:
            smoothed_points.append(point)
    return smoothed_points

smooth_mae_history = smooth_curve(average_mae_history[10:])

plt.plot(range(1, len(smooth_mae_history)+1), smooth_mae_history)
plt.xlabel('Epochs')
plt.ylabel('Validation MAE')
plt.show()

# 根据前面的MAE分析, epochs=80 会是一个合适的模型,下面重新训练模型

model = build_network()
model.fit(train_data, train_targets,
          epochs=80, batch_size=16, verbose=0)

test_mse_score, test_mae_score = model.evaluate(test_data, test_targets)

print('test_mae_score: ', test_mae_score)  # Mean Squared Error

keras-boston房价回归_第2张图片
myplot-1.png
keras-boston房价回归_第3张图片
myplot-2.png

你可能感兴趣的:(keras-boston房价回归)