Рубрики
Без рубрики

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

Этот пост поможет вам понять, как развернуть модель обучения машины в сети, используя колбу. Я … Теги с Python, MachineLearning, DevOps, WebDev.

Этот пост поможет вам понять, как развернуть модель обучения машины в сети, используя колбу. Я использовал Heroku Развернуть модель ML.

Что такое Heroku?

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

Следуйте указанным ниже шагам:

  • Поезд ML модели
  • Создайте веб-приложение, используя колбу
  • Совершить код до Github
  • Подключите Github к Heroku
  • Разверните модель

Тренировать модель обучения машины

Я использую логистическую регрессию как алгоритм классификации. Я использовал FRAMINGHAM Сердце исследования набора данных предсказать риск развития сердечных заболеваний. Целью исследования Framingham является изучение заболеваемости и распространенности сердечно-сосудистых заболеваний (CVD) и его факторов риска.

import pandas as pd
import numpy as np
import pickle
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

# Reading dataframe and dropping rows with na values
data = pd.read_csv("framingham.csv")
data.dropna(inplace=True)  # Consists 3658 records

# Computing Correlation
corr_matrix = data.corr().abs()
high_corr_var = np.where(corr_matrix > 0.35)
high_corr_var = [(corr_matrix.index[x], corr_matrix.columns[y]) for x, y in zip(*high_corr_var) if x != y and x < y]

"""
Variables to consider
age: Age of a person (Input a number)
smoker: Yes or No
Cigs per day: (Input a number)
diabaties: Yes or No
bmi: weight(Kg) and height(meters) calculate
BP: input a number
"""


def bmi(weight, height):
    return round(float(weight) / (float(height) * float(height)), 2)


X_cols = ['male', 'age', 'currentSmoker', 'cigsPerDay', 'diabetes',
          'sysBP', 'BMI']
Y_col = ['TenYearCHD']

X_vars = data[X_cols]
Y_var = data[Y_col]

# Renaming Columns
X_vars.columns = ['Gender', 'Age', 'Smoker', 'Cigarettes_Per_Day',
                  'Diabetic', 'BP', 'BMI']
Y_var.columns = ['Chances_of_hear_disease']

# Splitting data
X_train, X_test, y_train, y_test = train_test_split(X_vars, Y_var, test_size=0.25, random_state=0)

# Initiate the Model
logreg = LogisticRegression()

# fit the model with data
logreg.fit(X_train, y_train)

pickle.dump(logreg, open('model.pkl', 'wb'))

Я использовал Парил Библиотека, которая в основном поможет вам бросить свою модель в потоке символов формы. Идея состоит в том, что этот поток символов содержит всю информацию, необходимую для восстановления объекта в другом сценарии Python. Это создаст файл model.pkl в режиме записи байта, который позже будет использоваться для развертывания модели.

Создайте веб-приложение, используя колбу

Ниже я определил приложенные маршруты и завершив файл App.py. Я создал Index.html который будет служить домашней страницей, где мы будем иметь все поле, необходимое для запуска модели. Первый шаг – настроить секретный ключ, который необходим для обеспечения безопасности сеансов на стороне клиента. При работе со сессиями в колбе вам необходимо создать SENTE_KEY, состоящий из случайных байтов, представленных в шестнадцатеричном порядке.

# Set the secret key to some random bytes. 
# Keep this really secret!
app.secret_key = b'_5#y2L"F4Q8z\n\xec]/'

Класс DataForm определяет структуру страницы, содержащую радиопередачу, флажки и этикетки. Это поможет нам запечатлеть данные надлежащим образом. Последний шаг – сделать шаблон index.html и принимать входы от пользователя. Когда пользователь подает входы, будет запущена функция индекса, и приложение начнет вычисление окончательного вывода.

import os
import pickle
from flask_wtf import FlaskForm
from flask import Flask, render_template
from wtforms.validators import DataRequired
from wtforms import IntegerField, BooleanField, FloatField, SubmitField, RadioField


class Config(object):
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'you-will-never-guess'
    APP_PATH = os.path.dirname(__file__)


app = Flask(__name__)
app.config.from_object(Config)


class DataForm(FlaskForm):
    gender = RadioField('Gender', validators=[DataRequired()], choices=['Male', 'Female'])
    age = IntegerField('Age', validators=[DataRequired()])
    diabetic = BooleanField('Are you Diabetic?')
    smoker = BooleanField('Do you smoke? ')
    cig_count = FloatField('How many cigarettes do you smoke per day ?', default=0)
    weight = FloatField('Weight (Kg)', validators=[DataRequired()])
    height = FloatField('Height (cm)', validators=[DataRequired()])
    bp = IntegerField('Blood Pressure (mmHg)  Normal range : (90-120)/(60-80)', validators=[DataRequired()])
    submit = SubmitField('Submit')


@app.route('/')
@app.route('/index', methods=['GET', 'POST'])
def index():
    form = DataForm()
    if form.validate_on_submit():
        li = ['age', 'gender', 'cig_count', 'diabetic', 'height', 'weight', 'smoker', 'bp']
        data = {}
        for ele in li:
            data[ele] = eval('form.' + ele + '.data')

        gender = 1 if data['gender'] == 'Male' else 0
        smoker = 1 if data['smoker'] else 0
        diabetic = 1 if data['diabetic'] else 0
        filename = os.path.join(app.config['APP_PATH'], 'model.pkl')
        with open(filename, 'rb') as f:
            model = pickle.load(f)
            value = model.predict([[gender, data['age'], smoker, data['cig_count'],
                                    diabetic, data['bp'], bmi(data['weight'], data['height'])]])
            data = ['done', value[0]]
        return render_template('index.html', value=data, form=form, data=data)
    return render_template('/index.html', form=form)


def bmi(weight, height):
    return round(float(weight) / (float(height / 100) * float(height / 100)), 2)


if __name__ == '__main__':
    app.run(debug=True)

Самое главное состоит в том, чтобы создать Proffile и требование. Atxt, который обрабатывает часть конфигурации, чтобы развернуть модель в сервере Heroku. Веб: божьян Это фиксированная команда, после этого первый параметр App.py файл I.e файл, который будет выполнен в первую очередь. Укажите первый параметр без расширения файла. Второй параметр – это имя приложения для колба. Требования состоит из всех библиотек, которые должны быть установлены в окружающей среде Heroku.

web: gunicorn app:app
click==7.1.2
Flask==1.1.2
Flask-WTF==0.14.3
gunicorn==20.0.4
itsdangerous==1.1.0
Jinja2==2.11.2
joblib==0.16.0
MarkupSafe==1.1.1
numpy==1.19.1
pandas==1.1.0
python-dateutil==2.8.1
python-dotenv==0.14.0
pytz==2020.1
scikit-learn==0.23.2
scipy==1.5.2
six==1.15.0
sklearn==0.0
threadpoolctl==2.1.0
Werkzeug==1.0.1
WTForms==2.3.3

Примите свой код Github и подключите Heroku к Github

Создайте имя приложения в Heroku и подключите репозиторий GitHUB, как показано ниже.

После подключения, есть 2 способа развертывания вашего приложения. Вы можете выбрать автоматическое развертывание или ручное развертывание. Автоматическое развертывание состоится всякий раз, когда вы совершаете что-нибудь в ваш репозиторий GitHUB. Автоматически начнется сборка. Я развернул его, используя ручное развертывание. Просто, выбирая ветку и нажав на развертывание, начнется сборка. После успешного развертывания вкладка развертывания должна выглядеть как показано ниже:

Окончательное приложение

После успешного развертывания приложение будет создано. Нажмите на Вид И ваше приложение должно открыть. Новый URL будет создан.

Оформить заказ моего приложения: https://heart-disease-predictor-api.herokuapp.com/

Я надеюсь, что вы нашли этот пост полезным. Это поможет конечным пользователям взаимодействовать с нашими моделями ML без какой-либо внешней зависимости.

Выполнено!

Octocat сопроводит вас в моем хранилище GitHub …

Оригинал: “https://dev.to/siddheshshankar/deploy-machine-learning-models-using-flask-into-heroku-4b54”