TensorFlow实战——多变量线性回归


多变量线性回归

概述

根据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)


文章作者: Amonologue
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Amonologue !
  目录