使用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()) + '\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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM