Привет ребята. Я только что получил степень магистра в области искусственного интеллекта и искал работу в области машинного обучения. Я знаю все алгоритмы ML и варианты их использования, но не смог объяснить сквозное развертывание модели машинного обучения. Это важный набор навыков, поскольку необходимо не только обучить модель машинного обучения, но также важно ее развернуть и запустить на веб-сервере. Инженер по машинному обучению также должен развернуть модель машинного обучения на размещенном сервере. Итак, в этом блоге я выйду за рамки обучения машинному обучению и покажу вам, как можно развернуть свои модели на серверах. Для этого урока я использовал следующие инструменты:
- Heroku — Heroku — это платформа как услуга (PaaS), которая предоставляет нам среду разработки и поддерживает несколько языков и Python. Студентам Heroku предлагает бесплатные кредиты, которые можно использовать для экспериментов и самообучения. Вы можете воспользоваться бесплатными кредитами, если вы студент, здесь: https://www.heroku.com/students.
- Github — хорошо известен благодаря контролю версий и управлению кодом. Он хранит код в репозиториях, которые можно напрямую передать в Heroku для развертывания приложения, что мы и сделаем позже в этом руководстве.
- 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.