Като ентусиаст в областта на науката за данни проучвах как да разположа модела и след това да създам уеб потребителски интерфейс, където потребителят може да въведе информация и да види прогнозата. Мога да намеря решения за внедряване и стартиране на приложение в локална система. Тъй като използвам виртуална среда за разработка — 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, за да изложим приложението в интернет

В кода

Следвайте инструкциите стъпка по стъпка и до края на статията ще можете да внедрите ML модел и да стартирате приложение с помощта на ngrok и Flask.

Инсталирайте пакети в бележника на Colab

Обикновено flask приложението се изпълнява от локална машина и трябва да използваме localhost за достъп до приложението през браузъра. Тъй като използвам google colab, която е виртуална среда, локалният хост не може да бъде достъпен. Следователно ngrok се използва за излагане на приложението в интернет с публичен url.

!pip install flask-ngrok

Монтирайте Google Drive

За да имате достъп до файловете от google drive, той трябва да бъде монтиран в 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 и влезте в акаунта.

Копирайте authtoken от 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 модел. Модулът pickle на Python се използва за сериализиране и де-сериализиране на обект на Python. Тук ML моделът е сериализиран и записан в 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