Как быстро запустить службу прогнозирования в Flask

Как быстро запустить службу прогнозирования в Flask

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

В качестве варианта использования мы внедрим веб-сервис, который прогнозирует категорию (серебро или золото) на основе некоторых входных характеристик. Будем считать, что у нас уже есть модель для использования.

Мы рассмотрим:

  • Наш сценарий
  • Сохранение модели
  • Настройка среды
  • Создание службы Flask
  • Запуск службы Flask

Наш сценарий

Предположим, вы внедрили классификационную модель, которая предсказывает категорию бриллианта (золото или серебро), и теперь вы хотите создать веб-сервис, который ее использует. Вы обучили модель классификации с использованием модифицированной версии набора данных diamonds, выпущенной ggplot2 по лицензии MIT:

Как быстро запустить службу прогнозирования в Flask

Модель получает множество характеристик в качестве входных данных (карат, огранка, цвет, четкость, глубина, таблица, цена, x, y и z) и возвращает целевой класс в качестве выходных данных.

Предположим, что вы протестировали разные модели, выбрали лучшую модель и сохранили ее в переменной с именем model. Вы можете построить модель, используя код, описанный в этом Jupyter Notebook. Ваша цель – использовать модель в качестве внешнего веб-сервиса.

Сохранение модели

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

Выполните шаги, описанные ниже:

  1. Сериализуйте свою обученную модель с помощью Pickle или аналогичной библиотеки. Сохраните сериализованную модель в файл (например, model.pkl).
  2. Если вашей модели требуются кодеры, сохраните их в виде отдельных сериализованных файлов.

В 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 – это веб-приложение, которое показывает форму ввода для вставки входных объектов и возвращает новую страницу с предсказанным значением.

Как быстро запустить службу прогнозирования в 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

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

Заключение

Поздравляю! Вы успешно настроили и запустили службу прогнозирования в Flask. Сначала напишите свои HTML-файлы, затем создайте службу Flask, которая их загружает

Вы можете скачать полный код для этого примера из моего репозитория на GitHub.

Надеюсь, что данная статья окажется полезной для вас!

+1
0
+1
0
+1
0
+1
0
+1
0

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *