TensorFlow学习笔记(5):多元线性回归问题,波斯顿房价预测

说明

此系列文档为学习中国大学mooc,浙江大学开设的《深度学习应用开发-TensorFlow实践》随堂笔记。

问题说明

在这里插入图片描述
样本集下载
提取码:mjwz

开始

  1. 读取数据
%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("D:/Program Files/Anaconda3/date/boston.csv",header=0)
#读取数据摘要
print(df.describe())

在这里插入图片描述

  1. 准备建模
  • 考虑用的模型
    在这里插入图片描述
    用矩阵运算简化代码:X*W+b

  • 机器学习中的线性代数知识
    在这里插入图片描述

  • shapenumpy里的概念
  • 有了矩阵的概念才有行向量列向量
  • np.array转换成矩阵
  • 矩阵乘法有两种: 1. 点乘(点积),规格需要相同.*或者np.multiply()。2.相乘(叉乘),A的列要和B的行数量相同.np.matmul
  • 矩阵.T就是它的转置。array.T
  1. 数据准备
  • 数据处理
df = np.array(df)
#x_date不包括12,为0-11
x_date=df[:,:12]
#y_date为12
y_date=df[:,12]
  • 定义训练数据占位符
x=tf.placeholder(tf.float32, [None,12],name='X')
x=tf.placeholder(tf.float32, [None,1],name='Y')

在这里插入图片描述

  1. 定义模型函数
#定义一个命名空间,节点打包一起
with tf.name_scope("Model"):
    # w 初始化值是shape=(12,1)12行,1列的随机数
    w=tf.Variable(tf.random_normal([12,1],stddev=0.01),name='W')
    b=tf.Variable(1.0,name='b')
    def model(x,w,b):
        return tf.matmul(x,w)+b
    pred=model(x,w,b)
  1. 训练模型
  • 超参数
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)

在这里插入图片描述

  1. 优化器中Feed数据必须和Placeholdershape一致
  • 开始训练
  • 启动会话
sess=tf.Session()
init=tf.global_variables_initializer()
sess.run(init)
  • 开始训练
for epoch in range(train_epochs):
    loss_sum=0
    #每次喂1个样本,喂506次为一轮
    for xs,ys in zip(x_date,y_date):
        xs=xs.reshape(1,12)
        ys=ys.reshape(1,1)
        _,loss=sess.run([optimizer,loss_function],feed_dict={x:xs,y:ys})
        loss_sum+=loss
    #打乱数据顺序,防止学习的是顺序而不是特征
    xvalues,yvalues=shuffle(x_date,y_date)
    btemp=b.eval(session=sess)
    wtemp=w.eval(session=sess)
    loss_ave=loss_sum/len(y_date)
    
    print("epoch=",epoch+1," loss=",loss_ave," b=",btemp," w=",wtemp)

  1. 结果为
    在这里插入图片描述
    可恶!!!!!!!!!!!!!
  • 问题各个w的比例关系,影响与取值范围的关系,
  • 解决方法:0-1归一化
#归一化,注意输出不要归一化
for i in range(12):
    df[:,i]=df[:,i]/(df[:,i].max()-df[:,i].min())
  1. 验证
for i in range(20):
    n=np.random.randint(506)
    x_test=x_date[n].reshape(1,12)
    predict=sess.run(pred,feed_dict={x:x_test})
    print("第%d条: 预测值:%f 标签值: %f"%(n,predict,y_date[n]))

ps:但是实际上数据集不能全部用于训练

  1. 加上tensorboard 可视化代码

end

附完整代码


# coding: utf-8

# In[1]:

get_ipython().magic('matplotlib notebook')

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.utils import shuffle

logdir='D:/log'


#读取文件
df=pd.read_csv("D:/Program Files/Anaconda3/date/boston.csv",header=0)
#读取数据摘要
print(df.describe())


# In[2]:

df = np.array(df)
#归一化
for i in range(12):
    df[:,i]=df[:,i]/(df[:,i].max()-df[:,i].min())
#x_date不包括12,为0-11
x_date=df[:,:12]
#y_date为12
y_date=df[:,12]


# In[3]:

x=tf.placeholder(tf.float32, [None,12],name='X')
y=tf.placeholder(tf.float32, [None,1],name='Y')


# In[4]:

#定义一个命名空间
with tf.name_scope("Model"):
    # w 初始化值是shape=(12,1)的随机数
    w=tf.Variable(tf.random_normal([12,1],stddev=0.01),name='W')
    b=tf.Variable(1.0,name='b')
    def model(x,w,b):
        return tf.matmul(x,w)+b
    pred=model(x,w,b)


# In[5]:

train_epochs= 50
learning_rate=0.01


# In[6]:

#损失函数
with tf.name_scope("LossFunction"):
    loss_function = tf.reduce_mean(tf.pow(y-pred,2))


# In[7]:

optimizer=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function)


# In[8]:

#创建一个操作,用于记录损失值loss,后面再tensorboard中的scalars可见
sum_loss_op=tf.summary.scalar("loss",loss_function)
#把所有需要记录摘要日志文件的合并,方便一次写入
merged=tf.summary.merge_all()


sess=tf.Session()
init=tf.global_variables_initializer()
sess.run(init)
#写入整个计算图
writer=tf.summary.FileWriter(logdir,sess.graph)


# In[9]:

for epoch in range(train_epochs):
    loss_sum=0
    #每次喂1个样本,喂506次为一轮
    for xs,ys in zip(x_date,y_date):
        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
    #打乱数据顺序,防止学习的是顺序而不是特征
    xvalues,yvalues=shuffle(x_date,y_date)
    btemp=b.eval(session=sess)
    wtemp=w.eval(session=sess)
    loss_ave=loss_sum/len(y_date)
    
    print("epoch=",epoch+1," loss=",loss_ave," b=",btemp," w=",wtemp)
writer.close()
        


# In[10]:

for i in range(20):
    n=np.random.randint(506)
    x_test=x_date[n].reshape(1,12)
    predict=sess.run(pred,feed_dict={x:x_test})
    print("第%d条: 预测值:%f 标签值: %f"%(n,predict,y_date[n]))
sess.close()


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值