多元线性回归:波士顿房价预测问题Tensorflow实战

引入需要的库

%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("data/boston.csv", header=0)

#显示数据摘要描述信息
print(df.describe())

在这里插入图片描述
载入需要的数据

#获取df的值
df = df.values
print(df)
#把df转换为np的数组格式
df = np.array(df)
print(df)

特征数据归一化

#对特征数据【0到11】列做(0-1)归一化
for i in range(12):
    df[:,i]=df[:,i]/(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)

定义模型
shape中None表示行的数量未知,在实际训练中决定一次迭代入多少行样本,从一个样本中的随机SDG到批量SDG都可以

#定义特征数据的占位符
x = tf.placeholder(tf.float32, [None, 12], name="X") # 12个特征数据(12列)

#定义标签的占位符
y = tf.placeholder(tf.float32, [None, 1], name="Y") # 1个标签数据(1列)

创建变量,定义模型

#定义一个命名空间
with tf.name_scope("Model"):
    
    # w 初始化值为shape=(12,1)的随机数
    w = tf.Variable(tf.random_normal([12,1], stddev=0.01), name="W")
    
    # b 初始化为1.0
    b = tf.Variable(1.0, name = "b")
    
    # w和x时矩阵相乘,用matmul(叉乘),不能用mutiply(点乘)或者*
    def model(x, w, b):
        return tf.matmul(x, w) + b
    
    #预测计算操作,前向计算节点
    pred = model(x, w, b)

训练模型
设置训练超参数

#迭代轮次
train_epochs = 150

#学习率
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()

#定义初始化变量的操作
init = tf.global_variables_initializer()

为TensorBoard可视化准备数据

#设置日志存储目录
logdir = 'F:/Jupyter_file/log'
#创建一个操作,用于记录损失值loss,后面在TensorBoard中SCALARS栏可见
sum_loss_op = tf.summary.scalar("loss", loss_function)

#把所有需要记录摘要日志文件的合并,方便一次性写入
merged = tf.summary.merge_all()

启动会话

sess.run(init)

创建摘要的文件写入器(FileWriter)

# 创建摘要writer,将计算图写入摘要文件,后面在TensorBoard中GRAPHS栏可见
writer = tf.summary.FileWriter(logdir,sess.graph)

迭代训练

#loss_list=[] #用于保存loss值的列表

for epoch in range (train_epochs):
    loss_sum = 0.0 #用来记录损失总和
    for xs, ys in zip(x_data, y_data): #该循环从x_data和y_data中分别取出一行数据赋值给xs和ysfle
        
        xs = xs.reshape(1, 12)
        ys = ys.reshape(1, 1)
        
        #feed数据必须和Placeholder的shape一致
        _, summary_str, loss = sess.run([optimizer, sum_loss_op, loss_function], feed_dict = {x: xs, y: ys})
        writer.add_summary(summary_str, epoch)
        loss_sum = loss_sum + loss
        #loss_list.append(loss)
        
    #打乱数据顺序,为下一轮做准备
    xvalues, yvalues = shuffle(x_data, y_data)
    
    b0temp = b.eval(session = sess)#获得当前b变量的值
    w0temp = w.eval(session = sess)#获得当前w变量的值
    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)

训练150轮后
在这里插入图片描述
应用模型预测

n = 250 #指定一条数据来看预测效果
x_test = x_data[n]

x_test = x_test.reshape(1,12)
predict = sess.run(pred, feed_dict = {x: x_test})
print("预测值:%f" % predict)
target = y_data[n]
print("标签值:%f" % target)

在这里插入图片描述

n = np.random.randint(506) #随机确定一条数据看预测效果
print(n)
x_test = x_data[n]

x_test = x_test.reshape(1,12)
predict = sess.run(pred, feed_dict = {x: x_test})
print("预测值:%f" % predict)
target = y_data[n]
print("标签值:%f" % target)

在这里插入图片描述
最后记得关闭会话

#关闭session

sess.close()
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值