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