1. 程式人生 > >TensorFlow實踐(6)——線性迴歸模型專案實踐

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個數據實例進行學習,建立了鮑魚年齡預測模型,讀者遇到其他需要多元線性迴歸模型解決的問題時,可仿照上述過程進行,有任何疑問請在評論區留言,我會盡快回復,謝謝支援!