zoukankan      html  css  js  c++  java
  • 使用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-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.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/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 = 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-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()) + '
    
    '
        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/

  • 相关阅读:
    DPDK安装方法 17.12.13
    numa.h:No such file or directory 解决方法
    17秋 软件工程 第六次作业 Beta冲刺 Scrum3
    17秋 软件工程 第六次作业 Beta冲刺 总结博客
    17秋 软件工程 第六次作业 Beta冲刺 Scrum2
    Paper Reviews and Presentations
    17秋 软件工程 第六次作业 Beta冲刺 Scrum1
    17秋 软件工程 第六次作业 Beta冲刺
    error: could not create '/System/Library/Frameworks/Python.framework/Versions/2.7/share': Operation not permitted
    17秋 软件工程 个人作业 软件产品案例分析
  • 原文地址:https://www.cnblogs.com/panchuangai/p/13274656.html
Copyright © 2011-2022 走看看