Как энтузиаст науки о данных, я изучал, как развернуть модель, а затем создать пользовательский веб-интерфейс, в котором пользователь может вводить данные и просматривать прогноз. Я мог найти решения для развертывания и запуска приложения в локальной системе. Поскольку я использую виртуальную среду разработки — 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.