手把手教你用Python庫Keras做預測(附程式碼)

資料分析v發表於2018-06-01

翻譯:張逸 ;校對:馮羽

本文約2804字,建議閱讀7分鐘。

本文將教你如何使用Keras這個Python庫完成深度學習模型的分類與迴歸預測。

當你在Keras中選擇好最合適的深度學習模型,就可以用它在新的資料例項上做預測了。但是很多初學者不知道該怎樣做好這一點,我經常能看到下面這樣的問題:

 

“我應該如何用Keras對我的模型作出預測?”

 

在本文中,你會學到如何使用Keras這個Python庫完成深度學習模型的分類與迴歸預測。


看完這篇教程,你能掌握以下幾點:


  • 如何確定一個模型,為後續的預測做準備

  • 如何用Keras對分類問題進行類及其概率的預測

  • 如何用Keras進行迴歸預測


現在就讓我們開始吧

本文結構

教程共分為三個部分,分別是:

  • 模型確定

  • 分類預測

  • 迴歸預測

模型確定


在做預測之前,首先得訓練出一個最終的模型。你可能選擇k折交叉驗證或者簡單劃分訓練/測試集的方法來訓練模型,這樣做的目的是為了合理估計模型在樣本集之外資料上的表現(新資料)

 

當評估完成,這些模型存在的目的也達到了,就可以丟棄他們。接下來,你得用所有的可用資料訓練出一個最終的模型。關於這方面的內容,你可以在下面這個文章中得到更多的資訊:


https://machinelearningmastery.com/train-final-machine-learning-model/


分類預測


對於分類問題,模型學習的是一個輸入特徵到輸出特徵之間的對映,這裡的輸出即為一個標籤。比如“垃圾郵件”和“非垃圾郵件”

 

下邊是Keras中為簡單的二分類問題開發的神經網路模型的一個例子。如果說你以前沒有接觸過用Keras開發神經網路模型的話,不妨先看看下邊這篇文章:


https://machinelearningmastery.com/tutorial-first-neural-network-python-keras/



# 訓練一個最終分類的模型

from keras.models import Sequential

from keras.layers import Dense

from sklearn.datasets.samples_generator import make_blobs

from sklearn.preprocessing import MinMaxScaler

# 生成一個二分類問題的資料集

X, y = make_blobs(n_samples=100, centers=2, n_features=2, random_state=1)

scalar = MinMaxScaler()

scalar.fit(X)

X = scalar.transform(X)

# 定義並擬合模型

model = Sequential()

model.add(Dense(4, input_dim=2, activation='relu'))

model.add(Dense(4, activation='relu'))

model.add(Dense(1, activation='sigmoid'))

model.compile(loss='binary_crossentropy', optimizer='adam')

model.fit(X, y, epochs=200, verbose=0)

建立好這個模型後,可能需要將它儲存到檔案中(比如通過Keras的相關API)。以後你就可以隨時載入這個模型,並用它進行預測了。有關這方面的示例,可以參考下邊的文章:

https://machinelearningmastery.com/save-load-keras-deep-learning-models/


為了本文的結構更簡潔,我們的例子中省去了這個步驟。

 

繼續說回到分類預測的問題。我們希望最終得到的模型能進行兩種預測:一是判斷出類別,二是給出屬於相應類別概率。

 

  • 類預測

 

一個類別預測會給定最終的模型以及若干資料例項,我們利用模型來判斷這些例項的類別。對於新資料,我們不知道輸出的是什麼結果,這就是為什麼首先需要一個模型。

 

在Keras中,可以利用predict_class()函式來完成我們上述所說的內容----即利用最終的模型預測新資料樣本的類別。

 

需要注意的是,這個函式僅適用於Sequential模型,不適於使用功能式API開發的模型。(not those models developed using the functional API.)

 

比如,我們在名為Xnew的陣列中有若干個資料例項,它被傳入predict_classes()函式中,用來對這些資料樣本的類別進行預測。


Xnew = [[...], [...]]

ynew = model.predict_classes(Xnew)


讓我們用一個更具體的例子來說明:


# 建立一個新的分類模型

from keras.models import Sequential

from keras.layers import Dense

from sklearn.datasets.samples_generator import make_blobs

from sklearn.preprocessing import MinMaxScaler

# 生成二分類資料集

X, y = make_blobs(n_samples=100, centers=2, n_features=2, random_state=1)

scalar = MinMaxScaler()

scalar.fit(X)

X = scalar.transform(X)

# 定義並擬合最終模型

model = Sequential()

model.add(Dense(4, input_dim=2, activation='relu'))

model.add(Dense(4, activation='relu'))

model.add(Dense(1, activation='sigmoid'))

model.compile(loss='binary_crossentropy', optimizer='adam')

model.fit(X, y, epochs=500, verbose=0)

# 新的未知資料例項

Xnew, _ = make_blobs(n_samples=3, centers=2, n_features=2, random_state=1)

Xnew = scalar.transform(Xnew)

# 作出預測

ynew = model.predict_classes(Xnew)

# 顯示輸入和輸出

for i in range(len(Xnew)):

print("X=%s, Predicted=%s" % (Xnew[i], ynew[i]))

下面是對三個例項預測的結果,我們將資料和預測結果一併輸出:


X=[0.89337759 0.65864154], Predicted=[0]

X=[0.29097707 0.12978982], Predicted=[1]

X=[0.78082614 0.75391697], Predicted=[0]


如果你只有一個新的例項,那就需要將它包裝一下,變成一個陣列的形式。以便傳給predict_classes()函式,比如這樣:


from keras.models import Sequential

from keras.layers import Dense

from sklearn.datasets.samples_generator import make_blobs

from sklearn.preprocessing import MinMaxScaler

from numpy import array

# 生成一個二分類資料集

X, y = make_blobs(n_samples=100, centers=2, n_features=2, random_state=1)

scalar = MinMaxScaler()

scalar.fit(X)

X = scalar.transform(X)

# 定義並擬合最終的新模型

model = Sequential()

model.add(Dense(4, input_dim=2, activation='relu'))

model.add(Dense(4, activation='relu'))

model.add(Dense(1, activation='sigmoid'))

model.compile(loss='binary_crossentropy', optimizer='adam')

model.fit(X, y, epochs=500, verbose=0)

# 未知的新例項

Xnew = array([[0.89337759, 0.65864154]])

# 作出預測

ynew = model.predict_classes(Xnew)

# 顯示輸入輸出

print("X=%s, Predicted=%s" % (Xnew[0], ynew[0]))


執行上邊這個例子,會得到對這個單獨例項的預測結果


X=[0.89337759 0.65864154], Predicted=[0]


  • 關於類別標籤的注意事項

 

準備資料時,應該將其中的類別標籤轉換為整數表示(比如原始資料類別可能是一個字串),這時候你就可能會用到sklearn中的LabelEncoder。


http://scikitlearn.org/stable/modules/generated/sklearn.preprocessing.LabelEncoder.html#sklearn.preprocessing.LabelEncoder

 

當然,在我們使用LabelEcoder中的函式inverse_transform()時,還可以將那些整數表示的類別標籤轉換回去。


因為這個原因,在擬合最終模型時,你可能想要儲存用於編碼y值的LabelEncoder結果。

概率預測


另外一種是對資料例項屬於某一類的可能性進行預測。它被稱為“概率預測”,當給定一個新的例項,模型返回該例項屬於每一類的概率值。(0-1之間)

 

在Keras中,我們可以呼叫predict_proba()函式來實現。舉個例子:


Xnew = [[...], [...]]

ynew = model.predict_proba(Xnew)

 

在二分類問題下,Sigmoid啟用函式常被用在輸出層,預測概率是資料物件屬於類別1的可能性,或者屬於類別0的可能性(1-概率)

 

在多分類問題下,則是softmax啟用函式常被用在輸出層。資料物件屬於每一個類別的概率作為一個向量返回。

 

下邊的例子對Xnew資料陣列中的每個樣本進行概率預測。

from keras.models import Sequential

from keras.layers import Dense

from sklearn.datasets.samples_generator import make_blobs

from sklearn.preprocessing import MinMaxScaler

# 生成二分類資料集

X, y = make_blobs(n_samples=100, centers=2, n_features=2, random_state=1)

scalar = MinMaxScaler()

scalar.fit(X)

X = scalar.transform(X)

# 定義並擬合出最終模型

model = Sequential()

model.add(Dense(4, input_dim=2, activation='relu'))

model.add(Dense(4, activation='relu'))

model.add(Dense(1, activation='sigmoid'))

model.compile(loss='binary_crossentropy', optimizer='adam')

model.fit(X, y, epochs=500, verbose=0)

# 新的未知資料

Xnew, _ = make_blobs(n_samples=3, centers=2, n_features=2, random_state=1)

Xnew = scalar.transform(Xnew)

# 做預測

ynew = model.predict_proba(Xnew)

# 顯示輸入輸出

for i in range(len(Xnew)):

print("X=%s, Predicted=%s" % (Xnew[i], ynew[i]))


我們執行這個例項,並將輸入資料及這些例項屬於類別1的概率列印出來:


X=[0.89337759 0.65864154], Predicted=[0.0087348]

X=[0.29097707 0.12978982], Predicted=[0.82020265]

X=[0.78082614 0.75391697], Predicted=[0.00693122]

迴歸預測


迴歸預測是一個監督學習問題,該模型學習一個給定輸入樣本到輸出數值的對映。比如會輸出0.1或0.2這樣的數字。

下邊是一個Keras迴歸的模型。

# 訓練一個迴歸模型的例子

from keras.models import Sequential

from keras.layers import Dense

from sklearn.datasets import make_regression

from sklearn.preprocessing import MinMaxScaler

# 生成迴歸資料集

X, y = make_regression(n_samples=100, n_features=2, noise=0.1, random_state=1)

scalarX, scalarY = MinMaxScaler(), MinMaxScaler()

scalarX.fit(X)

scalarY.fit(y.reshape(100,1))

X = scalarX.transform(X)

y = scalarY.transform(y.reshape(100,1))

# 定義並擬合模型

model = Sequential()

model.add(Dense(4, input_dim=2, activation='relu'))

model.add(Dense(4, activation='relu'))

model.add(Dense(1, activation='linear'))

model.compile(loss='mse', optimizer='adam')

model.fit(X, y, epochs=1000, verbose=0)


我們可以在最終的模型中呼叫predict()函式進行數值的預測。該函式以若干個例項組成的陣列作為輸入引數。


下面的例子演示瞭如何對未知的多個資料例項進行迴歸預測。


from keras.models import Sequential

from keras.layers import Dense

from sklearn.datasets import make_regression

from sklearn.preprocessing import MinMaxScaler

# 生成迴歸資料集

X, y = make_regression(n_samples=100, n_features=2, noise=0.1, random_state=1)

scalarX, scalarY = MinMaxScaler(), MinMaxScaler()

scalarX.fit(X)

scalarY.fit(y.reshape(100,1))

X = scalarX.transform(X)

y = scalarY.transform(y.reshape(100,1))

# 定義並擬合模型

model = Sequential()

model.add(Dense(4, input_dim=2, activation='relu'))

model.add(Dense(4, activation='relu'))

model.add(Dense(1, activation='linear'))

model.compile(loss='mse', optimizer='adam')

model.fit(X, y, epochs=1000, verbose=0)

# 未知的新資料

Xnew, a = make_regression(n_samples=3, n_features=2, noise=0.1, random_state=1)

Xnew = scalarX.transform(Xnew)

# 作出預測

ynew = model.predict(Xnew)

# 顯示輸入輸出

for i in range(len(Xnew)):

print("X=%s, Predicted=%s" % (Xnew[i], ynew[i]))


執行上面那個多分類預測例項,然後將輸入和預測結果並排列印,進行對比。


X=[0.29466096 0.30317302], Predicted=[0.17097184]

X=[0.39445118 0.79390858], Predicted=[0.7475489]

X=[0.02884127 0.6208843 ], Predicted=[0.43370453]


同樣的,這個函式可以用於單獨例項的預測,前提是它們包裝成適當的格式。


舉例說明:


from keras.models import Sequential

from keras.layers import Dense

from sklearn.datasets import make_regression

from sklearn.preprocessing import MinMaxScaler

from numpy import array

# 生成迴歸資料集

X, y = make_regression(n_samples=100, n_features=2, noise=0.1, random_state=1)

scalarX, scalarY = MinMaxScaler(), MinMaxScaler()

scalarX.fit(X)

scalarY.fit(y.reshape(100,1))

X = scalarX.transform(X)

y = scalarY.transform(y.reshape(100,1))

# 定義並擬合模型

model = Sequential()

model.add(Dense(4, input_dim=2, activation='relu'))

model.add(Dense(4, activation='relu'))

model.add(Dense(1, activation='linear'))

model.compile(loss='mse', optimizer='adam')

model.fit(X, y, epochs=1000, verbose=0)

# 新的資料

Xnew = array([[0.29466096, 0.30317302]])

# 作出預測

ynew = model.predict(Xnew)

# 顯示輸入輸出

print("X=%s, Predicted=%s" % (Xnew[0], ynew[0]))

執行例項並列印出結果:

X=[0.29466096 0.30317302], Predicted=[0.17333156]


延伸閱讀


這部分提供了一些相關的資料,如果你想更深入學習的話可以看一看。


How to Train a Final Machine Learning Model:

https://machinelearningmastery.com/train-final-machine-learning-model/ 


Save and Load Your Keras Deep Learning Models:

https://machinelearningmastery.com/save-load-keras-deep-learning-models/


Develop Your First Neural Network in Python With Keras Step-By-Step:

https://machinelearningmastery.com/tutorial-first-neural-network-python-keras/


The 5 Step Life-Cycle for Long Short-Term Memory Models in Keras:

https://machinelearningmastery.com/5-step-life-cycle-long-short-term-memory-models-keras/


How to Make Predictions with Long Short-Term Memory Models in Keras:

https://machinelearningmastery.com/make-predictions-long-short-term-memory-models-keras/


總結:

 

在本教程中,你知道了如何使用Keras庫通過最終的深度學習模型進行分類和迴歸預測。


具體來說,你瞭解到:

  • 如何確定一個模型,為後續的預測做準備

  • 如何用Keras對分類問題進行類及其概率的預測

  • 如何用Keras進行迴歸預測

對本文的內容有什麼問題嗎?在下面的評論中提出來,我將盡我所能來回答。


原文連結:

https://machinelearningmastery.com/how-to-make-classification-and-regression-predictions-for-deep-learning-models-in-keras/

譯者簡介:張逸,中國傳媒大學大三在讀,主修數字媒體技術。對資料科學充滿好奇,感慨於它創造出來的新世界。目前正在摸索和學習中,希望自己勇敢又熱烈,學最有意思的知識,交最志同道合的朋友。

END

版權宣告:本號內容部分來自網際網路,轉載請註明原文連結和作者,如有侵權或出處有誤請和我們聯絡。


關聯閱讀:

原創系列文章:

1:從0開始搭建自己的資料運營指標體系(概括篇)

2 :從0開始搭建自己的資料運營指標體系(定位篇)

3 :從0開始搭建自己的資料運營體系(業務理解篇)

4 :資料指標的構建流程與邏輯

5 :系列 :從資料指標到資料運營指標體系

6:   實戰 :為自己的公號搭建一個資料運營指標體系

7:  從0開始搭建自己的資料運營指標體系(運營活動分析)

資料運營 關聯文章閱讀:  

運營入門,從0到1搭建資料分析知識體系    

推薦 :資料分析師與運營協作的9個好習慣

乾貨 :手把手教你搭建資料化使用者運營體系

推薦 :最用心的運營資料指標解讀

乾貨 : 如何構建資料運營指標體系

從零開始,構建資料化運營體系

乾貨 :解讀產品、運營和資料三個基友關係

乾貨 :從0到1搭建資料運營體系

資料分析、資料產品 關聯文章閱讀:

乾貨 :資料分析團隊的搭建和思考

關於使用者畫像那些事,看這一文章就夠了

資料分析師必需具備的10種分析思維。

如何構建大資料層級體系,看這一文章就夠了

乾貨 : 聚焦於使用者行為分析的資料產品

如何構建大資料層級體系,看這一文章就夠了

80%的運營註定了打雜?因為你沒有搭建出一套有效的使用者運營體系

從底層到應用,那些資料人的必備技能

讀懂使用者運營體系:使用者分層和分群

做運營必須掌握的資料分析思維,你還敢說不會做資料分析

END

版權宣告:本號內容部分來自網際網路,轉載請註明原文連結和作者,如有侵權或出處有誤請和我們聯絡。


關聯閱讀:

原創系列文章:

1:從0開始搭建自己的資料運營指標體系(概括篇)

2 :從0開始搭建自己的資料運營指標體系(定位篇)

3 :從0開始搭建自己的資料運營體系(業務理解篇)

4 :資料指標的構建流程與邏輯

5 :系列 :從資料指標到資料運營指標體系

6:   實戰 :為自己的公號搭建一個資料運營指標體系

7:  從0開始搭建自己的資料運營指標體系(運營活動分析)

資料運營 關聯文章閱讀:  

運營入門,從0到1搭建資料分析知識體系    

推薦 :資料分析師與運營協作的9個好習慣

乾貨 :手把手教你搭建資料化使用者運營體系

推薦 :最用心的運營資料指標解讀

乾貨 : 如何構建資料運營指標體系

從零開始,構建資料化運營體系

乾貨 :解讀產品、運營和資料三個基友關係

乾貨 :從0到1搭建資料運營體系

資料分析、資料產品 關聯文章閱讀:

乾貨 :資料分析團隊的搭建和思考

關於使用者畫像那些事,看這一文章就夠了

資料分析師必需具備的10種分析思維。

如何構建大資料層級體系,看這一文章就夠了

乾貨 : 聚焦於使用者行為分析的資料產品

如何構建大資料層級體系,看這一文章就夠了

80%的運營註定了打雜?因為你沒有搭建出一套有效的使用者運營體系

從底層到應用,那些資料人的必備技能

讀懂使用者運營體系:使用者分層和分群

做運營必須掌握的資料分析思維,你還敢說不會做資料分析

相關文章