Введение
Это продолжение моего проекта по анализу данных о кредитах и развертыванию модели машинного обучения с использованием 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/ в любом браузере и альте!
Если вам интересно посмотреть код, посетите мой репозиторий здесь. Не стесняйтесь предлагать любые улучшения. Спасибо, что нашли время прочитать мой пост.