TensorFlow機器學習理論與實戰 第一章 線性迴歸模型

《Python機器學習理論與實戰》系列主要講的是利用 Python 的機器學習庫 Scikit-Learn 來進行機器學習任務,但是由於人工智能深度學習的迅速發展,TensorFlow 這類的深度學習框架逐漸成為 AI 研究員的主流工具,因此才有了《TensorFlow機器學習理論與實戰 》系列的誕生。

作者建議《Python機器學習理論與實戰》《TensorFlow機器學習理論與實戰 》兩個系列可以對比著來看,將會分別講述利用 Scikit-Learn TensorFlow 來實現同一個機器學習算法,然後對實現的結果進行比較。利用 Scikit-Learn 實現一個算法相對比較簡單,使用 fit( ),predict( ) score( ) 等函數基本就能滿足需求,而利用 TensorFlow 來實現同一個算法的話,則需要你從頭到尾一步一步地把算法利用計算圖的形式搭建出來,因此利用 TensorFlow 來實現算法的時候,你可以控制更多的參數

《Python機器學習理論與實戰 第一章 線性迴歸模型》這個鏈接在全文可能出現多次,我先把它放到最前面,便於大家查找。

學習TensorFlow的必要性

既然 Scikit-Learn 簡單也能實現絕大多數的機器學習算法,但是為什麼還要學習 TensorFlow,我想主要的原因應該有以下幾點:

  • TensorFlow 的使用率越來越廣泛,自谷歌開源 TensorFlow 框架之後,TensorFlow 逐漸在各行各業得以運用,發展速度非常快

  • 計算速度快,能夠利用 GPU 並對地理分佈式 GPU 設備進行訓練,對大數據的處理能力

  • 提供高性能機器學習模塊,TensorFlow除了能實現傳統的機器學習算法外,還提供了卷積神經網絡(CNN)循環神經網絡(RNN)長短期記憶網絡(LSTM)高性能機器學習模塊,並且使用靈活可定製性強

TensorFlow在Windows中的安裝

  • 首先安裝最新版的 Anaconda(>= Python 3.6)

  • Windows+R,輸入 CMD 打開命令窗,安裝 CPU 版本

pip install --upgrade tensorflow

若是安裝過程遇到問題,可以聯繫作者。

線性迴歸的理論

線性迴歸的理論本文就不做過多介紹了,具體的內容讀者可以查看文章《Python機器學習理論與實戰 第一章 線性迴歸模型》,裡面有詳細的介紹。本文主要講解如何用 TensorFlow 來實現一個線性迴歸模型,並與《Python機器學習理論與實戰 第一章 線性迴歸模型》中的結果做比較

查看數據描述

載入需要的數據,查看數據的描述信息。

#導入房價數據讀取器from sklearn.datasets import load_boston#讀取房價數據存儲在變量boston中boston=load_boston()#輸出數據描述print (boston.DESCR)

可以得到關於數據集的一些描述性信息,比如,共有506條數據13項數值型或者類別型預測變量目標變量為房價沒有缺失值等,具體的信息同樣在《Python機器學習理論與實戰 第一章 線性迴歸模型》中有詳細介紹。

數據劃分:分為測試集和訓練集

為了使得兩種方法的結果具有可比性,這裡設置劃分的 random_state=33 是一樣的。

#數據分割# 從sklearn.cross_validation導入數據分割器from sklearn.cross_validation import train_test_split# 導入numpy並重命名為npimport numpy as npX = boston.datay = boston.target# 隨機採樣25%的數據構建測試樣本,其餘作為訓練樣本X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=33, test_size=0.25)

TensorFlow線性迴歸—參數定義

這裡有2個參數需要重點說明一下:

training_epochs = 101 epoch 就是指把所有訓練數據完整的學過一遍,本文設置學習 10 遍就行,因為本文的模型較簡單而且數據量較小。

batch_size = 1batchsize 用來設置計算總誤差的時候使用幾個樣本,然後根據誤差調節權重,然後再輸入 batchsize 個樣本再計算總誤差再調節權重,直至所有所有樣本都被學習完,就完成了1 epoch,接下來開始第 2 個 epoch 的訓練。本題數據量較小,將其設置為1,即每1個樣本計算一次總誤差調節一次權重,要求模型得到的結果對於每一個樣本來說誤差都是逼近最小的。

import tensorflow as tf#####設置學習的參數#####n_features = X_train.shape[1]#輸入特徵的數目=X_train的列的數目n_samples = X_train.shape[0]#樣本總數=X_train的行的數目learning_rate = 0.01#學習率設置為0.01training_epochs = 10# 學習次數設置為10次,one epoch就是指把所有訓練數據完整的學過一遍,這裡設置學習10遍batch_size = 1# batchsize 用來設置計算總誤差的時候使用幾個樣本,本題數據量較小,將其設置為1

TensorFlow線性迴歸—batch_size函數實現

####### 該函數用來每次從訓練數據中取batchsize大小的數據集出來######def iterate_minibatches(arrays, batch_size, shuffle=False, seed=None):rgen = np.random.RandomState(seed)indices = np.arange(arrays[0].shape[0])if shuffle:rgen.shuffle(indices)for start_idx in range(0, indices.shape[0] - batch_size + 1, batch_size):index_slice = indices[start_idx:start_idx + batch_size]yield (ary[index_slice] for ary in arrays)

TensorFlow機器學習理論與實戰 第一章 線性迴歸模型

batch_size函數

TensorFlow線性迴歸—定義計算圖

g = tf.Graph()with g.as_default() as g:# Input datatf_x = tf.placeholder(dtype=tf.float32,shape=[None, n_features], name='inputs')#定義輸入為n_features維的列向量tf_y = tf.placeholder(dtype=tf.float32,shape=[None], name='targets')#定義輸出# Model parametersparams = {'weights': tf.Variable(tf.zeros(shape=[n_features, 1],dtype=tf.float32), name='weights'),'bias': tf.Variable([[0.]], dtype=tf.float32, name='bias')}#定義權重和偏差,權重為n_features維的行向量,偏差為b# Linear Regressionlinear = tf.matmul(tf_x, params['weights']) + params['bias']# 定義線性迴歸的計算y=x*w+b # Loss and optimizercost = tf.reduce_mean(tf.square(linear - tf_y), name='cost') #定義損失函數為平均誤差平方和#optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate)optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)#定義優化方法,採用梯度下降法來優化參數,學習率設置為learning_rate=0.01train = optimizer.minimize(cost, name='train')# 定義學習過程,train相當於一個優化器,訓練的過程就是最小化cost

TensorFlow機器學習理論與實戰 第一章 線性迴歸模型

定義計算圖

作者發現採用梯度下降算法最後的效果並不好,後來換成了Adam優化算法取得了很好的效果。

TensorFlow線性迴歸—訓練過程

with tf.Session(graph=g) as sess:sess.run(tf.global_variables_initializer())#全局變量的初始化# 打印初始化的w和bprint('weights = ', sess.run(['weights:0']), 'bias = ', sess.run(['bias:0']))avg_cost = np.nancount = 1# 用於計算平均損失for epoch in range(training_epochs):# 把所有數據都學習10遍print("Epoch: %03d | AvgCost: %.3f\n" % (epoch, avg_cost / count), end="")avg_cost = 0.count = 0for x_batch, y_batch in iterate_minibatches(arrays=[X_train, y_train],batch_size=batch_size,shuffle=True, seed=123):# 把訓練樣本分批次,然後取出feed_dict = {'inputs:0': x_batch,'targets:0': y_batch}_, c = sess.run(['train', 'cost:0'], feed_dict=feed_dict)#索要下一批次batch_size的輸入和輸出avg_cost += ccount += 1weights, bias = sess.run(['weights:0', 'bias:0'])print('\nWeights:\n', weights)print('\nBias:\n', bias)

TensorFlow機器學習理論與實戰 第一章 線性迴歸模型

訓練過程

TensorFlow機器學習理論與實戰 第一章 線性迴歸模型

輸出結果

TensorFlow線性迴歸—模型評價

lr_y_predict=X_test.dot(weights)+bias# 從sklearn.metrics依次導入r2_score、mean_squared_error以及mean_absoluate_error用於迴歸性能的評估from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error# 使用r2_score模塊,並輸出評估結果print ('The value of R-squared of LinearRegression is', r2_score(y_test, lr_y_predict))# 使用mean_squared_error模塊,並輸出評估結果print ('The mean squared error of LinearRegression is', mean_squared_error(ss_y.inverse_transform(y_test),ss_y.inverse_transform(lr_y_predict)))# 使用mean_absolute_error模塊,並輸出評估結果print ('The mean absoluate error of LinearRegression is', mean_absolute_error(ss_y.inverse_transform(y_test), ss_y.inverse_transform(lr_y_predict)))#注:這裡均方誤差和平均絕對誤差均較大是因為這裡給出的誤差都是轉換為標準化之前的數據再算出的誤差(ss_y.inverse_transform())

TensorFlow和Scikit-Learn結果比較

  • TensorFlow 結果

The value of R-squared of LinearRegression is 0.674444392463

The mean squared error of LinearRegression is 25.2440032605

The mean absoluate error of LinearRegression is 3.55180931128

  • Scikit-Learn結果(具體計算過程可以查看《Python機器學習理論與實戰 第一章 線性迴歸模型》)

The value of R-squared of LinearRegression is 0.6763403831

The mean squared error of LinearRegression is 25.0969856921

The mean absoluate error of LinearRegression is 3.5261239964

對比 TensorFlow Scikit-Learn 的結果可以發現兩者的結果相差不大,Scikit-Learn 的結果要比 TensorFlow 好一點。這是因為 Scikit-Learn 中的 LinearRegression 模塊採用的是精確計算的解析算法來計算模型的參數,TensorFlow 則是使用快速估計的數值優化 Adam 算法

相比之下,Scikit-Learn 中的 LinearRegression 模塊對參數計算採用精確解析的方法計算時間長但是模型的性能略高TensorFlow 採用快速估計的數值優化算法計算時間短但是產出的模型性能略低,此處使用的數據量太小看不出明顯的差距,但是當數據規模達到10萬數量級以上時,考慮到時間的消耗,使用快速估計的數值優化算法就會更有優勢

由於頭條排版的限制,每一行開頭所有的空格都是被忽略的,但是偏偏Python又是一門非常重視縮進的語言,因此代碼部分的排版並不是很好看,作者以截圖的形式給出,因此原文代碼直接複製粘貼可能並不一定能正常運行,讀者可能需要微調一下。

相關推薦

推薦中...