使用Tensorflow训练线性回归模型并进行预测
Tensorflow是Google开发的开源机器学习库。本篇文章我们将使用Tensorflow对线性回归模型进行训练,并使用模型对数据进行预测。下面我们开始分步骤介绍。
首先导入所需的库文件,包括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()
完成训练后,我们使用模型进行预测,输入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))
下面我们以图表的方式更加直观的显示出模型在测试集上的表现,其中图表的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()
计算均方误差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))
—【所有文章及图片版权归 蓝鲸(王彦平)所有。欢迎转载,但请注明转自“ 蓝鲸网站分析博客”。】—