Развертывание моделей машинного обучения с помощью Flask

машинное обучение

Автор|ЛАКШАЙ АРОРА Компилировать|ВКонтакте Источник | Аналитика Видья

Обзор

  • Развертывание моделей машинного обучения является ключом к каждому проекту машинного обучения.

  • Узнайте, как развернуть модели машинного обучения в рабочей среде с помощью Flask.

  • Развертывание модели — центральная тема в интервью специалистов по обработке и анализу данных.

вводить

Я помню свои первые дни в машинном обучении. Мне нравится работать над несколькими проблемами, и мне интересны все этапы проекта машинного обучения. Как и многих до меня, меня привлекает построение всего жизненного цикла модели.

Я поговорил с экспертами в предметной области, менеджерами проектов и всеми участниками, чтобы убедиться, что их вклад был включен в модель. Но затем я столкнулся с препятствием — как мне передать свои модели клиентам? Я не могу дать им блокнот Jupyter!

Все, что я узнал, было сосредоточено на компонентах построения моделей. Немногие будут говорить о том, как развернуть вашу модель машинного обучения. Что значит запустить вашу модель в производство? Что ему нужно?

Это ключевые вопросы, определяющие карьеру, на которые должен ответить каждый специалист по данным. Вот почему я решил написать это руководство, чтобы продемонстрировать, как использовать Flask для развертывания моделей машинного обучения.

Сначала мы поймем концепцию развертывания модели, затем обсудим, что такое Flask, как его установить, и, наконец, мы углубимся в постановку задачи, чтобы узнать, как развертывать модели машинного обучения с помощью Flask.

содержание

  1. Что такое развертывание модели?

  2. Что такое Фласк?

  3. Установите Flask на машину

  4. понять постановку задачи

  5. Создайте нашу модель машинного обучения

  6. Настройте API Твиттера

  7. Создание веб-страниц

  8. Соедините веб-страницы с моделями

  9. Посмотреть модели развертывания

Что такое развертывание модели?

В типичном проекте машинного обучения и глубокого обучения мы обычно начинаем с определения постановки задачи, после чего следует сбор и подготовка данных, понимание данных и построение модели, верно?

Но, в конце концов, мы хотим, чтобы наша модель была доступна конечным пользователям, чтобы они могли ею воспользоваться. Развертывание модели — один из заключительных этапов любого проекта машинного обучения, который может быть немного сложным. Как предоставить модели машинного обучения клиентам/заинтересованным сторонам? О чем вам нужно знать, когда ваша модель будет запущена в производство? Как начать развертывание модели?

А вот и роль Фласка.

Что такое Фласк?

Flask — это фреймворк для веб-приложений, написанный на Python. Он имеет несколько модулей, которые облегчают веб-разработчикам написание приложений, не беспокоясь о таких деталях, как управление протоколами, управление потоками и т. д.

Flask — один из вариантов разработки веб-приложений, он предоставляет нам инструменты и библиотеки, необходимые для создания веб-приложений.

В этом руководстве мы будем использовать ресурсы Flask, чтобы помочь нам развернуть нашу собственную модель машинного обучения. Вам понравится работать с Flask!

Установите Flask на машину

Установка Flask проста. Здесь я предполагаю, что у вас установлены Python 3 и pip. Чтобы установить Flask, вам нужно выполнить следующие команды:

sudo apt-get install python3-flask

это все! Приготовьтесь погрузиться в постановку задачи и стать на шаг ближе к развертыванию модели машинного обучения.

понять постановку задачи

В этом разделе мы будем использовать набор данных Twitter. Наша цель — выявить разжигание ненависти в Твиттере. Для простоты, если твит является расистским или сексистским, мы говорим, что он содержит разжигание ненависти.

Мы создадим веб-страницу с таким текстовым полем (пользователи могут искать любой текст):

Для любого поискового запроса мы будем сканировать твиты, связанные с этим текстом, в режиме реального времени, и для всех этих просканированных твитов мы будем использовать модель обнаружения языка ненависти, чтобы классифицировать расистские и сексистские твиты.

Настройка рабочего процесса проекта

  1. построение моделиПостроить: мы создадим конвейер модели логистической регрессии, чтобы классифицировать, содержит ли твит разжигание ненависти. Здесь наше внимание сосредоточено не на том, как построить очень точную модель классификации, а на том, как развернуть эту модель с помощью Flask.
  2. Установите приложение Твиттера: Мы создадим приложение Twitter на сайте разработчика Twitter и получим ключ аутентификации. Мы напишем скрипт Python для очистки твитов, связанных с конкретным текстовым запросом.
  3. веб-шаблон: Здесь мы разработаем пользовательский интерфейс, в котором пользователь может отправить свой запрос.
  4. Получить твиты: после получения запроса от пользователя мы будем использовать API Twitter для получения твитов, связанных с искомым запросом.
  5. Прогнозировать занятия и отправлять результаты: Затем используйте сохраненную модель, чтобы предсказать класс твитов и отправить результат обратно на веб-страницу.

Вот схематическая диаграмма шагов, которые мы только что видели:

Создайте нашу модель машинного обучения

У нас есть данные о твитах в CSV-файле, сопоставленном с тегами. Мы будем использовать модель логистической регрессии, чтобы предсказать, содержит ли твит язык ненависти.

Вы можете скачать полный код и набор данных здесь.

GitHub.com/Открыть Саян-Аро…

Сначала импортируйте некоторые необходимые библиотеки:

# 导入必需的库
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: для обычных твитов это будет 0; для расистских или сексистских твитов это будет 1. 29720 нулей и 2242 единицы.
  3. tweet: твит, опубликованный в Twitter

Теперь мы разделим данные на обучение и тестирование, используя функцию 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Создайте вектор TF-IDF столбца твитов и установите нижний регистр параметра в True, чтобы он сначала преобразовывал текст в нижний регистр. Мы также сохраним максимальное количество функций на уровне 1000 и передадим список стоп-слов, предварительно определенных в библиотеке обучения scikit.

Сначала создайтеTFidfVectorizerобъект, построить модель и сопоставить модель с твитами обучающих данных:

# 创建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)

Теперь мы создадим объект модели логистической регрессии.

Помните, что наше внимание сосредоточено не на построении очень точной модели классификации, а на том, как мы используем эту прогностическую модель для получения результатов.

# 创建线性回归模型的对象
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: Создайте вектор 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
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. Просто передайте объект канала и имя файла:

# 导入joblib
from joblib import dump

# 保存管道模型
dump(pipeline, filename="text_classification.joblib")

он создаст файл"text_classification.joblib"Теперь мы откроем другой файл Python и воспользуемся функцией загрузки библиотеки joblib для загрузки модели конвейера.

Давайте посмотрим, как использовать сохраненную модель:

# 导入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])

Настройте API Твиттера

Первое, что нам нужно сделать, это получить его с сайта разработчика Twitter.API key, API secret key, access token,access token secret. Эти ключи помогут API пройти аутентификацию. Сначала перейдите на эту страницу и заполните форму.

developer.Twitter.com/en/apps/пока горячо…

После заполнения формы вы получите ключ.

установить твипи

Теперь мы установим 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 твитов, связанных с этим конкретным текстовым запросом. Мы будем использовать поисковый API для получения результатов из Twitter.

Некоторые параметры поискового API:

  • q– Строка поискового запроса до 500 символов
  • geocode– Возвращает твиты для пользователей, которые находятся в пределах заданного радиуса заданной широты/долготы.
  • lang- Ограничить твиты на данном языке, заданном кодом ISO 639-1.
  • result_type– Укажите тип результатов поиска, которые вы хотите получить. Текущее значение по умолчанию — «смешанный». Допустимые значения включают:
    • mixed: возвращает список популярных результатов и результатов в реальном времени.
    • recent: вернуть только самые последние результаты
    • popular: возвращать только самые популярные результаты
  • count– Количество результатов, которые пытались получить на страницу. Одновременно можно запросить до 100 твитов.
  • max_id– Возвращать только статусы с id меньше (т.е. раньше) или равным указанному id. С помощью этой опции можно автоматически получать большое количество уникальных твитов.

Мы запросим 50 твитов для данного текстового запроса вместе со временем создания твита, идентификатором твита и текстом твита, функция вернет кадр данных всех твитов:

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)

Создание веб-страниц

Здесь мы создадим веб-страницу, подобную следующей:

Он будет иметь текстовое поле, в котором пользователь может ввести текстовый запрос и нажать кнопку «Поиск», чтобы получить результаты поискового текстового запроса.

Нам нужно добавить тег формы для сбора данных в контейнере поиска, в теге формы мы передаем сообщение метода и имя как «поиск». Предоставляя этот метод, наш бэкенд-код сможет узнать, что мы получили некоторые данные, называемые «поиск», и в бэкэнде нам нужно обработать эти данные и отправить некоторые данные.

Это всего лишь часть HTML-файла. Вы можете скачать полный код и другие файлы, связанные с этим проектом, здесь.

GitHub.com/Открыть Саян-Аро…

Соедините веб-страницы с моделями

Мы сделали переднюю часть, теперь мы соединяем модель и веб-страницу. Первым шагом является загрузка сохраненной модели конвейера. Мы определим функцию requestResults, которая будет получать твиты для запрошенного запроса и использовать конвейер для получения тегов и возврата окончательного результата для отправки.

# 导入所需库
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, который будет принимать имя текущего модуля в качестве параметра. Функция маршрута сообщит приложению Flask, какой URL-адрес отображать на веб-странице следующим.

Когда сервер Flask запущен, приложение Flask перенаправит URL-адрес по умолчанию и вызовет функцию home, которая отобразит файл home.html.

Теперь всякий раз, когда кто-то отправляет текстовый запрос, Flask обнаружит метод post и вызовет функцию get_data, где мы будем использовать поиск по имени для получения данных формы, а затем перенаправим к функции успеха.

Наконец, функция успеха будет использовать функцию 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> "

Теперь вызовите функцию запуска, чтобы запустить сервер Flask:

app.run(debug=True)

Посмотреть модели развертывания

Мы успешно запустили сервер Flask! Откройте браузер и перейдите по этому адресу -http://127.0.0.1:5000/. Вы увидите, что сервер Flask отрендерил шаблон по умолчанию. Теперь найдите любой запрос, например iplt20:

Сервер Flask будет получать данные, связанные с iplt20, и запросы на новые твиты, а также использовать модель для прогнозирования меток и возврата результатов.

Удивительный! Здесь из 50 твитов наша модель предсказала 3 твита, содержащих разжигание ненависти. Мы можем добавить дополнительные функции, такие как запрос твитов из определенной страны.

конец

Вот как выполнить развертывание модели с помощью Flask! Развертывание модели машинного обучения может показаться сложной и обременительной задачей, но как только вы поймете, что это такое и как оно работает, вы уже на полпути.

Оригинальная ссылка:Woohoo.Со слов аналитиков vi.com/blog/2020/0…

Добро пожаловать на сайт блога Panchuang AI:panchuang.net/

sklearn машинное обучение китайские официальные документы:sklearn123.com/

Добро пожаловать на станцию ​​сводки ресурсов блога Panchuang:docs.panchuang.net/