1. 程式人生 > >23.【進階】流行庫模型--Tensorflow&SKFlow

23.【進階】流行庫模型--Tensorflow&SKFlow

Tensorflow

  • 用以編寫程式的計算機軟體;
  • 計算機軟體開發工具;
  • 可用於人工智慧、深度學習、高效能運算、分散式計算、虛擬化和機器學習這些領域;
  • 軟體庫可用於通用目的的計算、資料收集的操作、資料變換、輸入輸出、人工智慧等領域的建模和測試
  • 軟體可用作應用於人工智慧等領域的應用程式介面(API)
#-*- coding:utf-8 -*-

#1.使用Tensorflow自定義一個線性分類器用於對“良/惡性乳腺癌腫瘤”進行預測

import tensorflow as tf 
import numpy as np  
import pandas as pd  

train = pd.read_csv('../Breast-Cancer/breast-cancer-train.csv'
,names=column_names) test = pd.read_csv('../Breast-Cancer/breast-cancer-test.csv',names=column_names) #分隔特徵與分類目標 X_train = np.float32(train[['Clump Thickness','Cell Size']].T) y_train = np.float32(train[['Type']].T) X_test = np.float32(test[['Clump Thickness','Cell Size']].T) y_test = np.float32(test[['Type']]
.T) #定義一個tensorflow的變數b作為線性模型的截距,同時設定初始值為1.0 b = tf.Variable(tf.zeros([1])) #定義一個tensorflow的變數W作為線性模型的係數,並設定初始值為-1.01.0之間均勻分佈的隨機數 W = tf.Variable(tf.random_uniform([1,2],-1.0,1.0)) #顯式定義這個線性函式 y = tf.matmul(W,X_train)+b #使用tensorflow中對reduce_mean取得訓練集上均方誤差 loss = tf.reduce_mean(tf.square(y-y_train)) #使用梯度下降法估計引數W,b,並且設定迭代步長為0.01
,這個與sklearn中的SGDRegressor類似 optimizer = tf.train.GradientDescentOptimizer(0.01) #以最小二乘損失為優化目標 train = optimizer.minimize(loss) #初始化所有變數 init = tf.initialize_all_variables() #開啟tensorflow中的會話 sess = tf.Session() #執行變數初始化操作 sess.run(init) #迭代1000輪次,訓練引數 for step in xrange(0,1000): sess.run(train) if step%200 == 0: print step,sess.run(W),sess.run(b) #準備測試樣本 test_negative = test.loc[test['type']==0][['Clump Thickness','Cell Size']] test_positive = test.loc[test['type']==1][['Clump Thickness','Cell Size']] #以最終更新的引數作圖 import matplotlib.pyplot as plt plt.scatter(test_negative['Clump Thickness'],test_negative['Cell Size'],marker='o',s=200,c='red') plt.scatter(test_positive['Clump Thickness'],test_positive['Cell Size'],marker='x',s=150,c='black') plt.xlable('Clump Thickness') plt.ylable('Cell Size') lx = np.arrange(0,12) #這裡強調一下,我們以0.5(良性腫瘤為0,惡性腫瘤為1)作為分介面,所以計算方式如下: ly = (0.5-sess.run(b))-lx*sess.run(W)[0][0])/sess.run(W)[0][0] plt.plot(lx,ly,color='green') plt.show() #小結: #使用tensorflow自定義分類器也可以取得與使用sklearn的LogisticRegression模型相近的效果, #但是這樣按照理論搭建學習系統難度較大,於是我們學習另一個框架skflow,它對Tensorflow進一步的封裝, #目的是實現像sklearn使用介面類似的工具包

輸出結果:
這裡寫圖片描述

SKFlow

  • 非常適合那些熟悉於scikit-learn程式設計介面對使用者,而且利用Tensorflow的運算架構和模組,封裝了許多經典的機器學習模型,如線性迴歸器、深度全連線的神經網路(DNN)等,推薦使用skflow;
  • 不過skflow仍然支援使用TensorFlow的基礎運算元來自定義學習流程,比如在自己搭建神經網路模型方面。
# 2.使用skflow內建的LinearRegreesor、DNN、以及scikit-learn中的整合迴歸模型對‘美國波士頓房價’進行迴歸預測

from sklearn import datasets,metrics,preprocessing,cross_validation

#使用datasets.load_boston讀取資料
boston= datasets.load_boston()

X,y=boston.data,boston.target

X_train,X_test,y_train,y_test=cross_validation.train_test_split(X,y,test_size=0.25,random_state=33)

#資料特徵進行標準化處理
scaler = preprocessing.StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

#匯入skflow
import skflow
#(1)使用skflow的LinearRegressor
tf_lr = skflow.TensorFlowLinearRegressor(steps=10000,learning_rate=0.01,batch_size=50)
tf_lr.fit(X_train,y_train)
tf_lr_y_predict = tf_lr.predict(X_test)
#輸出TensorFlowLinearRegressor的迴歸效能
print 'the MAE of tflr on dataset is',metrics.mean_absolute_error(tf_lr_y_predict,y_test)
print 'the MSE of tflr on dataset is',metrics.mean_squared_error(tf_lr_y_predict,y_test)
print 'the r2-score of tflr on dataset is',metrics.r2_score(tf_lr_y_predict,y_test)

#(2)使用skflow的DNNRegressor,並且注意其每個隱層<特徵數量>的配置,這裡第一層是100個特徵,第二層是40個
tf_dnn_regressor = skflow.TensorFlowDNNRegressor(hidden_units=[100,40],steps=10000,learning_rate=0.01,batch_size=50)
tf_dnn_regressor.fit(X_train,y_train)
tf_dnn_y_predict=tf_dnn_regressor.predict(X_test)
#輸出TensorFlowDNNRegressor的迴歸效能
print 'the MAE of tf_dnn on dataset is',metrics.mean_absolute_error(tf_dnn_y_predict,y_test)
print 'the MSE of tf_dnn on dataset is',metrics.mean_squared_error(tf_dnn_y_predict,y_test)
print 'the r2-score of tf_dnn on dataset is',metrics.r2_score(tf_dnn_y_predict,y_test)

#(3)使用scikit-learn的RandomForestRegressor
from sklearn.ensemble import RandomForestRegressor
rfr = RandomForestRegressor()
rfr.fit(X_train,y_train)
rfr_y_predict = rfr.predict(X_test)
#輸出RandomForestRegressor的迴歸效能
print 'the MAE of rfr on dataset is',metrics.mean_absolute_error(rfr_y_predict,y_test)
print 'the MSE of rfr on dataset is',metrics.mean_squared_error(rfr_y_predict,y_test)
print 'the r2-score of rfr on dataset is',metrics.r2_score(rfr_y_predict,y_test)

#小結:
#通過上述一系列的輸出可知,深度神經網路可以表現處更高的效能,不過需注意的是,越是具備描述複雜資料的強力模型,
#越容易在訓練時陷入過擬合,這一點需要在配置DNN的層數和每層特徵元的數量時特別注意。