偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

如何使用Flask輕松部署機(jī)器學(xué)習(xí)模型?

譯文
人工智能 機(jī)器學(xué)習(xí)
本文旨在讓你開始使用Flask API將經(jīng)過訓(xùn)練的機(jī)器學(xué)習(xí)模型部署到生產(chǎn)環(huán)境。

如何使用Flask輕松部署機(jī)器學(xué)習(xí)模型?

【51CTO.com快譯】數(shù)據(jù)科學(xué)家/機(jī)器學(xué)習(xí)工程師使用Scikit-Learn、TensorFlow、Keras或PyTorch等開發(fā)機(jī)器學(xué)習(xí)模型時(shí),最終目標(biāo)是將其部署到生產(chǎn)環(huán)境。從事機(jī)器學(xué)習(xí)項(xiàng)目時(shí),我們常常過于關(guān)注探索性數(shù)據(jù)分析(EDA)、特征工程和超參數(shù)調(diào)整等,卻往往忘了主要目標(biāo):從模型預(yù)測中提取實(shí)際價(jià)值。

部署機(jī)器學(xué)習(xí)模型或?qū)⒛P筒渴鸬缴a(chǎn)環(huán)境意味著將模型提供給最終用戶或系統(tǒng)。然而,部署機(jī)器學(xué)習(xí)模型存在復(fù)雜性。本文旨在讓你開始使用Flask API將經(jīng)過訓(xùn)練的機(jī)器學(xué)習(xí)模型部署到生產(chǎn)環(huán)境。

我將利用線性回歸,使用利率和前兩個(gè)月的銷售額來預(yù)測第三個(gè)月的銷售額。

什么是線性回歸?

線性回歸模型的目的是找到一個(gè)或多個(gè)特征(獨(dú)立變量)與連續(xù)目標(biāo)變量(獨(dú)立變量)之間的關(guān)系。如果只有特征,名為單變量線性回歸;如果有多個(gè)特征,名為多變量線性回歸。

線性回歸假設(shè)

線性回歸模型可用下列方程式加以表示:

  • Y是預(yù)測值
  • θ₀是偏項(xiàng)。
  • θ₁,…,θn是模型參數(shù)
  • x 1,x 2,…,x n是特征值。

圖1. 線性回歸圖解

為什么使用Flask?

  • 易于使用。
  • 內(nèi)置的開發(fā)服務(wù)器和調(diào)試器。
  • 集成的單元測試支持。
  • 充分利用REST的請(qǐng)求分派。
  • 豐富的說明文檔。

項(xiàng)目結(jié)構(gòu)

該項(xiàng)目有四個(gè)部分:

  1. model.py——這包含機(jī)器學(xué)習(xí)模型基于頭兩個(gè)月的銷售額預(yù)測第三個(gè)月銷售額的代碼。
  2. app.py——這包含通過GUI或API調(diào)用接收銷售明細(xì),基于我們的模型計(jì)算預(yù)測值并返回的Flask API。
  3. request.py —這使用請(qǐng)求模塊來調(diào)用app.py中定義的API,并顯示返回值。
  4. HTML/CSS——這包含讓用戶可以輸入銷售明細(xì)并顯示第三個(gè)月預(yù)測銷售額的HTML模板和CSS樣式。

圖2. 部署機(jī)器學(xué)習(xí)模型的管道

環(huán)境和工具

  1. scikit-learn
  2. pandas
  3. numpy
  4. flask

代碼在哪里?

不妨先從代碼開始入手。Github上的整個(gè)項(xiàng)目可以在這里(https://github.com/abhinavsagar/Machine-Learning-Deployment-Tutorials)找到。

先從使用HTML構(gòu)建前端以便用戶輸入值入手。用戶需要填三個(gè)字段:利率、第一個(gè)月的銷售額和第二個(gè)月的銷售額。

  1. <!DOCTYPE html> 
  2. <html > 
  3. <head> 
  4.   <meta charset="UTF-8"
  5.   <title>Deployment Tutorial 1</title> 
  6.   <link href='https://fonts.googleapis.com/css?family=Pacifico' rel='stylesheet' type='text/css'
  7. <link href='https://fonts.googleapis.com/css?family=Arimo' rel='stylesheet' type='text/css'
  8. <link href='https://fonts.googleapis.com/css?family=Hind:300' rel='stylesheet' type='text/css'
  9. <link href='https://fonts.googleapis.com/css?family=Open+Sans+Condensed:300' rel='stylesheet' type='text/css'
  10. <link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}"
  11.    
  12. </head> 
  13.  
  14. <body style="background: #000;"
  15.  <div class="login"
  16.     <h1>Sales Forecasting</h1> 
  17.  
  18.      <!-- Main Input For Receiving Query to our ML --> 
  19.     <form action="{{ url_for('predict')}}"method="post"
  20.         <input type="text" name="rate" placeholder="rate" required="required" /> 
  21.         <input type="text" name="sales in first month" placeholder="sales in first month" required="required" /> 
  22.         <input type="text" name="sales in second month" placeholder="sales in second month" required="required" /> 
  23.         <button type="submit" class="btn btn-primary btn-block btn-large">Predict sales in third month</button> 
  24.     </form> 
  25.  
  26.    <br> 
  27.    <br> 
  28.    {{ prediction_text }} 
  29.  
  30.  </div> 
  31. </body> 
  32. </html>  

接下來我使用CSS,為輸入按鈕、登錄按鈕和背景構(gòu)建一些樣式。

  1.     @import url(https://fonts.googleapis.com/css?family=Open+Sans); 
  2.      
  3.     html { width: 100%; height:100%; overflow:hidden; } 
  4.      
  5.     body {  
  6.         width: 100%; 
  7.         height:100%; 
  8.         font-family: 'Helvetica'
  9.         background: #000; 
  10.         color: #fff; 
  11.         font-size: 24px; 
  12.         text-align:center; 
  13.         letter-spacing:1.4px; 
  14.      
  15.     } 
  16.     .login {  
  17.         position: absolute
  18.         top: 40%; 
  19.         left: 50%; 
  20.         margin: -150px 0 0 -150px; 
  21.         width:400px; 
  22.         height:400px; 
  23.     } 
  24.      
  25.     .login h1 { color: #fff; text-shadow: 0 0 10px rgba(0,0,0,0.3); letter-spacing:1px; text-align:center; } 
  26.      
  27.     input {  
  28.         width: 100%;  
  29.         margin-bottom: 10px;  
  30.         background: rgba(0,0,0,0.3); 
  31.         border: none; 
  32.         outline: none; 
  33.         padding: 10px; 
  34.         font-size: 13px; 
  35.         color: #fff; 
  36.         text-shadow: 1px 1px 1px rgba(0,0,0,0.3); 
  37.         border: 1px solid rgba(0,0,0,0.3); 
  38.         border-radius: 4px; 
  39.         box-shadow: inset 0 -5px 45px rgba(100,100,100,0.2), 0 1px 1px rgba(255,255,255,0.2); 
  40.         -webkit-transition: box-shadow .5s ease; 
  41.         -moz-transition: box-shadow .5s ease; 
  42.         -o-transition: box-shadow .5s ease; 
  43.         -ms-transition: box-shadow .5s ease; 
  44.         transition: box-shadow .5s ease; 
  45.     } 
  46. view rawstyle.css hosted with ❤ by GitHub 
  47.  

我為這個(gè)項(xiàng)目創(chuàng)建了自定義銷售數(shù)據(jù)集,它有四列:利率、第一個(gè)月的銷售額、第二個(gè)月的銷售額和第三個(gè)月的銷售額。 

 

rate

sales_in_first_month

sales_in_second_month

sales_in_third_month

   

2

500

300

   

4

300

650

 

four

600

200

400

 

nine

450

320

650

 

seven

600

250

350

 

five

550

200

700

view rawsales.csv hosted with by GitHub

現(xiàn)在,不妨構(gòu)建一個(gè)機(jī)器學(xué)習(xí)模型來預(yù)測第三個(gè)月的銷售額。首先,不妨使用Pandas處理缺失的值。如果沒有為一個(gè)或多個(gè)項(xiàng)提供任何信息,數(shù)據(jù)會(huì)丟失。如果未提供值,我將在利率這列填充零,將在第一個(gè)月的銷售額這列填充該列的平均值。我使用線性回歸作為機(jī)器學(xué)習(xí)算法。

序列化/反序列化

簡而言之,序列化是一種在磁盤上寫入Python對(duì)象(對(duì)象可以傳輸?shù)饺魏蔚胤?,以后由Python腳本反序列化(讀回)的方法。

圖3. 序列化和反序列化

我使用pickling將Python對(duì)象這種形式的模型轉(zhuǎn)換成字符流。其想法是,該字符流含有用另一個(gè)Python腳本重新構(gòu)建對(duì)象必需的所有信息。

  1.     import numpy as np 
  2.     import matplotlib.pyplot as plt 
  3.     import pandas as pd 
  4.     import pickle 
  5.      
  6.     dataset = pd.read_csv('sales.csv'
  7.      
  8.     dataset['rate'].fillna(0, inplace=True
  9.      
  10.     dataset['sales_in_first_month'].fillna(dataset['sales_in_first_month'].mean(), inplace=True
  11.      
  12.     X = dataset.iloc[:, :3] 
  13.      
  14.     def convert_to_int(word): 
  15.         word_dict = {'one':1, 'two':2, 'three':3, 'four':4, 'five':5, 'six':6, 'seven':7, 'eight':8, 
  16.                     'nine':9, 'ten':10, 'eleven':11, 'twelve':12, 'zero':0, 0: 0} 
  17.         return word_dict[word] 
  18.      
  19.     X['rate'] = X['rate'].apply(lambda x : convert_to_int(x)) 
  20.      
  21.     y = dataset.iloc[:, -1] 
  22.      
  23.     from sklearn.linear_model import LinearRegression 
  24.     regressor = LinearRegression() 
  25.      
  26.     regressor.fit(X, y) 
  27.      
  28.     pickle.dump(regressor, open('model.pkl','wb')) 
  29.      
  30.     model = pickle.load(open('model.pkl','rb')) 
  31.     print(model.predict([[4, 300, 500]])) 
  32. view rawmodel.py hosted with ❤ by GitHub  

下一個(gè)部分是構(gòu)建這樣一個(gè)API:通過GUI收到銷售明細(xì)后,基于我們的模型來計(jì)算預(yù)測的銷售額。為此,我反序列了Python對(duì)象這種形式的pickled模型。我使用index.html設(shè)置主頁面。一旦使用POST將表單值提交給/predict,我們就獲得了預(yù)測銷售額。

只要對(duì)/results提出另一個(gè)POST請(qǐng)求,即可顯示結(jié)果。它收到JSON輸入,使用經(jīng)過訓(xùn)練的模型來進(jìn)行預(yù)測,并返回使用JSON格式的該預(yù)測,它可通過API端點(diǎn)來訪問。

  1. import numpy as np 
  2. from flask import Flask, request, jsonify, render_template 
  3. import pickle 
  4.  
  5. app = Flask(__name__) 
  6. model = pickle.load(open('model.pkl''rb')) 
  7.  
  8. @app.route('/'
  9. def home(): 
  10.     return render_template('index.html'
  11.  
  12. @app.route('/predict',methods=['POST']) 
  13. def predict(): 
  14.  
  15.     int_features = [int(x) for x in request.form.values()] 
  16.     final_features = [np.array(int_features)] 
  17.     prediction = model.predict(final_features) 
  18.  
  19.     output = round(prediction[0], 2) 
  20.  
  21.     return render_template('index.html', prediction_text='Sales should be $ {}'.format(output)) 
  22.  
  23. @app.route('/results',methods=['POST']) 
  24. def results(): 
  25.  
  26.     data = request.get_json(force=True
  27.     prediction = model.predict([np.array(list(data.values()))]) 
  28.  
  29.     output = prediction[0] 
  30.     return jsonify(output
  31.  
  32. if __name__ == "__main__"
  33.     app.run(debug=True
  34. view rawapp.py hosted with ❤ by GitHub  

最后,我使用請(qǐng)求模塊來調(diào)用app.py中定義的APP。它顯示了第三個(gè)月的返回銷售額。

  1. import requests  
  2. url = 'http://localhost:5000/results'  
  3. r = requests.post(url,json={'rate':5, 'sales_in_first_month':200, 'sales_in_second_month':400})  
  4. print(r.json())  
  5. view rawrequest.py hosted with ❤ by GitHub  

結(jié)果

使用該命令運(yùn)行這個(gè)Web應(yīng)用程序。

  1. $ python app.py 

圖4

在Web瀏覽器中打開http://127.0.0.1:5000/,應(yīng)該會(huì)出現(xiàn)如下所示的GUI。

圖5. 圖形用戶界面

結(jié)束語

本文演示了部署機(jī)器學(xué)習(xí)模型的一個(gè)很簡單的方法。我利用線性回歸,使用利率和前兩個(gè)月的銷售額來預(yù)測第三個(gè)月的銷售額。你可以利用本文中學(xué)到的知識(shí)構(gòu)建一些很酷的模型,并將它們部署到生產(chǎn)環(huán)境中,以便別人享受到成果。

原文標(biāo)題:How to Easily Deploy Machine Learning Models Using Flask,作者:Abhinav Sagar

【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】

 

責(zé)任編輯:龐桂玉 來源: 51CTO
相關(guān)推薦

2024-09-09 11:45:15

ONNX部署模型

2024-10-12 08:00:00

機(jī)器學(xué)習(xí)Docker

2023-02-07 16:36:34

機(jī)器學(xué)習(xí)Docker無服務(wù)器

2020-12-31 08:00:00

機(jī)器學(xué)習(xí)人工智能工程師

2021-01-25 09:00:00

機(jī)器學(xué)習(xí)人工智能算法

2021-11-02 09:40:50

TensorFlow機(jī)器學(xué)習(xí)人工智能

2017-07-07 14:41:13

機(jī)器學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)JavaScript

2019-08-08 08:00:00

深度學(xué)習(xí)機(jī)器學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)

2017-10-23 15:46:37

2025-02-17 08:00:00

機(jī)器學(xué)習(xí)開發(fā)Docker

2022-03-28 18:59:02

DockerFlask深度學(xué)習(xí)

2024-02-20 15:17:35

機(jī)器學(xué)習(xí)模型部署

2022-09-07 08:00:00

機(jī)器學(xué)習(xí)MLFlow工具

2020-07-10 10:39:04

Python開發(fā)工具

2018-01-08 09:09:46

機(jī)器學(xué)習(xí)模型NET

2022-06-02 15:42:05

Python機(jī)器學(xué)習(xí)

2018-11-07 09:00:00

機(jī)器學(xué)習(xí)模型Amazon Sage

2017-07-13 10:12:58

機(jī)器學(xué)習(xí)

2017-03-24 15:58:46

互聯(lián)網(wǎng)

2020-09-22 14:59:52

機(jī)器學(xué)習(xí)人工智能計(jì)算機(jī)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)