Как быстро запустить службу прогнозирования в Flask
Как быстро запустить службу прогнозирования в Flask
После обучения и тестирования модели машинного обучения следующим шагом будет создание сервиса, который ее использует. В этой статье вы узнаете, как реализовать веб-сервис, использующий обученную модель. Мы внедрим службу с использованием Flask, популярного веб-фреймворка Python.
В качестве варианта использования мы внедрим веб-сервис, который прогнозирует категорию (серебро или золото) на основе некоторых входных характеристик. Будем считать, что у нас уже есть модель для использования.
Мы рассмотрим:
- Наш сценарий
- Сохранение модели
- Настройка среды
- Создание службы Flask
- Запуск службы Flask
Наш сценарий
Предположим, вы внедрили классификационную модель, которая предсказывает категорию бриллианта (золото или серебро), и теперь вы хотите создать веб-сервис, который ее использует. Вы обучили модель классификации с использованием модифицированной версии набора данных diamonds, выпущенной ggplot2 по лицензии MIT:
Модель получает множество характеристик в качестве входных данных (карат, огранка, цвет, четкость, глубина, таблица, цена, x, y и z) и возвращает целевой класс в качестве выходных данных.
Предположим, что вы протестировали разные модели, выбрали лучшую модель и сохранили ее в переменной с именем model
. Вы можете построить модель, используя код, описанный в этом Jupyter Notebook. Ваша цель – использовать модель в качестве внешнего веб-сервиса.
Сохранение модели
Первым шагом к созданию веб-службы является сохранение модели и всех кодеров во внешний файл. Например, если вы манипулировали входными объектами на этапе предварительной обработки, вы должны сохранить кодеры, которые вы использовали для манипулирования.
Выполните шаги, описанные ниже:
- Сериализуйте свою обученную модель с помощью Pickle или аналогичной библиотеки. Сохраните сериализованную модель в файл (например,
model.pkl
). - Если вашей модели требуются кодеры, сохраните их в виде отдельных сериализованных файлов.
В Python вы можете сохранить модель и все кодеры, используя библиотеку Pickle, следующим образом:
import
model = # the fitted model
withopen('model.pkl', 'wb') as file:
pickle.dump(obj, file)
file.close()
В результате файл model.pkl
будет содержать вашу обученную модель, которую вы сможете использовать в других приложениях.
Настройка среды
Сначала установите Flask, выполнив следующую команду: pip install flask
. Создайте новый каталог для вашего проекта, содержащий следующие подкаталоги:
models
, который содержит все модели и кодерыtemplates
который содержит HTML-файлы, определяющие пользовательский интерфейс для вашей службы прогнозирования.
Создание службы Flask
Служба Flask – это веб-приложение, которое показывает форму ввода для вставки входных объектов и возвращает новую страницу с предсказанным значением.
Сначала мы определяем два файла: index.html
и predict.html
; а затем переходим к реализации app.py
.
index.html
Этот файл является домашней страницей вашей службы прогнозирования. Настройте этот шаблон, чтобы включить функции ввода для модели. Следующий фрагмент показывает HTML-код для создания формы ввода для службы прогнозирования:
<div class="textbox">
<form action="{{ url_for('predict') }}" method='POST'>
<p>Diamond Classification</p>
<div class="item">
<label for="name">Carat<span>*</span></label><br/>
<input id="carat" type="text" name="carat" required/>
</div>
<div class="item">
<label for="name">Color<span>*</span></label><br/>
<select name="color">
<option selected value="" disabled selected></option>
<option value="D" >D</option>
<option value="E">E</option>
<option value="F">F</option>
<option value="G">G</option>
<option value="H">H</option>
<option value="I">I</option>
<option value="J">J</option>
</select>
</div>
<div class="item">
<label for="name">Clarity<span>*</span></label><br/>
<select name="clarity">
<option selected value="" disabled selected></option>
<option value="I1" >I1</option>
<option value="IF">IF</option>
<option value="SI1">SI1</option>
<option value="SI2">SI2</option>
<option value="VS1">VS1</option>
<option value="VS2">VS2</option>
<option value="VVS1">VVS1</option>
<option value="VVS2">VVS2</option>
</select>
</div>
<div class="item">
<label for="name">Depth<span>*</span></label><br/>
<input id="depth" type="text" name="depth" required/>
</div>
<div class="item">
<label for="name">Table<span>*</span></label><br/>
<input id="table" type="text" name="table" required/>
</div>
<div class="item">
<label for="name">Price<span>*</span></label><br/>
<input id="price" type="text" name="price" required/>
</div>
<div class="item">
<label for="name">X<span>*</span></label><br/>
<input id="x" type="text" name="x" required/>
</div>
<div class="item">
<label for="name">Y<span>*</span></label><br/>
<input id="y" type="text" name="y" required/>
</div>
<div class="item">
<label for="name">Z<span>*</span></label><br/>
<input id="z" type="text" name="z" required/>
</div>
<div class="btn-block">
<button type="submit" href="/">CLASSIFY</button>
</div>
</form>
</div>
Обратите внимание, что действие формы – это {{ url_for(‘predict’) }}, что означает, что после отправки форма вызовет файл predict.
predict.html
Этот файл отображается при выполнении прогноза. Вы можете настроить его так, чтобы он отображал пользователю прогнозируемый результат. В следующем фрагменте показан код predict.html:
<div class="textbox">
<div class="mainbox">
<h2>Diamond Classification</h2>
<div id="target" class="target">
{{ target }}
</div>
</div>
</div>
Код содержит переменную {{ target}}, которую приложение Flask заполнит значением фактического прогноза.
app.py
Этот скрипт определяет функцию для каждой реализованной HTML-страницы и некоторый базовый код для создания приложения Flask.
Чтобы создать приложение Flask, импортируйте необходимые библиотеки, создайте экземпляр приложения Flask с именем app и включите автоматическую перезагрузку шаблона для удобства во время разработки.
import argparse
import pandas as pd
import pickle
import os
from flask import Flask, render_template, request
app = Flask(__name__)
app.config["TEMPLATES_AUTO_RELOAD"] = True
Далее мы определяем служебную функцию load_model(), которая принимает имя файла в качестве входных данных и загружает сериализованную модель из этого файла. Функция использует модуль pickle для десериализации объекта модели, хранящегося в файле.
def load_model(file_name):
f = open(file_name, 'rb')
unpickler = pickle.Unpickler(f)
model = unpickler.load()
f.close()
return model
Теперь мы загружаем модель и кодировщики. Мы предполагаем наличие следующих моделей: colorFeatureLabelEncoder.pkl, clarityFeatureLabelEncoder.pkl, scaler.pkl, model.pkl и LabelEncoder.pkl. Переменная base_dir представляет абсолютный путь к каталогу, содержащему приложение Flask.
base_dir = os.path.abspath(os.path.dirname(__file__))
color_label_encoder = load_model(f"{base_dir}/models/colorFeatureLabelEncoder.pkl")
clarity_label_encoder = load_model(f"{base_dir}/models/clarityFeatureLabelEncoder.pkl")
scaler = load_model(f"{base_dir}/models/scaler.pkl")
model = load_model(f"{base_dir}/models/model.pkl")
label_encoder = load_model(f"{base_dir}/models/labelEncoder.pkl")
Теперь мы определяем функцию для каждой HTML-страницы. Определяйте маршруты с помощью декоратора @app.route().
@app.route('/')
def home():
return render_template('index.html')
Маршрут / соответствует корневому URL-адресу веб-приложения. При обращении выполняется функция home(), которая отображает шаблон index.html.
Мы также определяем прогнозируемый маршрут следующим образом:
@app.route('/predict', methods=['GET', 'POST'])
def predict():
params = request.form.to_dict()
print(params)
df = pd.DataFrame(params, index=[1])
print(df)
num_cols = df.columns.tolist()
print(num_cols)
# remove categorical columns
cat_cols = ['color', 'clarity']
for col in cat_cols:
num_cols.remove(col)
df[num_cols] = df[num_cols].apply(pd.to_numeric, errors='coerce')
# prepare data
df['color'] = color_label_encoder.transform(df['color'])
df['clarity'] = clarity_label_encoder.transform(df['clarity'])
df[df.columns] = scaler.transform(df[df.columns])
target = model.predict(df)
label = label_encoder.inverse_transform(target)
return render_template('predict.html', target=label[0] )
Здесь мы определяем другой маршрут Flask в /predict. Этот маршрут обрабатывает запросы на прогнозирование. Он поддерживает как методы GET, так и POST. Когда делается запрос, запускается функция predict(). Она извлекает данные формы, отправленные пользователем, и сохраняет их в словаре параметров. Приведенный выше код создает df-фрейм данных Pandas, используя данные из параметров. Данные структурированы в виде одной строки с индексом [1].
Затем мы манипулируем фреймом данных, чтобы получить ту же структуру входных объектов, что и в обучающем наборе. Мы также преобразуем категориальные столбцы “color” и “clarity”, используя соответствующие кодеры меток (color_label_encoder и clarity_label_encoder). Кодеры меток преобразуют категориальные значения в числовые представления, понятные модели. Затем мы применяем масштабирование объектов ко всему фрейму данных, используя объект scaler.
Мы используем объект model для составления прогнозов на основе предварительно обработанного фрейма данных df. Прогнозируемое целевое значение сохраняется в целевой переменной. Поскольку целевые значения были закодированы, мы используем label_encoder для инвертирования преобразования и получения исходной метки.
Наконец, мы визуализируем шаблон predict.html. Наконец, мы добавляем строку, которая запускает приложение:
if __name__ == '__main__':
app.run(host='0.0.0.0')
Запуск приложения Flask
Теперь вы можете запустить приложение Flask. Откройте терминал, перейдите в каталог, содержащий скрипт Flask, и выполните следующую команду:
python your_script_name.py
Заменить your_script_name.py с фактическим именем вашего файла Flask. Когда приложение Flask запущено, откройте свой браузер и введите адрес сервера (например, http://localhost:5000 /) в адресной строке. Вы должны увидеть домашнюю страницу вашего сервиса прогнозирования:
Заполните необходимые поля ввода, и когда вы отправите форму, прогноз будет отображен на странице результатов.
Заключение
Поздравляю! Вы успешно настроили и запустили службу прогнозирования в Flask. Сначала напишите свои HTML-файлы, затем создайте службу Flask, которая их загружает
Вы можете скачать полный код для этого примера из моего репозитория на GitHub.
Надеюсь, что данная статья окажется полезной для вас!