线性回归预测波士顿房屋价格

629 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

对于波士顿房屋价格的预测,我们首先需要简单了解一下数据集包含哪些属性,每个属性的作用是什么,然后才能设计模型实现房屋价格的预测。

数据集属性及其简单介绍

['crim', 'zn', 'indus', 'chas', 'nox', 'rm', 'age', 'dis', 'rad', 'tax', 'ptratio', 'b', 'lstat']
['人均犯罪', '用地比例', '非商业地', '河', '环保指标', '房间数', '老房子比例', '波士顿街区距离', '交通便利', '税率', '教师学生比', '低收入人群比', '低收入房东比']

对于每个属性所对应的简单介绍代码里面以列表的形式写好了,在此处特别说明一下,就不做过多的解释。

然后就直接上代码

import tensorflow as tf
import pandas as pd
from tensorflow import feature_column as fc
from tensorflow.keras.datasets import boston_housing
import matplotlib.pyplot as plt
import seaborn as sns
# 加载波士顿房屋数据集
(x_train, y_train), (x_test, y_test) = boston_housing.load_data()


# 查看数据
train = pd.DataFrame(x_train)
train.columns=['crim', 'zn', 'indus', 'chas', 'nox', 'rm', 'age', 'dis', 'rad', 'tax', 'ptratio', 'b', 'lstat']
train.columns=['人均犯罪', '用地比例', '非商业地', '河', '环保指标', '房间数', '老房子比例', '波士顿街区距离', '交通便利', '税率', '教师学生比', '低收入人群比', '低收入房东比']
# print(train)

# 定义数据的特征,利用Panda转换为EXCEL中的行列格式
features = ['crim', 'zn', 'indus', 'chas', 'nox', 'rm', 'age', 'dis', 'rad', 'tax', 'ptratio', 'b', 'lstat']
x_train_prc = pd.DataFrame(x_train, columns=features)
x_test_prc = pd.DataFrame(x_test, columns=features)
# 我们希望预测的变量
y_train_prc = pd.DataFrame(y_train, columns=["MEDV"])
y_test_prc = pd.DataFrame(y_test, columns=["MEDV"])
# 房屋总价分布直方图
plt.hist(y_train_prc, bins=50, color='steelblue')

# print(y_train_prc)

'''上篇博客中提到的两个重要点,特征行和输入函数'''
# 创建特征行
features_columns = []
for item in features:
    features_columns.append(fc.numeric_column(item, dtype=tf.float32))
# print(features_columns[0])

# 用估算器创建输入函数
def estimator_input_function(dataset, labels, epochs=20, shuffle=True, bach_size=50):
    def input_function():
        # 切分传入Tensor的第一个维度,生成相应的dataset,此处是利用除了MEDV之外的属性联合作为字典主键,MEDV作为字典的value值
        ds = tf.data.Dataset.from_tensor_slices((dict(dataset), labels))
        # 随机打乱数据集
        if shuffle:
            ds = ds.shuffle(100)
        # 按照epoch大小拷贝数据集
        ds = ds.batch(bach_size).repeat(epochs)
        return ds
    return input_function
# 喂数据
train_input_function = estimator_input_function(x_train_prc, y_train_prc)
val_input_function = estimator_input_function(x_test_prc, y_test_prc, epochs=1, shuffle=False)
# 线性回归模型训练
linear_estimator = tf.estimator.LinearRegressor(feature_columns=features_columns)
linear_estimator.train(train_input_function, steps=100)
# 模型评估
result = linear_estimator.evaluate(val_input_function)
resultV = linear_estimator.predict(val_input_function)

for pre, exp in zip(resultV, y_test[:50]):
    print("predict value:", pre['predictions'][0], "expected:", exp)

# 各个属性的相关性热力图
fig=plt.figure(figsize=(12, 12))
sns.heatmap(x_train_prc.corr(),vmax=1,square=True,annot=True)
plt.show()

代码中部分打印我做了注释,根据自行需要查看打印结果 代码中为了方便数据的展示,我加入了柱状图查看了房屋总价的分布图,以及各个属性相关的热力图。

房屋价格分布图如下所示

1.PNG

各个属性相关度热力图如下所示

2.PNG

tensorboard图如下所示,可能比较小,毕竟图太大不好截取。

3.PNG