害怕部署機器學習模型?這裡有一篇手把手教程

  • 2019 年 11 月 22 日
  • 筆記

照片由 Franck V 發佈在 Unsplash 上

閱讀本文後,你將能夠部署機器學習模型,並用你想要的編程語言進行預測。沒錯,你可以堅持使用 Python,也可以通過 Java 或 Kotlin 直接在你的 Android 應用程序中進行預測。另外,你可以直接在你的 web 應用程序中使用該模型——你有很多很多選擇。為了簡單起見,我會用 Postman。

不過,我不會解釋如何將這個模型放到一個實時服務器上,因為選擇太多了。該模型將在你的本地主機上運行,因此,你將無法從不同的網絡訪問它(但請隨意使用 google 查詢如何將模型部署到 AWS 或類似的東西上)。

我已經做了以下目錄結構:

ML 部署:

  • model / Train.py
  • app.py

如果你已經通過 Anaconda 安裝了 Python,那麼你可能已經預先安裝了所有庫,除了 Flask。因此,啟動終端並執行以下語句:

pip install Flask  pip install Flask-RESTful

進展是不是很順利?很好,現在讓我們來看看好東西。

製作基本預測腳本

如果您正在遵循目錄結構,那麼現在應該打開 model/Train.py 文件。你先要加載虹膜數據集,並使用一個簡單的決策樹分類器來訓練模型。訓練完成後,我將使用 joblib 庫保存模型,並將精度分數報告給用戶。

這裡並不複雜,因為機器學習不是本文的重點,這裡只是模型部署。下面是整個腳本:

from sklearn import datasets  from sklearn.tree import DecisionTreeClassifier  from sklearn.model_selection import train_test_split  from sklearn.metrics import accuracy_score  from sklearn.externals import joblib    def train_model():     iris_df = datasets.load_iris()       x = iris_df.data     y = iris_df.target       X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.25)     dt = DecisionTreeClassifier().fit(X_train, y_train)     preds = dt.predict(X_test)       accuracy = accuracy_score(y_test, preds)     joblib.dump(dt, 'iris-model.model')     print('Model Training Finished.ntAccuracy obtained: {}'.format(accuracy))

部署

現在你可以打開 app.py 文件並執行一些導入操作。你需要操作系統模塊:Flask 和 Flask RESTful 中的一些東西,它們是 10 秒前創建的模型訓練腳本,你還要將它們和 joblib 加載到訓練模型中:

import os  from flask import Flask, jsonify, request  from flask_restful import Api, Resource  from model.Train import train_model  from sklearn.externals import joblib

現在你應該從 Flask RESTful 中創建 Flask 和 Api 的實例。沒什麼複雜的:

app = Flask(__name__)  api = Api(app)

接下來要做的是檢查模型是否已經訓練好了。在 Train.py 中,你已經聲明該模型將保存在文件 iris-model.model 文件中,並且如果該文件不存在,則應該首先對模型進行訓練。訓練完成後,可以通過 joblib 加載:

if not os.path.isfile('iris-model.model'):     train_model()    model = joblib.load('iris-model.model')

現在你需要聲明一個用於進行預測的類。Flask RESTful 使用此編碼約定,因此你的類將需要從 Flask RESTful 資源模塊繼承。在類中,可以聲明 get()、post()或任何其他處理數據的方法。

我們將使用 post(),因此數據不會直接通過 URL 傳遞。你需要從用戶輸入中獲取屬性(根據用戶輸入的屬性值進行預測)。然後,可以調用加載模型的 .predict()函數。僅僅因為這個數據集的目標變量的格式是(0,1,2)而不是('Iris-setosa','Iris versicolor','Iris virginica'),你還需要解決這個問題。最後,你可以返回預測的 JSON 表示:

class MakePrediction(Resource):     @staticmethod     def post():         posted_data = request.get_json()         sepal_length = posted_data['sepal_length']         sepal_width = posted_data['sepal_width']         petal_length = posted_data['petal_length']         petal_width = posted_data['petal_width']           prediction = model.predict([[sepal_length, sepal_width, petal_length, petal_width]])[0]         if prediction == 0:             predicted_class = 'Iris-setosa'         elif prediction == 1:             predicted_class = 'Iris-versicolor'         else:             predicted_class = 'Iris-virginica'           return jsonify({             'Prediction': predicted_class         })

我們就快完成了,加油!你還需要聲明一個路由,URL 的一部分將用於處理請求:

api.add_resource(MakePrediction, '/predict')

最後一件事是告訴 Python 去調試模式運行應用程序:

if __name__ == '__main__':     app.run(debug=True)

這樣做就對了。你可以通過 Postman 或其他工具啟動模型並進行預測。

為了防止你漏掉什麼,這裡是整個 app.py 文件,你可以參考:

import os  from flask import Flask, jsonify, request  from flask_restful import Api, Resource  from model.Train import train_model  from sklearn.externals import joblib    app = Flask(__name__)  api = Api(app)    if not os.path.isfile('iris-model.model'):     train_model()    model = joblib.load('iris-model.model')    class MakePrediction(Resource):     @staticmethod     def post():         posted_data = request.get_json()         sepal_length = posted_data['sepal_length']         sepal_width = posted_data['sepal_width']         petal_length = posted_data['petal_length']         petal_width = posted_data['petal_width']           prediction = model.predict([[sepal_length, sepal_width, petal_length, petal_width]])[0]         if prediction == 0:             predicted_class = 'Iris-setosa'         elif prediction == 1:             predicted_class = 'Iris-versicolor'         else:             predicted_class = 'Iris-virginica'           return jsonify({             'Prediction': predicted_class         })    api.add_resource(MakePrediction, '/predict')    if __name__ == '__main__':     app.run(debug=True)

好的,你準備好了嗎?

不錯!導航到根目錄(app.py 就在根目錄中),啟動終端並執行以下操作:

python app.py

大約一秒鐘後,你將得到一個輸出,顯示應用程序正在本地主機上運行。

現在我將打開 Postman 並執行以下操作:

  • 將方法更改為 POST
  • 輸入 localhost:5000/predict 作為 URL
  • 在 Body 選項卡中選擇 JSON
  • 輸入一些 JSON 進行預測

然後你可以點擊發送:

瞧!幾乎馬上你就能從你的模型中得到預測。

寫在最後

我希望你能看完這篇文章。如果你只是複製粘貼的所有內容,只要你安裝了所有必需的庫,那麼應該就可以繼續。

我強烈建議你在自己的數據集和業務問題上利用這些新獲得的知識。如果你用 Python 以外的語言編寫應用程序,並且使用 Python 只是為了數據和機器學習相關的東西,那麼它就很有用了。 via:https://towardsdatascience.com/deploy-your-machine-learning-model-as-a-rest-api-4fe96bf8ddcc