作者 |LAKSHAY ARORA
编译 |VK
起源 |Analytics Vidhya
概述
- 部署机器学习模型是每个 ML 我的项目的一个要害
- 学习如何应用 Flask 将机器学习模型部署到生产中
- 模型部署是数据科学家访谈中的一个外围话题
介绍
我记得我晚期在机器学习畛域的日子。我喜爱解决多个问题,对机器学习我的项目的各个阶段都很感兴趣。和我之前的许多人一样,我被模型整个生命周期的构建所吸引。
我和领域专家谈过,项目经理和所有相干人员确保他们的投入被包含在模型中。但起初我遇到了一个阻碍——我到底该如何把我的模型交给我的客户呢?我不能给他们一个 Jupyter notebook!
我所学的所有都集中在模型构建组件上。没有多少人会议论如何部署你的机器学习模型。把你的模型投入生产意味着什么?它须要什么?
这些都是每个数据科学家须要答复的要害的职业定义问题。这就是为什么我决定写下这个教程来演示如何应用 Flask 来部署机器学习模型。
咱们将首先理解模型部署的概念,而后探讨 Flask 是什么,如何装置它,最初,咱们将深刻到一个问题陈说中,学习如何应用 Flask 部署机器学习模型。
目录
- 什么是模型部署?
- 什么是 Flask?
- 在机器上装置 Flask
- 了解问题陈说
- 建设咱们的机器学习模型
- 设置 Twitter API
- 创立网页
- 将网页与模型连贯
- 查看部署模型
什么是模型部署?
在典型的机器学习和深度学习我的项目中,咱们通常从定义问题陈说开始,而后是数据收集和筹备、数据了解和模型构建,对吧?
然而,最初,咱们心愿咱们的模型可能提供给最终用户,以便他们可能利用它。模型部署是任何机器学习我的项目的最初阶段之一,可能有点辣手。如何将机器学习模型传递给客户 / 利益相关者?当你的模型投入生产时,你须要留神哪些不同的事件?你怎么能开始部署一个模型呢?
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 进行分类。
设置我的项目工作流
- 模型构 建:咱们将建设一个逻辑回归模型管道来分类 tweet 是否蕴含怨恨舆论。在这里,咱们的重点不是如何建设一个十分准确的分类模型,而是看看如何应用 Flask 部署这个模型
- 装置 Twitter 应用程序:咱们将在 Twitter 开发人员的网站上创立一个 Twitter 应用程序,并获取身份验证密钥。咱们将编写一个 Python 脚本来抓取与特定文本查问相干的 tweet
- 网页模板:在这里,咱们将设计一个用户界面,用户能够提交他的查问
- 获取 Tweets:从用户处获取查问后,咱们将应用 twitter API 获取与所搜寻查问相干的 Tweets
- 预测类并发送后果:接下来,应用保留的模型预测 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 列:
- id:每行的惟一编号
- label:对于失常的 tweet,它是 0;对于种族主义或性别歧视的 tweet,它将是 1。有 29720 个 0 和 2242 个 1
- 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:创立一个 tweet 文本的 TF-IDF 向量,其中蕴含下面定义的 1000 个特色
- 步骤 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 token,access token secret。这些密钥将帮忙 API 进行身份验证。首先,转到这一页并填写表格。
https://developer.twitter.com…
一旦你填好表格,你就会拿到 key。
装置 tweepy
当初,咱们将装置 tweepy,它是一个 Python 库,容许咱们拜访 Twitter API。
!pip3 install tweepy
导入所需的库并增加从 Twitter 接管到的身份验证密钥。Tweepy 试图使身份验证对你来说尽可能无痛。
要开始这个过程,须要创立 OAuthHandler 实例并传递 API key 和API secret key。而后应用 access token 和access 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/