作者|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 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列:

  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测试管道:

# 示例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 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 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/