Привет ребята. Я только что получил степень магистра в области искусственного интеллекта и искал работу в области машинного обучения. Я знаю все алгоритмы ML и варианты их использования, но не смог объяснить сквозное развертывание модели машинного обучения. Это важный набор навыков, поскольку необходимо не только обучить модель машинного обучения, но также важно ее развернуть и запустить на веб-сервере. Инженер по машинному обучению также должен развернуть модель машинного обучения на размещенном сервере. Итак, в этом блоге я выйду за рамки обучения машинному обучению и покажу вам, как можно развернуть свои модели на серверах. Для этого урока я использовал следующие инструменты:

  1. Heroku — Heroku — это платформа как услуга (PaaS), которая предоставляет нам среду разработки и поддерживает несколько языков и Python. Студентам Heroku предлагает бесплатные кредиты, которые можно использовать для экспериментов и самообучения. Вы можете воспользоваться бесплатными кредитами, если вы студент, здесь: https://www.heroku.com/students.
  2. Github — хорошо известен благодаря контролю версий и управлению кодом. Он хранит код в репозиториях, которые можно напрямую передать в Heroku для развертывания приложения, что мы и сделаем позже в этом руководстве.
  3. Anaconda — я использовал conda для создания виртуальной среды. Conda — это инструмент для обработки данных, включающий большинство библиотек и инструментов. Наряду с этим он позволяет создавать виртуальные среды, в которых

Давайте начнем наш проект по развертыванию машинного обучения; мы разделим этот процесс на этапы и пройдем их индивидуально. Я не углубляюсь в обучение модели; если хотите, пройдитесь по моему блокноту, ссылку на который я дал ниже.

Прежде чем начать, нам нужно создать репозиторий на GitHub. Надеюсь, вы знакомы с GitHub и его командами. Хотя я собираюсь познакомить вас с командами, которые мы будем использовать.

Сначала зайдите на GitHub и создайте новый репозиторий. Скопируйте URL-адрес репозитория, который используется для клонирования репозитория на локальном компьютере. Откройте папку проекта, перейдите к папке в терминале и вставьте эту команду.

git clone repo_url

Итак, чтобы увидеть статус используемого нами репозитория,

git status

Чтобы добавить измененные файлы в промежуточный этап для фиксации, «.» представляет все измененные файлы, хотя вместо этого вы можете указать отдельные имена файлов.

git add .

Чтобы зафиксировать измененные файлы, подготовленные для фиксации,

git commit -m "Your message here"

Чтобы отправить изменения в GitHub с локального компьютера,

git push origin main

1. Обучение модели машинного обучения

Я использовал набор данных по обнаружению мошенничества с кредитными картами на Kaggle для обучения модели с использованием XGBoost. Давайте углубимся в набор данных.

Я использовал набор данных для обнаружения мошенничества с кредитными картами: https://www.kaggle.com/datasets/mlg-ulb/creditcardfraud.

В этом наборе данных есть транзакции, произошедшие за два дня, хотя в этом наборе данных есть только 492 мошенничества из 284 807 транзакций, что делает этот набор данных крайне несбалансированным. Этот набор данных имеет основные функции из V1…V28, а также «время» и «количество»; целевой столбец — «Класс».

Я начал создавать матрицу корреляции, чтобы помочь нам найти корреляцию функций с целевым столбцом.

# Correlation matrix
fig, ax = plt.subplots(figsize=(10, 10))

sns.heatmap(creditcard_df.corr(), cmap='summer_r')

Как видно из приведенных выше функций, V2, V4 и V11 больше связаны с классом, чем другие функции. Это дает нам существенное представление о данных.

И еще: мы будем визуализировать корреляцию времени с мошенничеством. Поэтому я создал новый столбец «Час» из столбца времени, содержащий только час времени.

creditcard_df["hour"] = creditcard_df["Time"].apply(lambda x: np.ceil(float(x)/3600)%24)
creditcard_df["hour"] = creditcard_df["hour"].astype("int")

Теперь мы визуализируем как мошеннические, так и немошеннические действия относительно времени, когда они произошли. Код ниже создаст новый фрейм данных Panda с двумя столбцами, содержащими общее количество транзакций, без мошенничества в течение часа, в то время как у другого есть недостатки.

 Visualizing time vs fraud

# transaction count with non frauds over hour
count_0 = creditcard_df[creditcard_df["Class"]==0].groupby("hour").count()["Class"]

count_1 = creditcard_df[creditcard_df["Class"]==1].groupby("hour").count()["Class"]

# Concatenate
hour_count = pd.concat([count_0, count_1], axis=1, keys=["Class0", "Class1"]).fillna(0)
count_hour = hour_count.reset_index()

sns.lineplot(x="hour", y="Class0", data=count_hour, color="b")

Теперь мы визуализируем количество мошеннических транзакций за час.

sns.lineplot(x="hour", y="Class1", data=count_hour, color="r")

Приведенная выше визуализация дает нам важную информацию из набора данных; теперь мы предварительно обработаем данные, которые будут переданы в модель.

## Data Preprocessing
from sklearn.model_selection import train_test_split

X = creditcard_df.drop(["Class"], axis=1).values
y = creditcard_df["Class"].values

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Standardize the data
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

Здесь следует отметить наиболее важный момент — StandardScaler, который подходит к данным обучения и преобразует данные обучения и данные тестирования. Это преобразование также необходимо выполнять с любыми новыми данными для прогнозирования. Просто всегда помните об этом.

Теперь давайте обучим нашу модель; Я использовал xgboost, который, как известно, имеет более высокую точность обнаружения мошенничества с кредитными картами, чем другой алгоритм классификации.

from xgboost import XGBClassifier

model = XGBClassifier()
model.fit(X_train, y_train)

Самое важное после обучения модели — это проверка точности модели или выбор лучших критериев для проверки модели. Потому что в некоторых случаях, например, при обнаружении мошенничества с кредитными картами, важнее обнаружить мошенническое заявление, чем мошенничество, не связанное с мошенничеством. У нас есть метрики путаницы, которые очень важны в большинстве случаев машинного обучения, поэтому вам следует о них прочитать.

Наша модель бинарной классификации будет использовать кривую AUC для измерения производительности. Значение кривой AUC позволит оценить, насколько хорошо модель может разделить два класса.

from sklearn.metrics import roc_auc_score, roc_curve, auc, precision_recall_curve

precision, recall, threshold = precision_recall_curve(y_test, y_pred)

auc_score = auc(recall, precision)
auc_score
0.8908823233293515

Теперь мы перейдем к части развертывания модели, но прежде чем перейти к развертыванию, мы сохраним нашу модель и стандартный масштабатор, чтобы прогнозировать новые значения и изменять новые значения в соответствии со значениями, с которыми обучается модель. Мы будем использовать библиотеку Pickle для сохранения моделей. Pickle сохраняет модель в формате Pickle, что позволяет нам сохранять ее в сериализованной форме, чтобы ее можно было снова загрузить и использовать для прогнозирования.

pickle.dump(model, open('model.pkl', "wb"))
pickle.dump(scaler, open('scaler.pkl', "wb"))

2. Виртуальная среда и требования к установке

Теперь мы создадим виртуальную среду для работы. Я использовал Anaconda для создания виртуальной среды. Мы можем создать виртуальную среду, используя следующую команду в командной строке. Убедитесь, что вы находитесь в своем рабочем каталоге и можете предоставить версию Python для работы при создании виртуальной среды.

conda create -n yourvenvname python-x.x 

Теперь вам следует активировать эту виртуальную среду, используя следующие команды.

conda activate yourvenvname

Теперь мы создадим файл требований «requirements.txt» в рабочем каталоге. В этом файле требований мы напишем все библиотеки, которые нам нужны в проекте. В этом примере мой файл требований выглядит следующим образом.

Flask
scikit-learn
pandas
numpy
matplotlib
gunicorn
xgboost

Теперь мы установим все эти библиотеки в нашу виртуальную среду с помощью pip, а команда для установки библиотек из файла требований:

pip install -r requirements.txt

3. Веб-приложение с использованием Flask, тестирование API с помощью Postman

Flask — это веб-фреймворк, модуль Python, который позволяет разработчикам Python быстро создавать веб-приложения. Это микрофреймворк с такими интересными функциями, как маршрутизация URL-адресов и механизм шаблонов. Код нашего приложения приведен ниже.

import pickle
from flask import Flask, request, app, jsonify, url_for, render_template
import numpy as np
import pandas as pd

app = Flask(__name__, template_folder="templates/")

model = pickle.load(open("model.pkl", "rb"))
scaler = pickle.load(open("scaler.pkl", "rb"))

@app.route("/")
def home():
    return render_template("home.html")

@app.route("/predict_api", methods=["POST"])
def predict_api():
    data = request.json["data"]
    print('data')
    data = np.array(list(data.values())).reshape(1, -1)
    scaled_data = scaler.transform(data)
    output = model.predict(scaled_data)
    print(output[0])
    return jsonify(int(output[0]))

@app.route("/predict", methods=["POST"])
def predict():
    data = [float(x) for x in request.form.values()]
    final_input = scaler.transform(np.array(data).reshape(1, -1))
    print(final_input)
    output = model.predict(final_input)[0]
    return render_template("home.html", prediction_text="Ouput of fraud detection is {}".format(int(output)))

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

Код инициализирует приложение Flask с именем «main» и указывает папку шаблона как «templates/». Эта папка будет содержать шаблоны HTML для рендеринга веб-страниц. Код файла home.html в папке шаблона показан ниже.

<html>
    <body>
        <div>
            <h1> Hello world</h1>
            <form action="{{ url_for('predict')}}"method="post">
                <input type="text" name="Time" placeholder="Time" required="required"/><br>
                <input type="text" name="V1" placeholder="V1" required="required"/><br>
                <input type="text" name="V2" placeholder="V2" required="required"/><br>
                <input type="text" name="V3" placeholder="V3" required="required"/><br>
                <input type="text" name="V4" placeholder="V4" required="required"/><br>
                <input type="text" name="V5" placeholder="V5" required="required"/><br>
                <input type="text" name="V6" placeholder="V6" required="required"/><br>
                <input type="text" name="V7" placeholder="V7" required="required"/><br>
                <input type="text" name="V8" placeholder="V8" required="required"/><br>
                <input type="text" name="V9" placeholder="V9" required="required"/><br>
                <input type="text" name="V10" placeholder="V10" required="required"/><br>
                <input type="text" name="V11" placeholder="V11" required="required"/><br>
                <input type="text" name="V12" placeholder="V12" required="required"/><br>
                <input type="text" name="V13" placeholder="V13" required="required"/><br>
                <input type="text" name="V14" placeholder="V14" required="required"/><br>
                <input type="text" name="V15" placeholder="V15" required="required"/><br>
                <input type="text" name="V16" placeholder="V16" required="required"/><br>
                <input type="text" name="V17" placeholder="V17" required="required"/><br>
                <input type="text" name="V18" placeholder="V18" required="required"/><br>
                <input type="text" name="V19" placeholder="V19" required="required"/><br>
                <input type="text" name="V20" placeholder="V20" required="required"/><br>
                <input type="text" name="V21" placeholder="V21" required="required"/><br>
                <input type="text" name="V22" placeholder="V22" required="required"/><br>
                <input type="text" name="V23" placeholder="V23" required="required"/><br>
                <input type="text" name="V24" placeholder="V24" required="required"/><br>
                <input type="text" name="V25" placeholder="V25" required="required"/><br>
                <input type="text" name="V26" placeholder="V26" required="required"/><br>
                <input type="text" name="V27" placeholder="V27" required="required"/><br>
                <input type="text" name="V28" placeholder="V28" required="required"/><br>
                <input type="text" name="Amount" placeholder="Amount" required="required"/><br>
                <input type="text" name="hour" placeholder="hour" required="required"/><br>
                
            
                <button type="submit" class="btn btn-primary btn-block btn-large">Predict</button>
            </form>
            <br>
            <br>
            </div>
            {{prediction_text}}

    </body>

</html>

Я использовал Pickle для загрузки предварительно обученной модели машинного обучения («model.pkl») и масштабатора данных («scaler.pkl») с помощью функции pickle.load().

Код определяет три маршрута для различных функций:

  • Маршрут «/», связанный с функцией home(), отображает шаблон «home.html», когда пользователи обращаются к корневому URL-адресу.
  • Маршрут «/predict_api», связанный с функцией predict_api(), обрабатывает прогнозы, когда данные отправляются через запрос POST в формате JSON. Он принимает входные данные, масштабирует их с помощью загруженного масштабатора и делает прогноз с использованием загруженной модели машинного обучения. Мы будем использовать это для тестирования нашего приложения с помощью Postman.
  • Маршрут «/predict», связанный с функцией predict(), используется для обработки прогнозов, когда данные отправляются через форму. Он принимает входные данные, масштабирует их и делает прогноз, а затем отображает результат в шаблоне «home.html». Эта функция будет вызываться с веб-страниц HTML.

Код проверяет, является ли скрипт основным модулем (т. е. не импортирован как библиотека), а затем запускает приложение Flask с включенной отладкой, если это так. Теперь давайте посмотрим вывод в терминале, когда мы запускаем app.py.

Если вы получаете результат выше, все работает отлично. Теперь вы увидите IP-адрес, на котором размещено наше приложение. Если вы нажмете на нее, откроется веб-страница и отобразится файл home.html, который находится в папке шаблона.

При нажатии веб-страница будет выглядеть так.

Теперь мы введем значения в поле и увидим результат внизу веб-страницы.

Мы протестируем приложение с помощью приложения Postman, когда запрос будет отправлен через запрос POST в формате JSON. В Postman мы выберем запрос «POST», а затем введем IP-адрес, а затем «/predict_api», который мы определили в коде. Выберите формат JSON и запишите данные в формате JSON. Ниже приведены данные, которые я отправил в формате JSON.

{
    "data": {
        "Time":1,
        "V1": 0.000612,
        "V2": 31.0,
        "V3": 2.31,
        "V4": 0.0,
        "V5": 0.018,
        "V6": 6.575,
        "V7": 65.2,
        "V8":0.0900,
        "V9": 1.0,
        "V10": 296,
        "V11": 15.3,
        "V12": 367.90,
        "V13": 0.98,
        "V14": 0.98,
        "V15": 0.98,
        "V16": 0.98,
        "V17": 0.98,
        "V18": 0.98,
        "V19": 0.98,
        "V20": 0.98,
        "V21": 0.98,
        "V22": 0.98,
        "V23": 0.98,
        "V24": 0.98,
        "V25": 0.98,
        "V26": 0.98,
        "V27": 0.98,
        "V28":0.23,
        "Amount":122,
        "hour":2
    }
}

Ниже приведен скриншот моего почтальона, и при нажатии кнопки «Отправить» я получил результат 0.

Прежде чем двигаться дальше, подготовьте все измененные и вновь созданные файлы и отправьте их на GitHub.

Теперь часть тестирования приложения завершена, осталось только развертывание.

4. Развертывание

Теперь мы развернем нашу модель в Heroku, и для этого нам нужно написать Procfile, который Heroku прочитает и поймет. Procfile включает команды, которые приложение будет выполнять при запуске. Procfile создается в корневом каталоге без расширения («Procfile»).

Ниже приводится содержимое файла Heroku:

web: gunicorn app:app

Gunicorn «Green Unicorn» — это HTTP-сервер интерфейса веб-сервера Python, который мы будем использовать для развертывания нашего приложения на Heroku. Первый app представляет имя файла Python, в котором выполняется наше приложение, или имя модуля, в котором оно находится. Второй app представляет имя приложения, указанное в нашем файле .py.

Теперь зафиксируйте все изменения и отправьте их в репозиторий GitHub. Откройте Heroku и получите бесплатный студенческий кредит (вы можете найти блоги о получении бесплатных кредитов). Перейдите в приложения, создайте новое приложение, назовите его и перейдите к следующему шагу. На этом этапе выберите «Метод развертывания» в качестве репозитория GitHub и выберите репозиторий GitHub, над которым мы только что закончили работу. Сразу после этого вы увидите, что Heroku запускает файл профиля и команды в нем.

Если возникнет какая-либо ошибка, не расстраивайтесь и попытайтесь ее решить, потому что это единственный способ научиться. Мои извинения, если я допустил какие-либо ошибки; Я тоже новичок в этом.

Это ссылка на мой репозиторий GitHub для справки: https://github.com/shivamsharma00/credit-card-fraud-detection.