作者|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-arora/Hate-Speech-Classification-deployed-using-Flask/tree/master

首先导入一些必需的库:

# 导入必需的库
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.4888178913738019f1_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/en/apps/create

一旦你填好表格,你就会拿到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 = 50try:# 从查询中提取单个tweetsfor 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-arora/Hate-Speech-Classification-deployed-using-Flask/tree/master

将网页与模型连接

我们已经完成了前端部分,现在我们连接模型和网页。第一步是加载保存的管道模型,我们将定义一个函数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.com/blog/2020/04/how-to-deploy-machine-learning-model-flask/

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

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

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

使用Flask部署机器学习模型相关推荐

  1. 手把手教你使用Flask轻松部署机器学习模型(附代码链接) | CSDN博文精选

    作者 | Abhinav Sagar 翻译 | 申利彬 校对 | 吴金笛 来源 | 数据派THU(ID:DatapiTHU) 本文旨在让您把训练好的机器学习模型通过Flask API 投入到生产环境  ...

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

    作者:Abhinav Sagar 翻译:申利彬 校对:吴金笛 本文约2700字,建议阅读7分钟. 本文可以让你把训练好的机器学习模型使用Flask API 投入生产环境. 本文旨在让您把训练好的机器学 ...

  3. 只需10分钟!就能用Flask,Docker和Jenkins部署机器学习模型

    在生产环境中部署机器学习模型是数据工程中经常被忽视的领域.网上的大多数教程/博客都侧重于构建.训练和调整机器学习模型.如果它不能用于实际的预测,那么它又有什么用呢? 接下来了解一下有哪些部署选项吧: ...

  4. flask 部署_只需10分钟!就能用Flask,Docker和Jenkins部署机器学习模型

    摘要: 一杯茶的功夫部署完成机器学习模型! 在生产环境中部署机器学习模型是数据工程中经常被忽视的领域.网上的大多数教程/博客都侧重于构建.训练和调整机器学习模型.如果它不能用于实际的预测,那么它又有什 ...

  5. flask部署机器学习_如何开发端到端机器学习项目并使用Flask将其部署到Heroku

    flask部署机器学习 There's one question I always get asked regarding Data Science: 关于数据科学,我经常被问到一个问题: What ...

  6. 机器学习模型部署_9月版部署机器学习模型

    机器学习模型部署 每月版 (MONTHLY EDITION) Often, the last step of a Data Science task is deployment. Let's say ...

  7. 机器学习 部署 嵌入式_如何在移动和嵌入式设备上部署机器学习模型

    机器学习 部署 嵌入式 介绍 (Introduction) Thanks to libraries such as Pandas, scikit-learn, and Matplotlib, it i ...

  8. 部署机器学习模型的后期监视

    概述 部署机器学习模型后下一步是什么? 部署后的监视是任何机器学习项目中的关键步骤 学习部署模型后的监视的各个方面 介绍 你已经建立了你的机器学习模型.你甚至已经准备将你的模型投入生产(或模型部署). ...

  9. Django零基础部署机器学习模型(将模型预测打包成API接口/网页URL)

    Django零基础部署机器学习模型 Django REST framework项目创建 框架结构了解 部署代码 Django REST framework项目创建 建立一个项目文件夹,使用VScode ...

  10. 陈天奇任CTO,TVM团队成立OctoML:让任何硬件都能部署机器学习模型

    陈天奇任CTO,TVM团队成立OctoML:让任何硬件都能部署机器学习模型 据机器之心消息,知名人工智能青年学者.华盛顿大学博士陈天奇于近期参与创建了创业公司 OctoML,担任 CTO 一职. 随着 ...

最新文章

  1. WMI技术介绍和应用——使用VC编写一个半同步查询WMI服务的类
  2. SharePoint 2016 工作流报错“没有适用于此应用程序的地址”
  3. java培训分享:java软件开发可以用哪些软件?
  4. Mozilla在Firefox Nightly 92 版本测试兼容性影响
  5. Android系统匿名共享内存Ashmem(Anonymous Shared Memory)简要介绍和学习计划
  6. 基于分代的垃圾回收算法
  7. leetcode 242. 有效的字母异位词(Java版)
  8. JavaScript 参考教程——写在前面
  9. 引用 看图英语作文万能模板
  10. 看完这篇文章,还不懂nginx,算我输
  11. linux init进程原理,Linux 系统下 init 进程的前世今生
  12. 2021年10月Python小屋编程比赛获奖名单
  13. LVM原理、创建、扩容、缩减、快照详解
  14. 中兴通讯有限公司 招聘“dotnet 高级工程师”
  15. 2022年计算机二级C语言程序设计模拟练习题及答案
  16. 四针角oled屏连接arduino_Arduino提高篇03—OLED屏图片显示
  17. 图片放大-jQuery脚本使用异常:仅闪现图片外框
  18. 67.220.92.12 /forum index.php,http://67.220.92.21/forum/inde PHP静态类
  19. python在化工模拟中的应用_python完成模拟博客园登陆
  20. 【信号重构】经傅里叶逆变换(IFFT)后得到实数序列-含Matlab程序

热门文章

  1. 小管家进销存_美团入局共享充电宝,专家称或收购一两家,同行称雷声大雨点小...
  2. 区块链赋能供应链金融
  3. GRE常见的熟词生义
  4. powerdesigner下载,注释转换和导出word
  5. ASP.NET公司企业网站源码
  6. 苹果apple pay原理_Apple Pay的工作原理
  7. 基于全志a31s的camrea驱动调试(gc2145型号)
  8. 游戏是怎么赚钱的 - 科普篇
  9. 计算机网络管理员四级理论知识试卷,2014计算机网络管理员模拟试题及答案
  10. Topaz滤镜2018全系列合集Topaz Plugins Bundle