乐趣区

使用Flask部署机器学习模型

作者 |LAKSHAY ARORA
编译 |VK
起源 |Analytics Vidhya

概述

  • 部署机器学习模型是每个 ML 我的项目的一个要害
  • 学习如何应用 Flask 将机器学习模型部署到生产中
  • 模型部署是数据科学家访谈中的一个外围话题

介绍

我记得我晚期在机器学习畛域的日子。我喜爱解决多个问题,对机器学习我的项目的各个阶段都很感兴趣。和我之前的许多人一样,我被模型整个生命周期的构建所吸引。

我和领域专家谈过,项目经理和所有相干人员确保他们的投入被包含在模型中。但起初我遇到了一个阻碍——我到底该如何把我的模型交给我的客户呢?我不能给他们一个 Jupyter notebook!

我所学的所有都集中在模型构建组件上。没有多少人会议论如何部署你的机器学习模型。把你的模型投入生产意味着什么?它须要什么?

这些都是每个数据科学家须要答复的要害的职业定义问题。这就是为什么我决定写下这个教程来演示如何应用 Flask 来部署机器学习模型。

咱们将首先理解模型部署的概念,而后探讨 Flask 是什么,如何装置它,最初,咱们将深刻到一个问题陈说中,学习如何应用 Flask 部署机器学习模型。

目录

  1. 什么是模型部署?
  2. 什么是 Flask?
  3. 在机器上装置 Flask
  4. 了解问题陈说
  5. 建设咱们的机器学习模型
  6. 设置 Twitter API
  7. 创立网页
  8. 将网页与模型连贯
  9. 查看部署模型

什么是模型部署?

在典型的机器学习和深度学习我的项目中,咱们通常从定义问题陈说开始,而后是数据收集和筹备、数据了解和模型构建,对吧?

然而,最初,咱们心愿咱们的模型可能提供给最终用户,以便他们可能利用它。模型部署是任何机器学习我的项目的最初阶段之一,可能有点辣手。如何将机器学习模型传递给客户 / 利益相关者?当你的模型投入生产时,你须要留神哪些不同的事件?你怎么能开始部署一个模型呢?

Flask 的作用来了。

什么是 Flask?

Flask 是一个用 Python 编写的 web 应用程序框架。它有多个模块,使 web 开发人员更容易编写应用程序,而不用放心协定治理、线程治理等细节。

Flask 是开发 web 应用程序的抉择之一,它为咱们提供了构建 web 应用程序所必须的工具和库。

在本教程中,咱们将利用 Flask 的资源来帮忙咱们部署本人的机器学习模型。你会喜爱用 Flask 工作的!

在机器上装置 Flask

装置 Flask 简单明了。在这里,我假如你曾经装置了 Python 3 和 pip。要装置 Flask,须要运行以下命令:

sudo apt-get install python3-flask

就这样!筹备好深刻到问题陈说中去,离部署机器学习模型更近一步。

了解问题陈说

在本节中,咱们将应用 Twitter 数据集。咱们的指标是在推特上发现怨恨舆论。为了简略起见,如果推特带有种族主义或性别歧视情绪,咱们说它蕴含怨恨舆论。

咱们将创立一个蕴含如下文本框的网页(用户能够搜寻任何文本):

对于任何搜寻查问,咱们将实时抓取与该文本相干的 tweet,对于所有这些被抓取的 tweet,咱们将应用怨恨语言检测模型对种族主义和性别歧视 tweet 进行分类。

设置我的项目工作流

  1. 模型构 建:咱们将建设一个逻辑回归模型管道来分类 tweet 是否蕴含怨恨舆论。在这里,咱们的重点不是如何建设一个十分准确的分类模型,而是看看如何应用 Flask 部署这个模型
  2. 装置 Twitter 应用程序:咱们将在 Twitter 开发人员的网站上创立一个 Twitter 应用程序,并获取身份验证密钥。咱们将编写一个 Python 脚本来抓取与特定文本查问相干的 tweet
  3. 网页模板:在这里,咱们将设计一个用户界面,用户能够提交他的查问
  4. 获取 Tweets:从用户处获取查问后,咱们将应用 twitter API 获取与所搜寻查问相干的 Tweets
  5. 预测类并发送后果:接下来,应用保留的模型预测 tweets 的类并将后果发送回网页

上面是咱们方才看到的步骤的示意图:

建设咱们的机器学习模型

咱们在映射到标签的 CSV 文件中有对于 Tweets 的数据。咱们将应用 logistic 回归模型来预测 tweet 是否蕴含怨恨舆论。

你能够在这里下载残缺的代码和数据集。

https://github.com/lakshay-ar…

首先导入一些必须的库:

# 导入必须的库
import pandas as pd
from sklearn.feature_extraction.text import ENGLISH_STOP_WORDS, TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
from sklearn.metrics import f1_score
from sklearn.model_selection import train_test_split

接下来,咱们将读取数据集并查看顶行:

# 读取数据集
data = pd.read_csv('dataset/twitter_sentiments.csv')
# 查看顶行
data.head()

数据集有 31962 行和 3 列:

  1. id:每行的惟一编号
  2. label:对于失常的 tweet,它是 0;对于种族主义或性别歧视的 tweet,它将是 1。有 29720 个 0 和 2242 个 1
  3. tweet:在 Twitter 上公布的 tweet

当初,咱们将应用 scikit learn 的 train_test_split 函数将数据分为训练和测试。咱们只将 20% 的数据用于测试。咱们将对标签列上的数据进行分层抽样,以便指标标签在训练和测试数据中的散布雷同:

# 分为训练集和测试集
train, test = train_test_split(data, test_size = 0.2, stratify = data['label'], random_state=21)

# 获取大小
train.shape, test.shape
## >> ((25569, 3), (6393, 3))

当初,咱们将应用TfidfVectorizer 创立 tweet 列的 TF-IDF 向量,并将参数 lowercase 设为 True,以便它首先将文本转换为小写。咱们还将放弃 max features 为 1000,并传递 scikit learn 库中预约义的停用词列表。

首先,创立 TFidfVectorizer 的对象,构建模型并将模型与训练数据 tweets 匹配:

# 创立 TfidfVectorizer 对象
tfidf_vectorizer = TfidfVectorizer(lowercase= True, max_features=1000, stop_words=ENGLISH_STOP_WORDS)

# 拟合模型
tfidf_vectorizer.fit(train.tweet)

利用模型对训练和测试数据的推文进行变换:

# #转换训练和测试数据
train_idf = tfidf_vectorizer.transform(train.tweet)
test_idf  = tfidf_vectorizer.transform(test.tweet)

当初,咱们将创立一个 Logistic 回归模型的对象。

请记住,咱们的重点不是建设一个十分准确的分类模型,而是看咱们如何部署这个预测模型来取得后果。

# 创立线性回归模型的对象
model_LR = LogisticRegression()

# 用训练数据拟合模型
model_LR.fit(train_idf, train.label)

# 预测训练数据的标签
predict_train = model_LR.predict(train_idf)

# 在测试数据预测模型
predict_test = model_LR.predict(test_idf)

# f1 得分
f1_score(y_true= train.label, y_pred= predict_train)
## >> 0.4888178913738019

f1_score(y_true= test.label, y_pred= predict_test)
## >> 0.45751633986928114

让咱们定义管道的步骤:

  1. 步骤 1:创立一个 tweet 文本的 TF-IDF 向量,其中蕴含下面定义的 1000 个特色
  2. 步骤 2:应用逻辑回归模型预测指标标签

当咱们对管道对象应用 fit()函数时,这两个步骤都会执行。在模型训练过程之后,咱们应用 predict())函数来生成预测。

# 定义管道的阶段
pipeline = Pipeline(steps= [('tfidf', TfidfVectorizer(lowercase=True,
                                                      max_features=1000,
                                                      stop_words= ENGLISH_STOP_WORDS)),
                            ('model', LogisticRegression())])

# 用训练数据拟合管道模型                          
pipeline.fit(train.tweet, train.label)

当初,咱们将应用一个示例 tweet 测试管道:

# 示例 tweet
text = ["Virat Kohli, AB de Villiers set to auction their'Green Day'kits from 2016 IPL match to raise funds"]

# 应用管道预测标签
pipeline.predict(text)
## >> array([0])

咱们曾经胜利地构建了机器学习管道,咱们将应用 joblib 库中的 dump 函数保留这个管道对象。只需传递管道对象和文件名:

# 导入 joblib
from joblib import dump

# 保留管道模型
dump(pipeline, filename="text_classification.joblib")

它将创立一个文件“text_classification.joblib“. 当初,咱们将关上另一个 Python 文件,并应用 joblib 库的 load 函数来加载管道模型。

让咱们看看如何应用保留的模型:

# 导入 joblib
from joblib import load

# tweet 文本示例
text = ["Virat Kohli, AB de Villiers set to auction their'Green Day'kits from 2016 IPL match to raise funds"]

# 加载保留的 pipleine 模型
pipeline = load("text_classification.joblib")

# 对 tweet 文本样本的预测
pipeline.predict(text)
## >> array([0])

设置 Twitter API

咱们须要做的第一件事是从 Twitter 开发人员网站获取API key, API secret key, access tokenaccess token secret。这些密钥将帮忙 API 进行身份验证。首先,转到这一页并填写表格。

https://developer.twitter.com…

一旦你填好表格,你就会拿到 key。

装置 tweepy

当初,咱们将装置 tweepy,它是一个 Python 库,容许咱们拜访 Twitter API。

!pip3 install tweepy

导入所需的库并增加从 Twitter 接管到的身份验证密钥。Tweepy 试图使身份验证对你来说尽可能无痛。

要开始这个过程,须要创立 OAuthHandler 实例并传递 API keyAPI secret key。而后应用 access tokenaccess token secret对实例进行身份验证。

# 导入所需库
import tweepy
import time
import pandas as pd
pd.set_option('display.max_colwidth', 1000)

# api key
api_key = "Enter API Key Here"
# api secret key
api_secret_key = "Enter API Secret Key Here."
# access token
access_token = "Enter Access Token Here"
# access token secret
access_token_secret = "Enter Access Token Secret Here."

# 受权 API Key
authentication = tweepy.OAuthHandler(api_key, api_secret_key)

#对用户 access token 和 access token secret 受权
authentication.set_access_token(access_token, access_token_secret)

# 调用 api
api = tweepy.API(authentication, wait_on_rate_limit=True)

接下来,咱们将定义一个函数“get_related_tweets”,它将承受参数 text_query 并返回与该特定文本查问相干的 50 条 tweets。咱们将应用搜寻 API 从 Twitter 获取后果。

搜寻 API 的一些参数是:

  • q–最多 500 个字符的搜寻查问字符串
  • geocode–返回位于给定纬度 / 经度的给定半径内的用户的 tweets
  • lang–将 tweets 限度为给定的语言,由 ISO 639- 1 代码给出
  • result_type–指定心愿接管的搜寻后果类型。以后默认值为“mixed”。有效值包含:

    • mixed:返回蕴含风行和实时后果
    • recent:仅返回最近的后果
    • popular:只返回最风行的后果
  • count–每页尝试检索的后果数。一次最多能够申请 100 条 tweets
  • max_id–仅返回 id 小于(即早于)或等于指定 id 的状态。应用此选项,能够主动获取大量惟一的 tweets

咱们将为给定的文本查问申请 50 条 tweet 以及 tweet 创立工夫、tweet id 和 tweet 文本,函数将返回所有 tweet 的数据帧:

def get_related_tweets(text_query):
    # 存储推文的列表
    tweets_list = []
    # 推特数量
    count = 50
    try:
        # 从查问中提取单个 tweets
        for tweet in api.search(q=text_query, count=count):
            print(tweet.text)
            # 增加到蕴含所有 tweets 的列表
            tweets_list.append({'created_at': tweet.created_at,
                                'tweet_id': tweet.id,
                                'tweet_text': tweet.text})
        return pd.DataFrame.from_dict(tweets_list)

    except BaseException as e:
        print('failed on_status,', str(e))
        time.sleep(3)

创立网页

在这里,咱们将创立一个相似于以下内容的网页:

它将有一个文本框,用户能够在其中键入文本查问,而后单击“搜寻”按钮以获取搜寻文本查问的后果。

咱们须要增加表单标记来收集搜寻容器中的数据,在表单标记中,咱们将办法 post 和 name 作为“search”传递。通过提供这个办法,咱们的后端代码将可能晓得咱们曾经收到了一些名为“search”的数据,在后端,咱们须要解决这些数据并发送一些数据。

这只是 HTML 文件的一部分。你能够在此处下载残缺的代码和与此我的项目相干的其余文件。

https://github.com/lakshay-ar…

将网页与模型连贯

咱们曾经实现了前端局部,当初咱们连贯模型和网页。第一步是加载保留的管道模型,咱们将定义一个函数 requestResults,该函数将获取所申请查问的 tweets,并应用管道获取标签并返回要发送的最终后果。

# 导入所需库
from flask import Flask, render_template, request, redirect, url_for
from joblib import load
from get_tweets import get_related_tweets

# 加载管道对象
pipeline = load("text_classification.joblib")

# 获取特定文本查问的后果
def requestResults(name):
    # 获取推特文本
    tweets = get_related_tweets(name)
    # 获取预测
    tweets['prediction'] = pipeline.predict(tweets['tweet_text'])
    # 获取预测的不同标签的值计数
    data = str(tweets.prediction.value_counts()) + '\n\n'
    return data + str(tweets)

当初,首先,创立 Flask 类的一个对象,该对象将以以后模块名作为参数。route 函数将通知 Flask 应用程序下一步要在网页上出现哪个 URL。

当 Flask 服务器运行时,Flask 应用程序将路由到默认 URL 门路并调用 home 函数,它将出现 home.html 文件。

当初,每当有人发送文本查问时,Flask 将检测 post 办法并调用 get_data 函数,在这里咱们将应用名称搜寻获取表单数据,而后重定向到 success 函数。

最初,success 函数将应用 requestResults 函数获取数据并将其发送回网页。

# 启动 flask
app = Flask(__name__)

# 渲染网页
@app.route('/')
def home():
    return render_template('home.html')

# 当 post 办法检测到时,则重定向到 success 函数
@app.route('/', methods=['POST', 'GET'])
def get_data():
    if request.method == 'POST':
        user = request.form['search']
        return redirect(url_for('success', name=user))

# 获取申请查问的数据
@app.route('/success/<name>')
def success(name):
    return "<xmp>" + str(requestResults(name)) + "</xmp>"

当初,调用 run 函数启动 Flask 服务器:

app.run(debug=True)

查看部署模型

咱们已胜利启动 Flask 服务器!关上浏览器并转到此地址 -http://127.0.0.1:5000/。你将看到 Flask 服务器已出现默认模板。当初搜寻任何查问,如 iplt20:

Flask 服务器将接管与 iplt20 相干的数据和新 tweets 申请,并应用该模型预测标签并返回后果。

令人惊叹!在这里,在 50 条推文中,咱们的模型预测了 3 条蕴含怨恨舆论的推文。咱们能够增加更多的性能,比方申请来自某个国家的推文。

结尾

这就是应用 Flask 执行模型部署的办法!部署机器学习模型听起来可能是一项简单而沉重的工作,然而一旦你理解了它是什么以及它是如何工作的,你就曾经实现了一半。

原文链接:https://www.analyticsvidhya.c…

欢送关注磐创 AI 博客站:
http://panchuang.net/

sklearn 机器学习中文官网文档:
http://sklearn123.com/

欢送关注磐创博客资源汇总站:
http://docs.panchuang.net/

退出移动版