多变量线性回归
概述
根据Boston房价问题展开的多元线性回归问题的实践,但因现实生活中,对房价有影响的因素实在是太多了,因此,本例中的模型不能完全的概括完整房价的变化情况,但是通过这个实例,我们可以更好的掌握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
通过Pandas导入数据
# 读取数据文件
df=pd.read_csv("data/boston.csv",header=0)
#显示数据摘要描述信息
print(df.describe())
载入本例所需数据
相关数据下载
# 获取df的值
df=df.values
# 把df转换为np的数组格式
df=np.array(df)
特征数据归一化
# 对特征数据[0~11]列做(0-1)归一化处理
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]
构建模型
定义占位符
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=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()
init=tf.global_variables_initializer()
模型训练
loss_list=[] # 用于保存loss值的列表
for epoch in range(train_epochs):
loss_sum=0.0
for xs,ys in zip(x_data,y_data):
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_sum=loss_sum+loss
# 打乱数据顺序
x_data,y_data=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)
print("epoch=",epoch+1)
检测模型
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)
可视化
plt.plot(loss_list)
.png)