Как энтузиаст науки о данных, я изучал, как развернуть модель, а затем создать пользовательский веб-интерфейс, в котором пользователь может вводить данные и просматривать прогноз. Я мог найти решения для развертывания и запуска приложения в локальной системе. Поскольку я использую виртуальную среду разработки — google colab, такое решение не сработает. В этой статье я продемонстрировал изменения, необходимые при работе в google colab для развертывания модели и запуска веб-приложения для прогнозирования.

В технологии

1. Google Colab – это продукт Google Research, который позволяет любому писать и выполнять произвольный код Python через браузер и хорошо подходит для машинного обучения, анализа данных и обучения. Это специализированная версия Jupyter Notebook, которая работает в облаке и предлагает бесплатные вычислительные ресурсы. Если вы знакомы с Jupyter, то colab ничем не отличается.

2. Модуль Pickle используется для сериализации и десериализации структуры объекта Python. Используя это, модели машинного обучения можно сериализовать в объект Python, который впоследствии можно использовать для прогнозирования.

3. Flask используется для разработки веб-приложений с использованием Python. Он классифицируется как микрофреймворк, что означает, что он практически не зависит от внешних библиотек.

4. Ngrok — это кроссплатформенное приложение, открывающее порты локального сервера для доступа в Интернет. Это позволяет вам открыть веб-сервер, работающий в системе, в Интернете. Поскольку мы используем Google Colab, мы используем ngrok для доступа к приложению в Интернете.

В код

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

Установить пакеты в блокнот Colab

Обычно приложение фляги запускается с локального компьютера, и нам нужно использовать локальный хост для доступа к приложению через браузер. Поскольку я использую Google Colab, который представляет собой виртуальную среду, доступ к локальному хосту недоступен. Следовательно, ngrok используется для представления приложения в Интернете с общедоступным URL-адресом.

!pip install flask-ngrok

Смонтировать Google Диск

Чтобы получить доступ к файлам с гугл диска, его нужно смонтировать в colab. Этот шаг не требуется при работе с локальной установкой, такой как Jupyter Notebook.

from google.colab import drive
drive.mount('/content/drive')

Приведенная ниже команда выведет список всех файлов, доступных на диске, и подтвердит, что монтирование прошло успешно.

!ls "/content/drive/MyDrive"

Установите рабочий каталог как «Flask-Deploy-Model», используя приведенную ниже команду.

cd '/content/drive/MyDrive/Colab Notebooks/Data/Flask-deploy-model'
--------------------------------------------------------------------
Output:
/content/drive/MyDrive/Colab Notebooks/Data/Flask-deploy-model

Настройка учетной записи Ngrok

Создайте учетную запись в https://ngrok.com и войдите в учетную запись.

Скопируйте авторизационный токен из ngrok и выполните приведенную ниже команду в colab. Это проведет аутентификацию и позволит приложению быть доступным из Интернета. Authtoken сохраняется в файл конфигурации ngrok.yml

!ngrok authtoken '<<your authtoken>>'
--------------------------------------------------------------------
Output:
Authtoken saved to configuration file: /root/.ngrok2/ngrok.yml

Структура папки фляги

Flask содержит две папки с именами static и templates. Статическая папка содержит ресурсы, используемые шаблонами, такие как файлы css, файлы javascript и изображения. Папка шаблонов содержит html-файлы. Здесь папка, созданная для flask, называется «Flask-deploy-Model».

MyDrive
└──Colab Notebooks
   └──Data
   │  └──Flask-deploy-Model
   │     ├── static/
   │     │   └── css/
   │     │       └── style.css
   │     ├── templates/
   │     │   └── index.html     
   │     ├── insurance.csv
   │     └── expense_model.pkl
   └──DeployModelUsingPickleAndFlask.ipynb

Создание веб-приложения с помощью Flask

Создайте html-файл с необходимыми полями для пользовательского ввода и поместите html в папку шаблонов, как того требует Flask.

<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Health Expense</title>
  <link href='https://fonts.googleapis.com/css?family=Open+Sans+Condensed:300' rel='stylesheet' type='text/css'>
  <link href="{{ url_for('static', filename='style.css') }}" rel="stylesheet">
</head>
<body style="background: rgb(252, 250, 250);">
  <div class="login">
   <h1 style="text-align:center">Healthcare Expense Predictor</h1>
    <form action="{{ url_for('predict')}}" method="post">
      <label for="age" colo>Age:  </label>
      <input type="text" name="age" placeholder="age" required="required">
      <br>
      <br>
      <label for="bmi">BMI:  </label>
      <input type="text" name="bmi" placeholder="bmi" required="required">
      <br>
      <br>
      <label for="children">Children:  </label>
      <select id="children" name="children", placeholder="children", required="required">
        <option value="0">Not Applicable</option>
        <option value="1">1</option>
        <option value="2">2</option>
        <option value="3">3</option>
        <option value="4">4</option>
        <option value="5">5 & above</option>
      </select>
      <br>
      <br>
      <label for="Sex">Sex:  </label>
      <select id="Sex" name="Sex" placeholder="Sex", required="required">
        <option value="0">Male</option>
        <option value="1">Female</option>
      </select>
      <br>
      <br>
      <label for="Smoker">Smoker:  </label>
      <select id="Smoker" name="Smoker", placeholder="Smoker", required="required">
        <option value="0">No</option>
        <option value="1">Yes</option>
      </select>
      <br>
      <br>
      <label for="Region">Region:  </label>
      <select id="Region" name="Region", placeholder="Region", required="required">
        <option value="0">Northeast</option>
        <option value="1">Northwest</option>
        <option value="2">Southeast</option>
        <option value="3">Southwest</option>
      </select>
      <br>
      <br>
      <button type="submit" class="btn btn-primary btn-block btn-large">Predict Medical Charges</button>
    </form>
    <br>
    <br>
    <h2>
    {{ prediction_text }}
    </h2>
  </div>
</body>
</html>

Построить модель ML с помощью Pickle

Примените линейную регрессию и постройте модель ML. Модуль рассола Python используется для сериализации и десериализации объекта Python. Здесь модель машинного обучения сериализована и сохранена на диске Google как «expense_model.pkl».

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.linear_model import LinearRegression
data = pd.read_csv("/content/drive/MyDrive/Colab Notebooks/Data/Flask-deploy-model/insurance.csv")
le = LabelEncoder()
le.fit(data['sex'])
data['Sex'] = le.transform(data['sex'])
le.fit(data['smoker'])
data['Smoker'] = le.transform(data['smoker'])
le.fit(data['region'])
data['Region'] = le.transform(data['region'])
#independent and dependent columns
x = data[["age", "bmi", "children", "Sex", "Smoker", "Region"]]
y = data['expenses']
#split in train and test
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=0)
#model training
linreg = LinearRegression()
linreg.fit(x_train, y_train)
#model testing
predictions = linreg.predict(x_test)
linreg.score(x_test,y_test)
#save model
import pickle
file = open("/content/drive/MyDrive/Colab Notebooks/Data/Flask-deploy-model/expense_model.pkl", 'wb')
pickle.dump(linreg, file)

Запустить приложение

Здесь Flask используется в Colab, поэтому при инициализации приложения для папки template_folder устанавливается путь к диску Google. Теперь приложение доступно по URL-адресу, оканчивающемуся на .ngrok.io.

from flask import Flask, request, render_template
import pickle
import numpy as np
from flask_ngrok import run_with_ngrok
app = Flask(__name__ , template_folder='/content/drive/MyDrive/Colab Notebooks/Data/Flask-deploy-model/templates')
run_with_ngrok(app)  # Start ngrok when app is run
@app.route("/")
def hello():
return render_template("index.html")
@app.route("/predict", methods=['GET','POST'])
def predict():
if request.method == 'POST':
#access the data from form
age = int(request.form["age"])
bmi = int(request.form["bmi"])
children = int(request.form["children"])
Sex = int(request.form["Sex"])
Smoker = int(request.form["Smoker"])
Region = int(request.form["Region"])
#get prediction
input_cols = [[age, bmi, children, Sex, Smoker, Region]]
prediction = model.predict(input_cols)
output = round(prediction[0], 2)
return render_template("index.html", prediction_text='Your predicted annual Healthcare Expense is $ {}'.format(output))
if __name__ == '__main__':
app.run()
--------------------------------------------------------------------
Output
* Serving Flask app "__main__" (lazy loading)
* Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Running on http://xxxx-xx-xxx-xx-xx.ngrok.io
* Traffic stats available on http://127.0.0.1:4040

Файл набора данных insurance.csv и код доступны в gihub https://github.com/rkymnj/DeployModelUsingPickleAndFlask.git.