Конвейер машинного обучения (ML) можно определить как разделение рабочего процесса машинного обучения на повторно используемые части, которые создают сквозной дизайн. Хотя количество шагов может варьироваться, конвейер машинного обучения обычно состоит из шести шагов, которые требуют постоянного мониторинга.

Как видно из рисунка выше, последний шаг после построения модели машинного обучения - сделать модель доступной в производственной среде; другими словами, развертывание модели. Развертывание модели означает предоставление вашей обученной модели машинного обучения доступной конечным пользователям или другим системам.

Существуют разные методы развертывания модели, однако эта история из двух частей будет охватывать только развертывание модели с использованием Flask API на Heroku. В Части 1 мы подготовим файлы, необходимые для развертывания. Затем, во второй части, мы загрузим эти файлы на GitHub и сделаем наше приложение доступным на Heroku.

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

Необходимые файлы для развертывания

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

1. model.py: этот файл содержит все необходимые коды для построения модели машинного обучения для прогнозирования.

2. model.pkl: этот файл представляет собой преобразованную версию model.py в поток символов с помощью модуля pickle. Консервированная версия model.py содержит всю необходимую информацию для реконструкции модели в другом скрипте Python.

3. app.py: это основной файл для получения необходимой информации для прогнозирования с помощью вызовов графического интерфейса или API, вычисления прогнозируемого значения и его возврата.

4. request.py: Основная функция этого файла - вызывать API, определенные в app.py, с помощью модуля запросов и отображать возвращаемое значение.

5. Папка шаблонов: Эта папка содержит шаблон HTML для пользовательского ввода, на основе которого наша модель будет делать прогнозы. Если вы хотите добавить немного стиля, вы также можете поместить сюда файл CSS.

6. Requirements.txt: Этот файл сообщает Heroku, какие пакеты следует установить для запуска вашего веб-приложения.

7. Procfile: Procfile - это простой текстовый файл, который сообщает Heroku, какое приложение вы используете и как его обслуживать пользователей.

Пришло время создать эти файлы в соответствии с нашим набором данных.

Во-первых, нам нужно обучить модель и, наконец, получить файл model.py. model.py - файл Python, который создается при обучении модели. Он состоит из всех кодов, необходимых нашей обученной модели для прогнозирования. В нашем случае я использовал RandomForestClassifier, чтобы обучить мою модель предсказанию типа дерева (помеченного как Cover_Type в наборе данных) на основе 5 функций, а именно: Elevation, «Vertical_Distance_To_Hydrology, Horizontal_Distance_To_Roadways, Hillshade_Noon и Horizontal_Distance_Toints_To_To_. Поскольку наши целевые метки (Cover_Type) находятся в диапазоне от 1 до 7, это проблема мультиклассовой классификации.

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import pickle dataset = pd.read_csv('final.csv') 
X=dataset.drop("Cover_Type", inplace=True)
y=dataset.Cover_Type  
from sklearn.ensemble import RandomForestClassifier
classifier= RandomForestClassifier()
classifier.fit(X, y) 

После обучения и настройки модели я преобразовал ее в поток символов с помощью модуля pickle. Травление - один из наиболее часто используемых способов сохранения модели. Модуль pickle предоставляет методы dump (), dumps (), load () и load () для сохранения и чтения модели.

Сохранение модели с помощью модуля pickle также называется сериализацией. Когда модель сериализуется, ее можно повторно использовать для прогнозирования. А десериализация означает загрузку или чтение модели для ее повторного использования.

pickle.dump(classifier, open('model.pkl','wb')) model=pickle.load(open("model.pkl", "rb"))
print(model.predict([[2788, 2, 3555,221, 2984]]))

Третий шаг - создать файл app.py. На этом этапе model.pkl десериализуется с помощью model = pickle.load (open ('model.pkl', 'rb')), а главная страница определяется как return render_template ('index.html'), который представляет собой HTML-файл, который мы создадим для получения пользовательского ввода. Используя функциональные возможности flask.request.form, Flask извлекает данные, которые вводятся в элемент HTML-формы. Подводя итог, этот app.py получает входные данные JSON, значения 5 функций в нашем случае, использует эти входные данные для создания прогноза и, наконец, возвращает прогноз в формате JSON.

import numpy as np
from flask import Flask, request, jsonify, render_template
import pickle
 
app = Flask(__name__)
model = pickle.load(open('model.pkl', 'rb'))
 
@app.route('/')
def home():
    return render_template('index.html')
 
@app.route('/predict',methods=['POST'])
def predict():
 
    int_features = [int(x) for x in request.form.values()]
    final_features = [np.array(int_features)]
    prediction = model.predict(final_features)
 
    output = prediction[0]
 
    return render_template('index.html', prediction_text='Tree type is {}'.format(output))
 
@app.route('/results',methods=['POST'])
def results():
 
    data = request.get_json(force=True)
    prediction = model.predict([np.array(list(data.values()))])
 
    output = prediction[0]
    return jsonify(output)
 
if __name__ == "__main__":
    app.run(debug=True)

Следующим шагом будет создание файла запроса . request.py - это простой файл Python, который использует модуль запроса для вызова API-интерфейсов, определенных в app.py, и отображает прогнозируемое значение.

import requests 
url = 'http://localhost:5000/results'
r = requests.post(url,json={"Elevation":2434, "Vertical_Distance_To_Hydrology":80, "Horizontal_Distance_To_Roadways":234, "Hillshade_Noon":221, "Horizontal_Distance_To_Fire_Points":469})  
print(r.json())

Здесь мы подошли к этапу создания HTML-файла, который будет отображать желаемый результат для пользователей. HTML-файл обеспечивает связь между конечным пользователем и моделью. Пользователи могут вводить свои данные через элемент HTML-формы, откуда Flask извлекает их для составления прогнозов. В нашей модели, поскольку все функции являются числовыми, «input_type» = numeric используется с функциями min и max. Наконец, создается кнопка типа отправки для отображения результата.

<!DOCTYPE html>
<html >
<head>  
<meta charset="UTF-8">  
<title>Tree Type Prediction</title>  
<link href='https://fonts.googleapis.com/css?family=Pacifico' rel='stylesheet' type='text/css'><link href='https://fonts.googleapis.com/css?family=Arimo' rel='stylesheet' type='text/css'><link href='https://fonts.googleapis.com/css?family=Hind:300' rel='stylesheet' type='text/css'><link href='https://fonts.googleapis.com/css?family=Open+Sans+Condensed:300' rel='stylesheet' type='text/css'><link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">  </head>  
<body background="https://lh5.googleusercontent.com/proxy/4vbIAzfLtz2eDbQMOoU-AIu5sDST-dHmm9vaxN3VQyBjjH11o4VUWF4QEQfIO8oZ4a5Zy1lXDGSKWlIrDnokEATdPiNz4ho4beHMDhCPltozmdnc5Cac69cVH3WvIUJEF7M=s0-d">
<div class="login"> 
    <h1 style="text-align:center">Tree Type Prediction</h1> 
   
    <form action="{{ url_for('predict')}}"method="post"> 
    <h3 style="text-align:center;">Elevation</h3> 
    <p style="text-align:center;"><input type="number" name="Elevation" min="1859" max= "3858" required="required" /></p>  
    <h3 style="text-align:center;">Vertical Distance to Hydrology</h3>        
    <p style="text-align:center;"><input type="number" name="Vertical_Distance_To_Hydrology" min="-173" max= "254"  required="required" /></p>  
   <h3 style="text-align:center;">Horizontal Distance to Roadways</h3> 
   <p style="text-align:center;"><input type="number" name="Horizontal_Distance_To_Roadways" min="0" max= "7117"  required="required" /></p>  
   <h3 style="text-align:center;">Hillshade Noon</h3> 
   <p style="text-align:center;"><input type="number" name="Hillshade_Noon" min="0" max= "254" required="required" /></p>
  
   <h3 style="text-align:center;">Horizontal Distance to Fire Points</h3> 
 <p style="text-align:center;"><input type="number" name="Horizontal_Distance_To_Fire_Points" min="0" max="7126" required="required" /></p>  
   <h2 style="text-align:center;"></h2>         
   <p style="text-align:center;"><button type="submit" class="btn btn-primary btn-block btn-large">Predict Tree Type</button></p>  
  </form>   <h2 style="text-align:center;">{{ prediction_text }}</h2>  
</div>
</body>
</html>

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

Давайте продолжим с requirements.txt. Файл requirements.txt очень важен для правильной работы вашего приложения. Он сообщает Heroku, какие пакеты необходимо установить при запуске приложения. Вы можете вручную указать пакеты для установки, записав их в require.txt, или пакет pipregs сделает это за вас. Если он установлен, пакет pipreqs создает файл require.txt, который включает все необходимые пакеты для вашего приложения.

Flask==1.1.1 
numpy>=1.9.2 
scipy>=0.15.1 
scikit-learn>=0.18
matplotlib>=1.4.3 
pandas>=0.19

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

web: gunicorn app:app

Показанный выше код должен быть написан в Procfile. Первое приложение представляет файл python, который запускает ваше приложение, или имя модуля, в котором оно находится. А второе приложение - это имя файла python, который мы создали во флаконе. (приложение = Flask__name__)

На этом мы завершили создание необходимых файлов для развертывания модели. Загрузка этих файлов на GitHub и создание из них приложения будут рассмотрены в Части 2.

Резюмируем:

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