使用Tensorflow训练线性回归模型并进行预测

标签: Python Tensorflow | 发表时间:2017-08-10 17:30 | 作者:蓝鲸
出处:http://bluewhale.cc

Tensorflow是Google开发的开源机器学习库。本篇文章我们将使用Tensorflow对线性回归模型进行训练,并使用模型对数据进行预测。下面我们开始分步骤介绍。

TF Linear Regression

首先导入所需的库文件,包括tensorflow,numpy和matplotlib。Tensorflow用于创建和训练线性回归模型,numpy用于提取数据和计算均方误差MSE,matplotlib用于绘制成本函数变化图。

#导入所需库文件
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

 

模拟最简单的一种情况,简单线性回归,一个自变量和一个因变量。自变量为广告花费,因变量为获得的点击量。手动创建这两组数据,用于训练和评估模型效果。格式为float32。

#设置广告花费和点击量数据
money=np.array([[109],[82],[99], [72], [87], [78], [86], [84], [94], [57]]).astype(np.float32)
click=np.array([[11], [8], [8], [6],[ 7], [7], [7], [8], [9], [5]]).astype(np.float32)

 

用最简单的方法将数据集划分为训练集数据和测试集数据。

#粗糙划分训练集和测试集数据
X_test = money[0:5].reshape(-1,1)
y_test = click[0:5]
X_train = money[5:].reshape(-1,1)
y_train = click[5:]

 

下面开始实现简单回归模型,设置自变量x的占位符,后面进行梯度下降时将作为真实数据输入模型的入口点。同时设置模型的参数权重值W和偏置量b。我们将赋予参数不同的值来试图找到最小化成本函数的取值。

#设置自变量x的占位符,梯度下降时真实数据输入到模型的入口点
x=tf.placeholder(tf.float32,[None,1])
#设置斜率(权重值)W变量
W=tf.Variable(tf.zeros([1,1]))
#设置截距(偏置量)b变量
b=tf.Variable(tf.zeros([1]))

 

然后设置Tensorflow中的简单线性回归模型y=Wx+b

#设置线性模型y=Wx+b
y=tf.matmul(x,W)+b

 
与设置自变量x的占位符一样,设置一个占位符作为实际y值的入口点。同时用于后续成本函数(最小方差)的计算。

#设置占位符用于输入实际的y值
y_=tf.placeholder(tf.float32,[None,1])

 
使用最小方差作为成本函数用于评估我们模型的效果。然后使用梯度下降算法以0.000001的学习速率尽量最小化这个成本函数。

#设置成本函数(最小方差)
cost=tf.reduce_sum(tf.pow((y_-y),2))
#使用梯度下降,以0.000001的学习速率最小化成本函数cost,以获得W和b的值
train_step=tf.train.GradientDescentOptimizer(0.000001).minimize(cost)

 
开始训练我们的模型,首先对所有变量进行初始化,防止带有之前执行过程中的残留值。然后创建一个会话(Sess),并在这个会话中启动我们的模型。

#开始训练前对变量进行初始化
init=tf.global_variables_initializer()
#创建一个会话(Sess)
sess=tf.Session()
#在Sess中启用模型并初始化变量
sess.run(init)

 
创建一个空list,用来存储模型训练过程中每一步成本函数cost的变化。

#创建一个空list用于存放成本函数的变化
cost_history=[]

 

开始训练模型,这里让模型循环训练100次。并输出每次训练后模型的参数和成本函数cost。以及最终的模型参数W,b和成本函数。

#循环训练模型100次
for i in range(100):
    feed={x:X_train,y_:y_train}
    sess.run(train_step,feed_dict=feed)
    #存储每次训练的cost值
    cost_history.append(sess.run(cost,feed_dict=feed))
    #输出每次训练后的W,b和cost值
    print("After %d iteration:" %i)
    print("W: %f" % sess.run(W))
    print("b: %f" % sess.run(b))
    print("cost: %f" % sess.run(cost,feed_dict=feed))
#输出最终的W,b和cost值
print("W_Value: %f" % sess.run(W),"b_Value: %f" % sess.run(b),"cost_Value: %f" % sess.run(cost,feed_dict=feed))

 

简单回归模型输出

在训练模型的过程中,我们存储了每次迭代后成本函数cost的变化情况,下面对这个过程进行可视化。在最开始成本函数为234,随着迭代次数的增加成本函数收敛在1.04。

#绘制成本函数cost在100次训练中的变化情况
plt.plot(range(len(cost_history)),cost_history)
plt.axis([0,100,0,np.max(cost_history)])
plt.xlabel('training epochs')
plt.ylabel('cost')
plt.title('cost history')
plt.show()

 

简单线性回归cost history

完成训练后,我们使用模型进行预测,输入x值为109。模型反馈预测值为9.84。这个x值其实就是测试集的第一个值。而真实的y值应为11。预测值与实际值之间存在着一定的误差。这个误差也是衡量模型效果的一个重要的指标。

#使用模型进行预测
sess.run(y, feed_dict={x: [[109]]})

 

使用模型进行预测

我们使用模型对测试集进行预测,并将所有的预测值与实际值进行比较,计算均方误差MSE来衡量模型的表现。MSE的值越小,说明预测模型具有更好的精确度。这里我们训练的模型均方误差MSE为0.7130。

#使用测试集计算模型的均方误差MSE
pred_y = sess.run(y, feed_dict={x: X_test})
mse = tf.reduce_mean(tf.square(pred_y - y_test))
print("MSE: %.4f" % sess.run(mse))

 

简单回归MSE

下面我们以图表的方式更加直观的显示出模型在测试集上的表现,其中图表的X轴为实际y值,Y轴为预测值。虚线为学习回归线,为拟合所有数据点的最优曲线。

#绘制测试集真实点击量与预测点击量及学习回归线
fig, ax = plt.subplots()
ax.scatter(y_test, pred_y)
ax.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'k--', lw=1.5)
ax.set_xlabel('Measured')
ax.set_ylabel('Predicted')
plt.show()

简单线性回归学习曲线

 

到这里,我们完成了使用Tensorflow对简单回归模型进行训练,评估和预测的过程。在实际生活中,只依靠一个特征进行预测的情况非常少见,通常情况下预测要依靠多个特征才能完成。因此,我们下面从一个特征的简单线性回归模型升级到两个特征的多元线性回归模型。按照下面的方法,你也可以应用到有多个特征的线性回归模型。

多元线性回归与前面简单线性回归类似,因此相同的步骤我们在代码上进行注释。只对不同的内容进行说明。

#导入所需库文件
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

 

在设置数据时增加一组特征或变量。这里我们增加了广告曝光量数据。

#设置广告花费,曝光与点击数据
invest=np.array([[13],[105],[105], [24], [3], [45], [35], [24], [40], [32]]).astype(np.float32)
impressions=np.array([[202],[244],[233], [175], [10], [227], [234], [216], [220], [213]]).astype(np.float32)
click=np.array([[8], [13], [11], [7],[ 2], [12], [10], [9], [11], [10]]).astype(np.float32)

 

将三组数据分布划分为测试集和训练集数据。

#粗糙划分训练集和测试集数据
X_test = invest[0:5].reshape(-1,1)
X_test1 = impressions[0:5].reshape(-1,1)
y_test = click[0:5]
X_train = invest[5:].reshape(-1,1)
X_train1 =impressions[5:].reshape(-1,1)
y_train = click[5:]

 

对两个变量(特征)x和x2分别设置占位符。同时分别设置权重值变量W和W2。用于后续的训练。

#设置第一个自变量x的占位符
x=tf.placeholder(tf.float32,[None,1])
#设置第二个自变量x2的占位符
x2=tf.placeholder(tf.float32,[None,1])
#设置第一个斜率(权重值)W变量
W=tf.Variable(tf.zeros([1,1]))
#设置第二个斜率(权重值)W2变量
W2=tf.Variable(tf.zeros([1,1]))
#设置截距(偏置量)b变量
b=tf.Variable(tf.zeros([1]))

 
然后设置Tensorflow中的多元线性回归模型y=Wx+W2x2+b

#设置多元线性回归模型y=Wx+W2x2+b
y=tf.matmul(x,W)+tf.matmul(x2,W2)+b
#设置占位符用于输入实际的y值
y_=tf.placeholder(tf.float32,[None,1])
#设置成本函数(最小方差)
cost=tf.reduce_mean(tf.square(y_-y))
#使用梯度下降以0.000001的学习速率最小化成本函数cost,以获得W,W2和b的值
train_step=tf.train.GradientDescentOptimizer(0.000001).minimize(cost)

 

#开始训练前对变量进行初始化
init=tf.global_variables_initializer()
#创建一个会话(Sess)
sess=tf.Session()
#在Sess中启用模型并初始化变量
sess.run(init)
#创建一个空list用于存放成本函数的变化
cost_history=[]
#循环训练模型1000次
for i in range(1000):
    feed={x:X_train,x2:X_train1,y_:y_train}
    sess.run(train_step,feed_dict=feed)
    #存储每次训练的cost值
    cost_history.append(sess.run(cost,feed_dict=feed))
    #输出每次训练后的W,W2,b和cost值
    print("After %d iteration:" %i)
    print("W: %f" % sess.run(W))
    print("W2 Value: %f" % sess.run(W2))
    print("b: %f" % sess.run(b))
    print("cost: %f" % sess.run(cost,feed_dict=feed))
#输出最终的W,W2,b和cost值
print("W_Value: %f" % sess.run(W),"W2 Value: %f" % sess.run(W2),"b_Value: %f" % sess.run(b),"cost_Value: %f" % sess.run(cost,feed_dict=feed))

 

多元回归模型输出
在训练模型的过程中,我们同样存储了每次迭代后成本函数cost的变化情况,下面对这个过程进行可视化。在最开始成本函数为88,随着迭代次数的增加成本函数收敛在0.7。

#绘制成本函数cost在100次训练中的变化情况
plt.plot(range(len(cost_history)),cost_history)
plt.axis([0,100,0,np.max(cost_history)])
plt.xlabel('training epochs')
plt.ylabel('cost')
plt.title('cost history')
plt.show()

多元线性回归cost history

 

计算均方误差MSE来衡量模型的表现。MSE的值越小,说明预测模型具有更好的精确度。这里我们训练的多元线性回归模型均方误差MSE为1.2479。

#使用测试集计算模型的均方误差MSE
pred_y = sess.run(y, feed_dict={x: X_test,x2:X_test1})
mse = tf.reduce_mean(tf.square(pred_y - y_test))
print("MSE: %.4f" % sess.run(mse))

 

多元回归MSE

—【所有文章及图片版权归 蓝鲸(王彦平)所有。欢迎转载,但请注明转自“ 蓝鲸网站分析博客”。】—

 

相关 [tensorflow 训练 线性回归] 推荐:

使用Tensorflow训练线性回归模型并进行预测

- - 蓝鲸的网站分析笔记
Tensorflow是Google开发的开源机器学习库. 本篇文章我们将使用Tensorflow对线性回归模型进行训练,并使用模型对数据进行预测. 首先导入所需的库文件,包括tensorflow,numpy和matplotlib. Tensorflow用于创建和训练线性回归模型,numpy用于提取数据和计算均方误差MSE,matplotlib用于绘制成本函数变化图.

字节跳动开源高性能分布式训练框架BytePS,支持PyTorch、TensorFlow等

- - IT瘾-tuicool
最近,字节跳动发布了一款通用高性能分布式训练框架 BytePS,该框架支持TensorFlow、Keras、PyTorch 和MXNet,并且可以在 TCP 或 RDMA 网络上运行. BytePS GitHub 地址:https://github.com/bytedance/byteps. 根据该项目的 GitHub 页面,BytePS 显著优于目前的开源分布式训练框架.

TensorFlow-dev-summit:那些 TensorFlow 上好玩的和黑科技

- - IT瘾-dev
本文属于介绍性文章,其中会介绍许多TensorFlow的新feature和summit上介绍的一些有意思的案例,文章比较长,可能会花费30分钟到一个小时. Google于2017年2月16日(北京时间)凌晨2点在美国加利福尼亚州山景城举办了首届TensorFlow开发者峰会. Google现场宣布全球领先的深度学习开源框架TensorFlow正式对外发布V1.0版本,并保证Google的本次发布版本的API接口满足生产环境稳定性要求.

线性回归与逻辑回归 - CSDN博客

- -
七月在线4月机器学习算法班课程笔记——No.5.   回归算法是一种通过最小化预测值与实际结果值之间的差距,而得到输入特征之间的最佳组合方式的一类算法. 对于连续值预测有线性回归等,而对于离散值/类别预测,我们也可以把逻辑回归等也视作回归算法的一种.   线性回归与逻辑回归是机器学习中比较基础又很常用的内容.

线性回归实战:波士顿房价预测

- - 标点符
了解线性回归的原理后,为了更好的掌握相关的技能,需要进入实战,针对线性回归常见的方法有:Scikit和Statsmodels. 美国波士顿房价的数据集是sklearn里面默认的数据集,sklearn内置的数据集都位于datasets子模块下. 一共506套房屋的数据,每个房屋有13个特征值. ZN: 住宅用地所占比例.

TensorFlow、MXNet、PaddlePaddle 三个开源库对比

- - IT瘾-dev
【转载请注明出处】 chenrudan.github.io. 从深度学习开始流行,到深度学习框架的迭代,到各类实际应用的出现,不过短短几年时间. 其实发展到现在,各个框架对自己的定位都不相同,硬要说哪个框架最好没什么必要,结合自身需求找到合适的用就够了(实验室的服务器不太方便拿来折腾,本文就不比较运算速度了,可以参考[4][5]).

深度学习利器:TensorFlow实战

- - 孟飞阳的博客
深度学习及TensorFlow简介. 深度学习目前已经被应用到图像识别,语音识别,自然语言处理,机器翻译等场景并取得了很好的行业应用效果. 至今已有数种深度学习框架,如TensorFlow、Caffe、Theano、Torch、MXNet,这些框架都能够支持深度神经网络、卷积神经网络、深度信念网络和递归神经网络等模型.

如何将TensorFlow用作计算框架

- - 神刀安全网
摘要:如果你刚刚接触TensorFlow并想使用其来作为计算框架,那么本文是你的一个很好的选择,阅读它相信会对你有所帮助. Tensorflow可能是最受欢迎,增长最快的机器学习框架. 在 Github拥有超过70000个点赞,并得到Google的支持,不仅拥有比 Linux更多的点赞,还拥有大量的资源.

TensorFlow自动识别验证码(二)

- -
在 使用tensorflow自动识别验证码(一) 这篇文章中,对使用tensorflow自动识别验证码的过程做了简单的了解和编写. 那么今天这篇文章将对上篇文章中代码进行修改用于实现对主流的CMS进行验证码的破解. 先回顾一下 tensorflow 的自动识别验证码的步骤. 由于后面三步基本都是tensorflow自动完成.

[转]Tensorflow实现的CNN文本分类

- - Soul Joy Hub
在这篇文章中,我们将实现一个类似于Kim Yoon的卷积神经网络语句分类的模型. 本文提出的模型在一系列文本分类任务(如情感分析)中实现了良好的分类性能,并已成为新的文本分类架构的标准基准. 本文假设你已经熟悉了应用于NLP的卷积神经网络的基础知识. 如果没有,建议先阅读Understanding Convolutional Neural Networks for NLP 以获得必要的背景.