Введение

Это продолжение моего проекта по анализу данных о кредитах и ​​развертыванию модели машинного обучения с использованием Flask. Если вас интересует часть анализа и построения модели, прочтите, пожалуйста, это. Flask предоставляет легкую платформу для разработки и развертывания веб-приложений. Доступно множество расширений для удовлетворения ваших конкретных потребностей. Я выбрал Flask, потому что мне было легче учиться и демонстрировать свою модель машинного обучения в действии. В этом посте я расскажу, как построить и развернуть мою модель машинного обучения с помощью Flask.

Установка:

Вы хотите установить Flask в своей виртуальной среде. Я использовал Pycharm и pipenv для управления своим проектом.

pipenv install flask

Структура проекта:

Вот структура каталогов для моего проекта:

.
├── app
│ ├── run.py
│ └── templates
│ ├── index.html
│ └── template.html
├── data
│ └── loan_data.csv
├── model
│ ├── classifier.py
│ └── loan_data.pkl
├── notebook
│ └── loan_data.ipynb
├── Pipfile
├── Pipfile.lock
├── README.md
├── static
│ ├── box_plot.png
│ ├── correlation.png
│ ├── credit_policy.png
│ ├── histogram.png
│ ├── installment.png
│ ├── int_rate.png
│ ├── purpose_paid_not_paid.png
│ ├── purpose.png
│ └── results.png
└── util
 └── custom_transformer.py

Папка приложения специфична для flask. Давайте пройдемся по каждому из файлов и увидим их содержание и цель, которой они служат.

run.py

import sys
import os
from pathlib import Path

from flask import Flask, request, render_template
from joblib import load
import pandas as pd

# Add util directory to path
curr_dir = sys.path[0]
parent_dir = Path(curr_dir).parents[0]
dir = os.path.join(parent_dir, 'util')
sys.path.append(dir)

from custom_transformer import NumericalFeatures, CategoricalFeatures

app = Flask(__name__)

model = load('../model/loan_data.pkl')


@app.route('/')
@app.route('/index.html')
def display():
    return render_template("index.html")


@app.route('/predict', methods=['GET', 'POST'])
def predict():
    test_data = list(request.form.values())
    test_data = [[convert_to_float(s) for s in test_data]]
    test_data = pd.DataFrame(test_data)
    result = model.predict(pd.DataFrame(test_data))
    if result == 1:
        string = "Loan is not expected to be paid in full"
    else:
        string = "Loan is expected to be paid off"

    # return render_template("index.html", tables=[test_data.to_html(classes='data')], titles=test_data.columns.values)
    return render_template("index.html", result= "Prediction: " + string)


def convert_to_float(s):
    try:
        return float(s)
    except ValueError:
        return s


def main():
    app.run(port=3201, debug=True)


if __name__ == '__main__':
    main()

run.py - это основная программа, которую вы выполняете для запуска приложения.

  • Объект Flask создает интерфейс между веб-сервером и приложением Python
  • Заквашенный файл для модели загружается в память при запуске сервера
  • Запрос позволяет нам читать параметры, переданные с запросами GET / POST
  • render_template - это то, как мы отображаем HTML в веб-браузере с помощью шаблонов.
  • декоратор app.route используется для сопоставления определенного URL-адреса с соответствующими функциями. В моем коде выше функция display () вызывается, когда есть запрос index.html или если не запрашивается конкретная страница. Точно так же функция прогнозировать () вызывается, когда на сервере запрашивается / прогнозировать.

template.html

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="Mark Otto, Jacob Thornton, and Bootstrap contributors">
    <meta name="generator" content="Hugo 0.84.0">
    <title> {{ title }} </title>

    <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
    <link rel="canonical" href="https://getbootstrap.com/docs/5.0/examples/navbars/">

  </head>
  <body>
  <nav class="navbar navbar-expand-lg navbar-dark bg-dark" aria-label="Tenth navbar example">
    <div class="container-fluid">
      <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarsExample08" aria-controls="navbarsExample08" aria-expanded="false" aria-label="Toggle navigation">
        <span class="navbar-toggler-icon"></span>
      </button>

      <div class="collapse navbar-collapse justify-content-md-center" id="navbarsExample08">
        <ul class="navbar-nav">
          <li class="nav-item">
            <a class="nav-link active" aria-current="page" href="/">Loan Payoff Predictor</a>
          </li>
          <li class="nav-item">
            <a class="nav-link" aria-current="page" target="_blank" href="https://github.com/sumitkumar-00/disaster-response/blob/master/notebook/process_data.ipynb">Exploratory Data Analysis</a>
          </li>
          <li class="nav-item">
            <a class="nav-link" target="_blank" href="https://github.com/sumitkumar-00">GitHub Portfolio</a>
          </li>
          <!--
          <li class="nav-item">
            <a class="nav-link disabled" href="#" tabindex="-1" aria-disabled="true">Disabled</a>
          </li>
          <li class="nav-item dropdown">
            <a class="nav-link dropdown-toggle" href="#" id="dropdown08" data-bs-toggle="dropdown" aria-expanded="false">Dropdown</a>
            <ul class="dropdown-menu" aria-labelledby="dropdown08">
              <li><a class="dropdown-item" href="#">Action</a></li>
              <li><a class="dropdown-item" href="#">Another action</a></li>
              <li><a class="dropdown-item" href="#">Something else here</a></li>
            </ul>
          </li>
          -->
        </ul>
      </div>
    </div>
  </nav>
</div>

  {% block index %}
  {% endblock %}

 </body>
</html>

Вы используете шаблоны для визуализации части веб-страницы, которая одинакова на нескольких страницах с заполнителем для динамического содержимого. Используя template.html, я создаю заголовок (навигация, меню и т. Д.) И имею заполнитель для динамического содержимого, выделенного жирным шрифтом. Я расширил этот шаблон в index.html и добавил форму с кнопкой отправки и заполнителем для результата. Когда форма отправляется, запрос направляется на функцию прогнозирования, которая считывает входные параметры, а затем прогнозирует с использованием модели. Результат отображается с использованием того же шаблона index.html.

Вам просто нужно выполнить одну строку кода из папки приложения, чтобы запустить веб-приложение.

pipenv run python run.py
* Serving Flask app 'run' (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: on
* Running on http://127.0.0.1:3201/ (Press CTRL+C to quit)* Restarting with stat
* Debugger is active!
* Debugger PIN: 117-271-466
127.0.0.1 - - [13/Sep/2021 21:18:02] "GET / HTTP/1.1" 200 -

Зайдите на http://127.0.0.1:3201/ в любом браузере и альте!

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