多元线性回归问题的Tensorflow实践

波士顿房价预测

  • 波士顿房价数据集包括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)

建立模型

  • 房价和多个特征变量相关,本次建模尝试使用多元线性回归建模
  • 模型函数: y = x 1 w 1 + x 2 w 2 + . . . + x n w n + b = ∑ i = 1 n w i x i + b y = x_1w_1 + x_2w_2 +...+ x_nw_n + b = \sum_{i=1}^{n}{w_ix_i} + b y=x1w1+x2w2+...+xnwn+b=i=1nwixi+b
定义训练数据的占位符
# 定义训练数据占位符
# 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进入提示的网址即可

参考视频:深度学习应用开发TensorFlow实践

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值