手把手教你用Python庫Keras做預測(附程式碼)
翻譯:張逸 ;校對:馮羽
本文約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
版權宣告:本號內容部分來自網際網路,轉載請註明原文連結和作者,如有侵權或出處有誤請和我們聯絡。
關聯閱讀:
原創系列文章:
資料運營 關聯文章閱讀:
資料分析、資料產品 關聯文章閱讀:
80%的運營註定了打雜?因為你沒有搭建出一套有效的使用者運營體系
END
版權宣告:本號內容部分來自網際網路,轉載請註明原文連結和作者,如有侵權或出處有誤請和我們聯絡。
關聯閱讀:
原創系列文章:
資料運營 關聯文章閱讀:
資料分析、資料產品 關聯文章閱讀:
相關文章
- 手把手教你用python搶票回家過年 !(附程式碼)Python
- 手把手教你用Prophet快速進行時間序列預測(附Prophet和R程式碼)
- 手把手教你用Python的Prophet庫進行時間序列預測Python
- 手把手教你用Python建立簡單的神經網路(附程式碼)Python神經網路
- 手把手教你用Python進行迴歸(附程式碼、學習資料)Python
- 如何用LSTMs做預測?(附程式碼)| 博士帶你學LSTM
- 教你用深度學習LSTM網路預測流行音樂趨勢(附程式碼)深度學習
- 手把手教你使用OpenCV庫(附例項、Python程式碼解析)OpenCVPython
- 手把手教你開發CNN LSTM模型,並應用在Keras中(附程式碼)CNN模型Keras
- Python技巧-教你用Python告白小姐姐(附程式碼)Python
- 手把手教你用Spuernova生成flutter程式碼Flutter
- 手把手教你用python做一個年會抽獎系統Python
- 手把手:AlphaGo有啥了不起,我也能教你做一個(附Python程式碼)GoPython
- NLP詳細教程:手把手教你用ELMo模型提取文字特徵(附程式碼&論文)模型特徵
- Python機器學習筆記:使用Keras進行迴歸預測Python機器學習筆記Keras
- 手把手教你用飛槳做詞向量模型 SkipGram模型
- 200 行 Python 程式碼做個換臉程式(附原始碼)Python原始碼
- 手把手教你搭建AlphaZero(使用Python和Keras)PythonKeras
- 手把手教你用ManagedSQLiteOpenHelper實現資料庫SQLite資料庫
- Python做點選率資料預測Python
- 手把手教你用Python實踐深度學習Python深度學習
- 資料 + 程式碼,基於 Keras 的煙火檢測Keras
- 手把手教你用 Nuget 管理自己的專案庫
- 手把手教你做測開
- 百聞不如一碼!手把手教你用Python搭一個TransformerPythonORM
- 手把手 | 基於TextRank演算法的文字摘要(附Python程式碼)演算法Python
- 教你用100多行寫一個資料庫(附原始碼)資料庫原始碼
- 手把手教你用6行程式碼製作月曆生成器行程
- 利用深度學習和機器學習預測股票市場(附程式碼)深度學習機器學習
- 小白指南:手把手教你用低程式碼開發一個應用頁面
- 手把手:用Python搭建機器學習模型預測黃金價格Python機器學習模型
- 一文學會如何在Keras中開發LSTMs(附程式碼)Keras
- 手把手教你用人工智慧預測以太坊價格 | Jeth Podcast 線上直播第一期人工智慧AST
- 手把手教你用100行程式碼實現基於 react的 markdown 輸入 + 即時預覽線上編輯器行程React
- 手把手教你在Python中實現文字分類(附程式碼、資料集)Python文字分類
- 手把手:教你用Scrapy建立你自己的資料集(附視訊)
- 用python做時間序列預測一:初識概念Python
- 【“探探”為例】手把手教你用最少的程式碼實現各種“機器人”機器人