首頁>科技>

翻譯:申利彬

校對:吳金笛

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

本文可以讓你把訓練好的機器學習模型使用Flask API 投入生產環境。

本文旨在讓您把訓練好的機器學習模型通過Flask API 投入到生產環境 。

當資料科學或者機器學習工程師使用Scikit-learn、Tensorflow、Keras 、PyTorch等框架部署機器學習模型時,最終的目的都是使其投入生產。通常,我們在做機器學習專案的過程中,將注意力集中在資料分析,特徵工程,調整引數等方面。但是,我們往往會忘記主要目標,即從模型預測結果中獲得實際的價值。

部署機器學習模型或者將模型投入生產,意味著將模型提供給最終的使用者或系統使用。

然而機器學習模型部署具有一定的複雜性,本文可以讓你把訓練好的機器學習模型使用Flask API 投入生產環境。

我將使用線性迴歸,通過利率和前兩個月的銷售額來預測第三個月的銷售額。

線性迴歸是什麼?

線性迴歸模型的目標是找出一個或多個特徵(自變數)和一個連續目標變數(因變數)之間的關係。如果只有一個特徵,則稱為單變數線性迴歸;如果有多個特徵,則稱為多元線性迴歸。

線性迴歸的假設

線性迴歸模型可以用下面的等式表示:

線性迴歸圖解

為什麼使用Flask?

容易上手使用內建開發工具和除錯工具整合單元測試功能平穩的請求排程詳盡的文件

專案結構

這個專案分為四個部分:

1. model.py -- 包含機器學習模型的程式碼,用於根據前兩個月的銷售額預測第三個月的銷售額。

2. app.py – 包含用於從圖形使用者介面(GUI)或者API呼叫獲得詳細銷售資料的Flask API,Flask API根據我們的模型計算預測值並返回。

3. request.py -- 使用requests模組呼叫app.py中定義的API並顯示返回值。

4. HTML/CSS – 包含HTML模板和CSS風格程式碼,允許使用者輸入銷售細節並顯示第三個月的預測值。

部署機器學習模型的Pipeline

環境和工具

1. Scikit-learn

2. Pandas

3. Numpy

4. Flask

程式碼在哪裡呢?

從程式碼開始,完整的專案可以在github上找到(https://github.com/abhinavsagar/Machine-Learning-Deployment-Tutorials)。

我們使用HTML構建前端,讓使用者輸入資料。這裡有三個區域需要使用者去填寫—利率,第一個月的銷售額以及第二個月的銷售額。

@import url(https://fonts.googleapis.com/css?family=Open+Sans);html { width: 100%; height:100%; overflow:hidden; }body {width: 100%;height:100%;font-family: 'Helvetica';background: #000;color: #fff;font-size: 24px;text-align:center;letter-spacing:1.4px;}.login {position: absolute;top: 40%;left: 50%;margin: -150px 0 0 -150px;width:400px;height:400px;}
login h1 { color: #fff; text-shadow: 0 0 10px rgba(0,0,0,0.3); letter-spacing:1px; text-align:center;  }input {width: 100%; margin-bottom: 10px; background: rgba(0,0,0,0.3); border: none; outline: none; padding: 10px; font-size: 13px; color: #fff; text-shadow: 1px 1px 1px rgba(0,0,0,0.3); border: 1px solid rgba(0,0,0,0.3); border-radius: 4px; box-shadow: inset 0 -5px 45px rgba(100,100,100,0.2), 0 1px 1px rgba(255,255,255,0.2); -webkit-transition: box-shadow .5s ease; -moz-transition: box-shadow .5s ease; -o-transition: box-shadow .5s ease; -ms-transition: box-shadow .5s ease; transition: box-shadow .5s ease; }

我為這個專案建立了一個定製的銷售資料集,它有四列——利率、第一個月的銷售額、第二個月的銷售額和第三個月的銷售額。

我們現在構建一個機器學習模型來預測第三個月的銷售額。首先使用Pandas解決缺失值問題,當一項或多項指標沒有資訊時,就會有缺失值發生。使用0填充利率這一列的缺失值,平均值填充第一個月銷售額中的缺失值,採用線性迴歸的機器學習演算法。

序列化和反序列化

簡而言之,序列化是一種在磁碟上寫入python物件的方法,該物件可以傳輸到任何地方,然後通過python指令碼反序列化(讀)回去。

序列化 反序列化

使用Pickling將是python物件形式的模型轉為字元流形式,其思想是這個字元流中包含了在另一個python指令碼中重建這個物件所需的所有資訊。

import numpy as npimport matplotlib.pyplot as pltimport pandas as pdimport pickledataset = pd.read_csv('sales.csv')dataset['rate'].fillna(0, inplace=True)dataset['sales_in_first_month'].fillna(dataset['sales_in_first_month'].mean(), inplace=True)X = dataset.iloc[:, :3]def convert_to_int(word): word_dict = {'one':1, 'two':2, 'three':3, 'four':4, 'five':5, 'six':6, 'seven':7, 'eight':8, 'nine':9, 'ten':10, 'eleven':11, 'twelve':12, 'zero':0, 0: 0} return word_dict[word]X['rate'] = X['rate'].apply(lambda x : convert_to_int(x))y = dataset.iloc[:, -1]from sklearn.linear_model import LinearRegressionregressor = LinearRegression()regressor.fit(X, y)pickle.dump(regressor, open('model.pkl','wb'))model = pickle.load(open('model.pkl','rb'))print(model.predict([[4, 300, 500]]))

下一部分是構建一個API,反序列化這個模型為python物件格式,並通過圖形使用者介面(GUI)獲取詳細銷售資料,根據模型計算預測值。我使用index.html設定主頁,並在使用POST請求方式提交表單資料時,獲取預測的銷售值。

可以通過另一個POST請求將結果傳送給results並展示出來。它接收JSON格式的輸入,並使用訓練好的模型預測出可以被API端點接受的JSON格式的預測值。

import numpy as npfrom flask import Flask, request, jsonify, render_templateimport pickleapp = Flask(__name__)model = pickle.load(open('model.pkl', 'rb'))@app.route('/')def home():  return render_template('index.html') @app.route('/predict',methods=['POST']) def predict():  int_features = [int(x) for x in request.form.values()] final_features = [np.array(int_features)]  prediction = model.predict(final_features) output = round(prediction[0], 2)  return render_template('index.html', prediction_text='Sales should be $ {}'.format(output))@app.route('/results',methods=['POST'])def results(): data = request.get_json(force=True) prediction = model.predict([np.array(list(data.values()))]) output = prediction[0] return jsonify(output)if __name__ == "__main__":app.run(debug=True)

最後使用requests模組呼叫在app.py中定義的APIs,它的結果是第三個月銷售額的預測值。

import requestsurl = 'http://localhost:5000/results'r = requests.post(url,json={'rate':5, 'sales_in_first_month':200, 'sales_in_second_month':400})print(r.json()) Results

使用下面的命令執行Web應用程式。

在web瀏覽器中開啟http://127.0.1:5000/,將顯示如下所示的GUI.

原文標題:

How to Easily Deploy Machine Learning Models Using Flask

原文連結:

https://www.kdnuggets.com/2019/10/easily-deploy-machine-learning-models-using-flask.html

校對:王欣

— 完 —

  • 整治雙十一購物亂象,國家再次出手!該跟這些套路說再見了
  • 華為EMUI和小米MIUI哪個更好用?差距還是很明顯的