Abhinav Sagar作者吴金笛、王欣校对王菁编辑申利彬翻译

手把手教你如何使用Flask轻松部署机器学习模型(附代码&链接)

本文旨在让您把训练好的机器学习模型通过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构建前端,让用户输入数据。这里有三个区域需要用户去填写—利率,第一个月的销售额以及第二个月的销售额。

<!DOCTYPE html>
<html ><head> 
 <meta charset="UTF-8"> 
  <title>Deployment Tutorial 1</title> 
   <link href='https://fonts.googleapis.com/css?family=Pacifico' rel='stylesheet' type='text/css'>
   <link href='https://fonts.googleapis.com/css?family=Arimo' rel='stylesheet' type='text/css'>
   <link href='https://fonts.googleapis.com/css?family=Hind:300' rel='stylesheet' type='text/css'>
   <link href='https://fonts.googleapis.com/css?family=Open+Sans+Condensed:300' rel='stylesheet' type='text/css'>
   <link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}"></head><body style="background: #000;">
    <div><h1>Sales Forecasting
    </h1>    
     <!-- Main Input For Receiving Query to our ML -->   
      <form action="{{ url_for('predict')}}"method="post">
          <input type="text" name="rate" placeholder="rate" required="required" /> 
                 <input type="text" name="sales in first month" placeholder="sales in first month" required="required" />
                 <input type="text" name="sales in second month" placeholder="sales in second month" required="required" />    
                     <button type="submit" class="btn btn-primary btn-block btn-large">Predict sales in third month</button> 
                        </form> 
                          <br> 
                            <br>   {{ prediction_text }} 
                            </div>
                            </body>
                            </html>

接下来,使用CSS对输入按钮、登录按钮和背景进行了一些样式设置。

@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 np
import matplotlib.pyplot as plt
import pandas as pd
import pickle
dataset = 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 LinearRegression
regressor = 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 np
from flask import Flask, request, jsonify, render_template
import pickle
app = 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 requests
url = '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应用程序。

python app.py

在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

THU数据派
THU数据派

THU数据派"基于清华,放眼世界",以扎实的理工功底闯荡“数据江湖”。发布全球大数据资讯,定期组织线下活动,分享前沿产业动态。了解清华大数据,敬请关注姐妹号“数据派THU”。

工程机器学习Flask
1
相关数据
数据分析技术

数据分析是一类统计方法,其主要特点是多维性和描述性。有些几何方法有助于揭示不同的数据之间存在的关系,并绘制出统计信息图,以更简洁的解释这些数据中包含的主要信息。其他一些用于收集数据,以便弄清哪些是同质的,从而更好地了解数据。 数据分析可以处理大量数据,并确定这些数据最有用的部分。

机器学习技术

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

调度技术

调度在计算机中是分配工作所需资源的方法。资源可以指虚拟的计算资源,如线程、进程或数据流;也可以指硬件资源,如处理器、网络连接或扩展卡。 进行调度工作的程序叫做调度器。调度器通常的实现使得所有计算资源都处于忙碌状态,允许多位用户有效地同时共享系统资源,或达到指定的服务质量。 see planning for more details

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

数据科学技术

数据科学,又称资料科学,是一门利用数据学习知识的学科,其目标是通过从数据中提取出有价值的部分来生产数据产品。它结合了诸多领域中的理论和技术,包括应用数学、统计、模式识别、机器学习、数据可视化、数据仓库以及高性能计算。数据科学通过运用各种相关的数据来帮助非专业人士理解问题。

线性回归技术

在现实世界中,存在着大量这样的情况:两个变量例如X和Y有一些依赖关系。由X可以部分地决定Y的值,但这种决定往往不很确切。常常用来说明这种依赖关系的最简单、直观的例子是体重与身高,用Y表示他的体重。众所周知,一般说来,当X大时,Y也倾向于大,但由X不能严格地决定Y。又如,城市生活用电量Y与气温X有很大的关系。在夏天气温很高或冬天气温很低时,由于室内空调、冰箱等家用电器的使用,可能用电就高,相反,在春秋季节气温不高也不低,用电量就可能少。但我们不能由气温X准确地决定用电量Y。类似的例子还很多,变量之间的这种关系称为“相关关系”,回归模型就是研究相关关系的一个有力工具。

特征工程技术

特征工程是利用数据所在领域的相关知识来构建特征,使得机器学习算法发挥其最佳的过程。它是机器学习中的一个基本应用,实现难度大且代价高。采用自动特征工程方法可以省去采用人工特征工程的需求。Andrew Ng 说“挖掘特征是困难、费时且需要专业知识的事,应用机器学习其实基本上是在做特征工程。”

暂无评论
暂无评论~