作者|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 pdfrom sklearn.feature_extraction.text import ENGLISH_STOP_WORDS, TfidfVectorizerfrom sklearn.linear_model import LogisticRegressionfrom sklearn.pipeline import Pipelinefrom sklearn.metrics import f1_scorefrom 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.4888178913738019f1_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测试管道:
# 示例tweettext = ["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函数保留这个管道对象。只需传递管道对象和文件名:
# 导入joblibfrom joblib import dump# 保留管道模型dump(pipeline, filename="text_classification.joblib")
它将创立一个文件“text_classification.joblib“. 当初,咱们将关上另一个Python文件,并应用joblib库的load函数来加载管道模型。
让咱们看看如何应用保留的模型:
# 导入joblibfrom 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 tweepyimport timeimport pandas as pdpd.set_option('display.max_colwidth', 1000)# api keyapi_key = "Enter API Key Here"# api secret keyapi_secret_key = "Enter API Secret Key Here."# access tokenaccess_token = "Enter Access Token Here"# access token secretaccess_token_secret = "Enter Access Token Secret Here."# 受权API Keyauthentication = tweepy.OAuthHandler(api_key, api_secret_key)#对用户access token和access token secret受权authentication.set_access_token(access_token, access_token_secret)# 调用apiapi = 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_forfrom joblib import loadfrom 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函数获取数据并将其发送回网页。
# 启动flaskapp = 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/