Tensorflow之多元线性回归问题(以波士顿房价预测为例)

一、根据波士顿房价信息进行预测,多元线性回归+特征数据归一化

#读取数据
%matplotlib notebook

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np                           
import pandas as pd                       #能快速读取常规大小的文件。Pandas能提供高性能、易用的数据结构和数据分析工具
from sklearn.utils import shuffle             #随机打乱工具,将原有序列打乱,返回一个全新的顺序错乱的值

#读取数据文件
df = pd.read_csv("data/boston.csv",header=0)

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


#数据准备

#获取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]

#模型定义

#定义特征数据和标签数据的占位符
#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列)

#定义模型函数
#定义了一个命名空间.
#命名空间name_scope,Tensoflow计算图模型中常有数以千计节点,在可视化过程中很难一下子全部展示出来/
    #因此可用name_scope为变量划分范围,在可视化中,这表示在计算图中的一个层级
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()

#启动会话
sess.run(init)

#迭代训练
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)
        #feed数据必须和Placeholder的shape一致
        _,loss = sess.run([optimizer,loss_function],feed_dict={x:xs,y:ys})
        
        loss_sum = loss_sum + loss
    #打乱数据顺序,防止按原次序假性训练输出
    x_data,y_data = shuffle(x_data,y_data)
    
    b0temp = b.eval(session=sess)            #训练中当前变量b值
    w0temp = w.eval(session=sess)            #训练中当前权重w值
    loss_average = loss_sum/len(y_data)      #当前训练中的平均损失
    
    print("epoch=",epoch+1,"loss=",loss_average,"b=",b0temp,"w=",w0temp)

#模型应用
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)

 

二、根据波士顿房价信息进行预测,多元线性回归+特征数据归一化+可视化

#读取数据
%matplotlib notebook

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np                           
import pandas as pd                       #能快速读取常规大小的文件。Pandas能提供高性能、易用的数据结构和数据分析工具
from sklearn.utils import shuffle             #随机打乱工具,将原有序列打乱,返回一个全新的顺序错乱的值

#读取数据文件
df = pd.read_csv("data/boston.csv",header=0)

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


#数据准备

#获取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]

#模型定义

#定义特征数据和标签数据的占位符
#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列)

#定义模型函数
#定义了一个命名空间.
#命名空间name_scope,Tensoflow计算图模型中常有数以千计节点,在可视化过程中很难一下子全部展示出来/
    #因此可用name_scope为变量划分范围,在可视化中,这表示在计算图中的一个层级
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()

#启动会话
sess.run(init)

#迭代训练
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)
        #feed数据必须和Placeholder的shape一致
        _,loss = sess.run([optimizer,loss_function],feed_dict={x:xs,y:ys})
        
        loss_sum = loss_sum + loss
    
        loss_list.append(loss)     #每步添加一次
    #打乱数据顺序,防止按原次序假性训练输出
    x_data,y_data = 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)

#模型应用
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)

 

三、根据波士顿房价信息进行预测,多元线性回归+特征数据归一化+可视化+TensorBoard可视化

#读取数据
%matplotlib notebook

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np                           
import pandas as pd                       #能快速读取常规大小的文件。Pandas能提供高性能、易用的数据结构和数据分析工具
from sklearn.utils import shuffle             #随机打乱工具,将原有序列打乱,返回一个全新的顺序错乱的值

#读取数据文件
df = pd.read_csv("data/boston.csv",header=0)

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


#数据准备

#获取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]

#模型定义

#定义特征数据和标签数据的占位符
#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列)

#定义模型函数
#定义了一个命名空间.
#命名空间name_scope,Tensoflow计算图模型中常有数以千计节点,在可视化过程中很难一下子全部展示出来/
    #因此可用name_scope为变量划分范围,在可视化中,这表示在计算图中的一个层级
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()


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

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

#启动会话
sess.run(init)

#创建摘要的文件写入器
#创建摘要writer,将计算图写入摘要文件,后面在Tensorflow中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):
        
        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)     #每步添加一次
    #打乱数据顺序,防止按原次序假性训练输出
    x_data,y_data = 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)

#模型应用
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)

                                                                                                                        

                                                                       ———网易云课堂《深度学习应用开发Tensorflow实践》学习记录

posted @ 2018-11-11 22:01  泰初  阅读(6067)  评论(5编辑  收藏  举报