TensorFlow实践(6)——线性回归模型项目实践
(一)前 言
在前面的两节中我们分别介绍了一元线性回归模型和多元线性回归模型的TensorFlow实现,本节我们将使用线性回归模型解决实际问题——鲍鱼年龄的预测,数据的来源为UCI机器学习数据库。
(二)数据描述及可视化展示
数据共包含8个属性:
1、性别(M,F,I)由于鲍鱼年幼时分辨不出该属性,所以有三个类别。
2、长度
3、直径
4、高度
5、总重量
6、剥壳重量
7、内脏重量
8、壳重
标签值为环的数量 (整型+1.5用于预测鲍鱼年龄),鲍鱼的年龄是通过切割贝壳通过锥体,染色并通过显微镜计数环数来确定的。 本次的目标是预测环数,从而预测鲍鱼的年龄,首先对部分鲍鱼数据进行可视化,每一条折线即为一个数据实例:
绘图代码如下:
import matplotlib.pyplot as plt
import csv
import numpy as np
from pylab import mpl
with open('D:/Machine Learning/Data_wrangling/鲍鱼数据集.csv') as file:
reader = csv.reader(file)
a = []
for item in reader:
a.append(item)
file.close()
mpl.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
mpl.rcParams['axes.unicode_minus']=False #用来正常显示负号
plt.figure(figsize = (10, 6))
for i in range(100):
point = a[i]
plt.plot(point)
plt.xticks(np.arange(7), ('长度','直径','高度','全重','去壳重量','内脏重量','干燥后壳重'),fontsize = 13)
plt.yticks([])
plt.show()
(三)模型的TensorFlow实现
由上可知,我们将通过8个属性来预测鲍鱼的环数,故我们将建立一个8元线性回归模型,如下所示:
(1)模型参数设置
# 设置学习率
learning_rate = 0.01
设置训练次数
train_steps = 1000
(2)输入数据
# 读取CSV文件,并将属性值与标签值分别存到两个数组里
with open('D:/Machine Learning/Data_wrangling/鲍鱼数据集.csv') as file
reader = csv.reader(file)
a, b = [], []
for item in reader:
b.append(item[8])
del(item[8])
a.append(item)
file.close()
x_data = np.array(a)
y_data = np.array(b)
for i in range(len(x_data)):
y_data[i] = float(y_data[i])
for j in range(len(x_data[i])):
x_data[i][j] = float(x_data[i][j])
(3)构建模型
weights = tf.Variable(np.ones([8,1]),dtype = tf.float32)
x_data_ = tf.placeholder(tf.float32, [None, 8])# 输入数据为一阶张量
y_data_ = tf.placeholder(tf.float32, [None, 1])# 输入数据为一阶张量
bias = tf.Variable(1.0, dtype = tf.float32)#定义偏差值
# 构建模型:Y = w1*X1 + w2*X2 + w3*X3 + w4*X4 + w5*X5 + w6*X6 + w7*X7 + w8*X8 + bias
y_model = tf.add(tf.matmul(x_data_ , weights), bias)
(4)定义损失函数
# 采用均方误差作为损失函数
loss = tf.reduce_mean(tf.pow((y_model - y_data_), 2))
(5)选择优化器及定义训练操作
# 使用随机梯度下降算法
train_op = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
(6)创建会话进行训练
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print("Start training!")
lo = []
sample = np.arange(train_steps)
for i in range(train_steps):
for (x,y) in zip(x_data, y_data):
z1 = x.reshape(1,8)
z2 = y.reshape(1,1)
sess.run(train_op, feed_dict = {x_data_ : z1, y_data_ : z2})
l = sess.run(loss, feed_dict = {x_data_ : z1, y_data_ : z2})
lo.append(l)
# 打印最终的权重与偏置值
print(weights.eval(sess))
print(bias.eval(sess))
(7)训练结果
在学习率为0.01时,经过1000次迭代均方误差降为0.3左右,读者可通过增加训练次数、改变学习率、更改优化算法等方式进一步提高精度,本次我们得到的模型为:
Y = 0.26X1 + 7.7X2 + 3.94X3 + 6.22X4 + 4.12X5 – 8.11X6 – 9.52X7 + 6.94X8 + 2.11
训练损失变化曲线为:
(8)完整代码
import tensorflow as tf
import csv
import numpy as np
import matplotlib.pyplot as plt
# 设置学习率
learning_rate = 0.01
# 设置训练次数
train_steps = 1000
with open('D:/Machine Learning/Data_wrangling/鲍鱼数据集.csv') as file:
reader = csv.reader(file)
a, b = [], []
for item in reader:
b.append(item[8])
del(item[8])
a.append(item)
file.close()
x_data = np.array(a)
y_data = np.array(b)
for i in range(len(x_data)):
y_data[i] = float(y_data[i])
for j in range(len(x_data[i])):
x_data[i][j] = float(x_data[i][j])
# 定义各影响因子的权重
weights = tf.Variable(np.ones([8,1]),dtype = tf.float32)
x_data_ = tf.placeholder(tf.float32, [None, 8])
y_data_ = tf.placeholder(tf.float32, [None, 1])
bias = tf.Variable(1.0, dtype = tf.float32)#定义偏差值
# 构建模型为:y_model = w1X1 + w2X2 + w3X3 + w4X4 + w5X5 + w6X6 + w7X7 + w8X8 + bias
y_model = tf.add(tf.matmul(x_data_ , weights), bias)
# 定义损失函数
loss = tf.reduce_mean(tf.pow((y_model - y_data_), 2))
#训练目标为损失值最小,学习率为0.01
train_op = tf.train.GradientDescentOptimizer(0.01).minimize(loss)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print("Start training!")
lo = []
sample = np.arange(train_steps)
for i in range(train_steps):
for (x,y) in zip(x_data, y_data):
z1 = x.reshape(1,8)
z2 = y.reshape(1,1)
sess.run(train_op, feed_dict = {x_data_ : z1, y_data_ : z2})
l = sess.run(loss, feed_dict = {x_data_ : z1, y_data_ : z2})
lo.append(l)
print(weights.eval(sess))
print(bias.eval(sess))
# 绘制训练损失变化图
plt.plot(sample, lo, marker="*", linewidth=1, linestyle="--", color="red")
plt.title("The variation of the loss")
plt.xlabel("Sampling Point")
plt.ylabel("Loss")
plt.grid(True)
plt.show()
(四)结 论
本文基于多元线性回归模型,通过对来自UCI数据库的4177个数据实例进行学习,建立了鲍鱼年龄预测模型,读者遇到其他需要多元线性回归模型解决的问题时,可仿照上述过程进行,有任何疑问请在评论区留言,我会尽快回复,谢谢支持!
下一节:TensorFlow实践(7)——逻辑回归模型