使用Flask和Python在Web上部署机器学习模型

创建机器学习模型并对现实问题进行预测听起来很酷。但是,除了模型的创建者之外,这对其他任何人都没有什么用,因为它只能在他们的机器上使用。

在本文中,我们将介绍如何使用Flask(用于在Python中构建网站和API的微框架)来构建Web API

image

让我们通过在Python中构建一个简单的线性回归模型来开始该过程

第一步。使用Scikit Learn导入构建线性回归模型所需的所有必要库

在这里,我使用homeprices.csv文件来训练我们的模型,该模型具有两个功能,面积和房价。

image

第二步。使用熊猫读取数据并定义我们的变量进行训练

model_1.py

import pandas as pd
import numpy as np
from sklearn import linear_model
import matplotlib.pyplot as plt

model_2.py

df = pd.read_csv('homeprices.csv')

x=df[['area']]
y=df[['price']]

第三步。训练我们的模型

第四步。计算分数和系数,并对面积变量的某个值进行预测。
model_3.py

reg = linear_model.LinearRegression()
reg.fit(x,y)

model_4.py

print(reg.score(x,y))
print(reg.predict([[3300]]))
print(reg.coef_)
print(reg.intercept_)

现在我们的简单线性回归模型已经准备就绪,让我们着手进行模型持久化并将以上内容另存为.pkl文件
model.py

from sklearn.externals import joblib
joblib.dump(reg,"linear_reg.pkl")
image

现在,我们的模型已保存,可以随时通过再次加载该模型进行重用。

让我们使用Flask构建一个Web API,并了解以简单方式实现相同目的的过程。

Flask简介

如果您下载了Anaconda发行版,则已经安装了Flask,否则,您将必须使用—自行安装pip install flask。

Flask非常少,因为您只在需要时才引入零件。为了演示这一点,这里是Flask代码,用于创建一个非常简单的Web服务器。

from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
    return "Hello World!"
if __name__ == '__main__':
    app.run(debug=True)

执行后,您可以导航到终端上显示的网址,并观察预期的结果。

image

让我们回顾一下所执行的代码在做什么。

导入后,我们创建Flask类的实例,并传入namePython为我们填充的变量。"main"如果此文件直接作为脚本通过Python运行,则此变量为。如果我们改为导入文件,则的值name将是我们进行导入的文件的名称。举例来说,如果我们有test.py和run.py,和我们进口test.py到run.py该name值test.py会test。

在我们的hello方法定义上方,有@app.route("/")一行。的@表示装饰,这允许功能,属性,或类是先于被动态改变。

该hello方法是在我们的应用程序或API的路由达到顶级路由时,我们将代码运行的地方/。

如果我们的name变量main,指示我们直接运行文件而不是导入文件,那么它将启动Flask应用程序,该应用程序将运行并等待Web请求,直到过程结束。

创建API

预测API

预测API非常简单。我们将其数据,房屋面积提供给我们,并将其传递给我们predict的模型方法。

from flask import Flask,jsonify,request
from sklearn.externals import joblib
app = Flask(__name__)

@app.route("/", methods=['POST','GET'])
def index():
    if(request.method == 'POST'):
        data = request.get_json()
        house_price = float(data["area"])
        lin_reg = joblib.load("./linear_reg.pkl")
        return jsonify(lin_reg.predict([[house_price]]).tolist())
    else:
        return  jsonify({"about":"Hello World"})

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

这里发生了很多事情,所以让我们分解一下。

与上面介绍Flask的代码相似,我们称@app.route装饰器。

在路由方法定义中,我们将请求方法限制为GET / POST,如果这样,我们将获取请求主体的JSON,以便我们可以访问其数据。使用该变量,我们可以访问所需数据的键,area并将其解析为浮点数。我们还将模型从持久性文件加载到内存中。

如果解析数据没有错误,则将解析后的变量传递到predict线性回归模型的方法中。在启动时加载Flask应用时,变量被拉入内存。接下来,我们必须将predict方法的输出更改为列表,因为没有它,我们将得到一个错误:Object of type 'ndarray' is not JSON serializable。然后,我们调用Flask方法将响应数据作为JSON发送。

现在我们可以运行我们的API(在PyCharm中,您可以右键单击脚本中的任意位置,然后单击“运行”)。通过运行我们的API,我们可以执行代码来调用它。

import requests

data = {"area": 3300}
response = requests.post("{}/".format("http://127.0.0.1:5000"), json =data )
print("Price of the house should be "+ str(response.json()))

最后,我们可以在终端上看到输出。

image

在这篇文章中,我们了解了Flask是什么,如何使用它来创建API,最重要的是,如何应用这些知识来创建与机器学习模型进行交互的API。

希望本教程对您有所帮助,谢谢您的阅读。我对您的想法感到好奇,所以打了一些评论给我。

你可能感兴趣的:(使用Flask和Python在Web上部署机器学习模型)