波士顿房价预测
- 波士顿房价数据集包括506个样本,每个样本包括12个特征变量(特征)和该地区的平均房价(标签值)
- 房价(单价)显然和多个特征变量有关,不再是单变量线性回归问题
- 选择多个特征变量来建立线性方程,这就是多变量线性回归问题、
数据集解读
- CRIM:城市人均犯罪率
- ZN:住宅用地超过25000 sq.ft 的比例
- INDUS:城镇非零售商用土地的比例
- CHAS:边界是河流即该值为1,否则为0
- NOX:一氧化氮浓度
- RM:住宅平均房间数
- AGE:1940年之前建成的自用房屋比例
- DIS:到波士顿5个中心区域的加权距离(指郊区还是市区)
- RAD:辐射性公路的靠近指数
- TAX:每10000美元的全值财产税率
- PTRATIO:城镇师生比例
- LSTAT:人口中地位底下者的比例
- MEDV:自住房的平均房价,单位:千美元(要得到的预测值)
读取数据
导入模块包
%matplotlib notebook
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
# 读取文件的包
import pandas as pd
# 相当于洗牌 把顺序打乱
from sklearn.utils import shuffle
读取文件中的数据
# 读取数据文件
df = pd.read_csv("/Users/liuqi/Desktop/data/boston.csv", header=0)
# 显示数据摘要描述信息
print(df.describe())
# 把df转换为np的数组格式
df = np.array(df)
特征数据归一化 Min-Max Scaling
# Min-Max Scaling 最大值最小值归一化
for i in range(12):
df[:,i] = (df[:,i] - df[:,i].min())/(df[:,i].max()-df[:,i].min())
数据准备
# x_data 为前12列特征数据
x_data = df[:,:12]
# y_data 为最后1列标签数据
y_data = df[:,12]
print(x_data, '\n shape=', x_data.shape)
print(y_data, '\n shape=', y_data.shape)
建立模型
- 房价和多个特征变量相关,本次建模尝试使用多元线性回归建模
- 模型函数:
定义训练数据的占位符
# 定义训练数据占位符
# 12个特征数据(12列)
x = tf.placeholder(tf.float32, [None, 12], name = "x")
# 1个标签数据 (1列)
y = tf.placeholder(tf.float32, [None, 1], name = "y")
定义模型结构
# 创建变量、定义模型
# 定义了一个命名空间
with tf.name_scope("Model"):
# w 初始化值为一个12行、1列的随机数矩阵
w = tf.Variable(tf.random_normal([12, 1], stddev = 0.01), name = "w")
# 初始化b的值
b = tf.Variable(1.0, name = "b")
# 定义模型函数,w, x都是向量,使用矩阵相乘
def model(x, w, b):
return tf.matmul(x, w) + b
# 预测值
pred = model(x, w, b)
模型训练
设置训练超参数
# 设置训练参数、即训练轮次
train_epochs = 50
# 学习率
learning_rate = 0.01
定义均方差损失函数
# 定义均方差损失函数
# 定义损失函数
with tf.name_scope("LossFunction"):
loss_function = tf.reduce_mean(tf.pow(y-pred, 2))
梯度下降优化器
# 创建优化器
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function)
声明会话
# 声明会话
sess = tf.Session()
# 初始化变量
ini = tf.global_variables_initializer()
为TensorBoard可视化准备数据
# 设置日志存储目录
logdir = '/Users/liuqi/Desktop/log'
# 为TensorBoard可视化准备数据
# 创建一个操作,用于记录损失值loss,后面在TensorBoard中SCALARS栏可见
sum_loss_op = tf.summary.scalar("loss", loss_function)
# 把所有需要记录的摘要日志文件合并,方便一次性写入
merged = tf.summary.merge_all()
启动会话
sess.run(ini)
创建摘要的文件写入器(FileWriter)
# 创建摘要文件的写入器FileWriter
# 创建摘要writer,将计算图写入摘要文件,后面在TensorBoard中GRAPHS栏可见
writer = tf.summary.FileWriter(logdir, sess.graph)
迭代训练
# 开始迭代训练模型
loss_list = []
for epoch in range(train_epochs):
loss_sum = 0.0
for xs, ys in zip(x_data, y_data):
# 数据变形,要和PlaceHolder中的shape一致
xs = xs.reshape(1, 12)
ys = ys.reshape(1, 1)
_, summary_str, loss = sess.run([optimizer, sum_loss_op, loss_function], feed_dict={x:xs, y:ys})
writer.add_summary(summary_str, epoch)
# 计算本轮所有loss值的和
loss_sum = loss_sum + loss
# 打乱数据顺序
xvalues, yvalues = shuffle(x_data, y_data)
b0temp = b.eval(session = sess)
w0temp = w.eval(session = sess)
loss_average = loss_sum / len(y_data)
loss_list.append(loss_average)
print("epoch =", epoch + 1, "loss =", loss_average, "b =", b0temp, "w=", w0temp)
# 绘制损失图像
plt.plot(loss_list)
TensorBoard可视化:启动TensorBoard进入提示的网址即可