Внедрение обнаружения мошеннических транзакций с использованием MLOPs
Эффективное выявление мошеннических транзакций с помощью MLOps
Введение
В сегодняшнем цифровом мире люди все больше переходят к онлайн-транзакциям и цифровым платежам из-за удобства, а не наличных денег. Вместе с увеличением перехода также увеличивается количество мошенничества. Мошенническая транзакция может быть любого типа, поскольку она включает в себя запрос денег с использованием ложной личности или ложной информации. Это представляет значительную проблему для отдельных лиц и финансовых учреждений. В этом проекте мы будем использовать набор данных по кредитным картам для разработки модели MLOPs с использованием инструмента Airflow для мониторинга живых транзакций и прогнозирования их подлинности или мошеннического характера.
Цели обучения
- Важность обнаружения мошеннических транзакций.
- Очистка данных, преобразование наборов данных и предварительная обработка наборов данных.
- Визуальный анализ набора данных для получения исходной информации.
- Применение модели обнаружения мошеннических транзакций в реальном мире с использованием науки о данных.
- Анализ данных о мошеннических транзакциях с использованием языка программирования Python
- Построение полноценной системы обнаружения мошенничества с использованием MS Azure и Airflow
Эта статья была опубликована в рамках Data Science Blogathon.
Что такое модель оценки мошеннических транзакций?
Набор данных о мошеннических транзакциях содержит данные из разных источников, включающие столбцы, такие как время транзакции, имя, сумма, пол, категория и другие. Модель оценки мошеннических транзакций – это модель машинного обучения, разработанная для предсказания фальшивых транзакций. Модель обучается на большом наборе данных о допустимых и мошеннических транзакциях для предсказания новых ложных транзакций.
- Alluxio запускает оптимизированную для искусственного интеллекта платформу данных для ускорения конвейеров машинного обучения.
- SQL для визуализации данных как подготовить данные для диаграмм и графиков
- Альтернативные визуализации для истории на основе данных
Анализ мошеннических транзакций
Анализ мошеннических транзакций – это процесс анализа предыдущих наборов данных. Целью анализа набора данных является выявление неправильностей в данных и обнаружение закономерностей в наборе данных. Анализ мошеннических транзакций играет важную роль в бизнесе для защиты клиентов и снижения финансовых потерь. Существуют различные типы анализа мошеннических транзакций, такие как анализ на основе правил и обнаружение аномалий.
- Анализ на основе правил: Анализ на основе правил включает создание правил для выявления недопустимых транзакций. Например, правила могут быть созданы на основе географического положения.
- Обнаружение аномалий: Обнаружение аномалий заключается в поиске необычной или аномальной транзакции. Например, транзакция, совершенная с нового IP-адреса.
Важность обнаружения мошеннических транзакций
Обнаружение мошеннических транзакций является важным для бизнеса и финансовых учреждений с целью защиты клиентов от мошенничества и сохранения их денег. Вот несколько важных причин, по которым необходимо обнаруживать мошеннические транзакции.
- Снижение финансовых потерь: Мошеннические транзакции стоят бизнесам значительные суммы денег, что снижает их прибыль. Поэтому для компаний важно обнаруживать мошеннические транзакции.
- Защита репутации: Поддержание репутации является одним из важных аспектов для бизнеса, поскольку это может привести к потере потенциальных клиентов и покупателей.
- Защита клиента и бизнеса: Мошеннические транзакции могут вызвать финансовый ущерб и негативное эмоциональное воздействие на клиентов. Путем обнаружения мошенничества бизнес может обезопасить клиентов и свои интересы.
Сбор и предварительная обработка данных
Сбор и предварительная обработка данных являются важной частью разработки модели обнаружения мошенничества. После сбора данных необходимо выполнить несколько шагов с набором данных.
- Очистка данных: Очистка данных включает удаление ненужных данных, таких как повторяющиеся данные, и заполнение отсутствующих значений.
- Преобразование данных: Преобразование данных включает преобразование столбцов данных в необходимые типы данных для анализа. Этот шаг гарантирует поддержание качества данных.
- Исследование данных: Исследование данных включает понимание набора данных и выявление взаимосвязей и закономерностей между данными.
- Обработка несбалансированных данных: Набор данных о мошеннических транзакциях имеет высокую несбалансированность, поскольку существует много допустимых транзакций и небольшое количество мошеннических транзакций. Из-за этой проблемы модель может иметь склонность к переобучению. Эту проблему можно решить с помощью техник перевыборки или подвыборки. С их помощью можно создать сбалансированный набор данных.
Визуализация набора данных по обнаружению мошенничества с использованием библиотек
Анализ числовых значений может не помочь вам понять их взаимосвязь. Мы будем использовать библиотеки Python для построения графиков и диаграмм для получения информации из набора данных.
- Matplotlib: Одно из основных инструментов в Python, используемых для создания различных типов диаграмм и графиков, таких как столбчатые диаграммы и линейные графики.
- Seaborn: Это еще один инструмент для визуализации в Python. Он помогает создавать более подробные визуализации, такие как тепловые карты и скрипичные графики.
Техники, используемые для визуализации набора данных о бронировании отелей.
- Countplot: Countplot используется для построения гистограммы категориального значения. Это помогает отображать мошенничество по различным категориальным значениям, что помогает понять их взаимосвязь.
- Distplot: С помощью distplot мы можем определить распределение во времени. Это помогает проверить асимметрию.
Практические случаи и применение модели обнаружения мошенничества MLOPs
Модель обнаружения мошенничества MLOP имеет несколько применений в различных отраслях. Ниже приведены примеры использования:
- Банковское и финансовое учреждение: – Банковские и финансовые учреждения используют инструменты MLOP для обнаружения мошеннических операций, таких как мошенничество с кредитными картами и страховым мошенничеством. Используя эти инструменты, они могут снизить количество мошенничества.
- Электронная коммерция и розничный сектор: – Обнаружение мошеннических операций при покупке товара может помочь в защите данных клиентов и деловой деятельности компаний.
- Здравоохранение и гостиничный бизнес: – Здравоохранение использует MLOP для обнаружения ложных медицинских требований или неправильных практик в выставлении счетов. С помощью модели обнаружения можно сократить эти неправильные практики.
- Телекоммуникации и электронный билетный сервис: – Обнаружение ложных сим-карт, мошенничества с подписками и ложных бронирований. Проблему можно решить с помощью модели MLOPs.
Проблемы и лучшие практики модели обнаружения мошенничества MLOPs
Построение модели обнаружения мошенничества имеет несколько сложностей по разным причинам:
- Качество данных: Качество данных играет важную роль при обучении модели обнаружения мошенничества на исторических данных. Чем лучше данные, тем более точной будет модель. Набор данных о мошенничестве обычно является несбалансированным, что означает, что у нас больше действительных транзакций по сравнению с недействительными. Это создает сложности на этапе обучения модели.
- Конфиденциальность данных: Мошеннические операции часто происходят из-за нарушения доступа к клиентским или бизнес-данным по несанкционированным каналам. Проектирование модели таким образом, чтобы сохранить конфиденциальность клиентских данных.
- Дрейф модели: Дрейф модели представляет собой значительную проблему из-за изменений в качестве данных. Чтобы модель не подвергалась дрейфу, необходимо поддерживать качество данных и контролировать модель.
- Обработка в реальном времени: Обработка в реальном времени часто связана с дополнительными сложностями, так как она добавляет еще один уровень сложности.
Лучшие практики при создании модели обнаружения мошенничества:
Ниже рассмотрены лучшие практики при создании модели обнаружения мошенничества:
- Инженерия признаков: После сбора данных мы выполняем предварительную обработку данных и инженерию признаков, чтобы получить данные хорошего качества.
- Обработка несбалансированных данных: Наборы данных для обнаружения мошенничества часто являются несбалансированными, с множеством действительных транзакций по сравнению с мошенническими. Это несбалансированность часто приводит к смещению в модели. Для решения этой проблемы мы используем техники недо- и пересэмплинга.
- Построение модели: Для обучения модели используется ансамблевая техника, которая обеспечивает хорошую точность модели. Результирующая модель будет способна предсказывать как мошеннические, так и действительные транзакции.
- MLOPs: Используйте фреймворк MLOPs для построения полного жизненного цикла решения, начиная с обучения, развертывания и мониторинга модели. Этот фреймворк устанавливает правила для построения модели и гарантирует ее точность и надежность.
Перспективы и прогресс в модели обнаружения мошенничества MLOPs
С увеличением цифровизации и ростом использования интернета все больше людей начинают использовать цифровые методы оплаты и онлайн-сервисы бронирования. С развитием технологий это создает простой и быстрый инструмент оплаты. Поэтому становится важным разработать инструмент, который предотвратит мошенничество и увеличит доверие клиентов к компании и ее услугам. Бизнесы часто ищут надежные, доступные и экономичные решения. Технология может сыграть в этом важную роль. Разработка инструментов и услуг вокруг финансового продукта может помочь бизнесу предоставлять широкий спектр услуг своим клиентам. Такой персонализированный финансовый продукт также может быть предоставлен, что позволит увеличить доверие и улучшить отношения между клиентами и компаниями.
Анализ данных обнаружения мошенничества с использованием Python
Давайте выполним базовый анализ данных с использованием реализации Python на наборе данных с Kaggle. Чтобы скачать набор данных, нажмите здесь.
Детали набора данных
Набор данных обнаружения мошенничества содержит более 1 миллиона записей, на основе которых будет обучена модель. Ниже приведены подробности набора данных:
Шаг 1: Импорт библиотек
import randomimport calendarimport pandas as pdimport numpy as npimport seaborn as snsimport matplotlib.pyplot as pltfrom scipy.stats import norm, skew, ttest_indimport warningswarnings.filterwarnings('ignore')
Шаг 2: Импорт набора данных и осмотр данных
#Считываем данные из файлов train и test, затем преобразуем их в dataframe df=pd.read_csv('C:\Decodr\G3\B\FRAUD_DETECTION_IN_IMBALANCED_DATA\data2\Train.csv')T_df=pd.read_csv('C:\Decodr\G3\B\FRAUD_DETECTION_IN_IMBALANCED_DATA\data2\Test.csv')#Форма dataframedf.shape,T_df.shape((1048575, 22), (555719, 22))#Проверка информации о dataframe train и testdf.info(),T_df.info()#Проверка наличия пустых значений в dataframe train и testdf.isna().sum(),T_df.isna().sum()
ВЫВОД
Шаг 3: Визуализация набора данных
#Мошенничество на основе категорииsns.countplot(data=df[df['is_fraud_cat'] == "T"], x='category')plt.xticks(rotation=45)plt.show()
ВЫВОД
ВыводБольшинство мошенничеств происходят в категориях shopping_net и grocery_pos
#Мошенничество на основе поласns.countplot(data=df[df['is_fraud_cat']=="T"],x='gender') plt.show()
ВЫВОД
ВыводХотя случаев мошенничества происходит больше среди женских клиентов, количество практически одинаково для обоих полов.
#Мошенничество на основе штатаfig, ax = plt.subplots(figsize=(120,60))plt.rcParams.update({'font.size': 60})sns.countplot(data=df[df['is_fraud_cat']=="T"],x='state')plt.xticks(rotation=45)for p, label in zip(ax.patches, df["state"].value_counts().index): ax.annotate(label, (p.get_x(), p.get_height()+0.15))plt.title("Количество мошенничеств с использованием кредитных карт по штатам")plt.show()
ВЫВОД
ВыводШтаты OH, TX и LA сообщают о наибольшем количестве мошенничеств с использованием кредитных карт
#Мошенничество на основе городадef randomcolor(): r = random.random() b = random.random() g = random.random() rgb = [r,g,b] return rgbplt.rcParams.update({'font.size': 20})df[df['is_fraud_cat']=="T"]["city"].value_counts(sort=True,ascending=False).head(10).plot(kind="bar",color=randomcolor())plt.title("Количество мошенничеств с использованием кредитных карт по городам")plt.show()
ВЫВОД
Инсайт Даллас, Хьюстон и Бирмингем сообщают о наибольшем количестве мошенничеств.
#Fraud на основе Jobdf[df['is_fraud_cat']=="T"]["job"].value_counts(sort=True,ascending=False).head(10).plot(kind="bar",color=randomcolor())plt.title("Количество мошеннических действий с кредитными картами по профессиям")plt.show()
ВЫВОД
Инсайт Большинство мошеннических действий произошло в сферах деятельности количественного сметчика, за которым следуют архитектор морских судостроительных сооружений и материаловед.
#Fraud vs Non Fraud plt.figure(figsize=(8,5))ax = sns.countplot(x="is_fraud", data=df,color=randomcolor())for p in ax.patches: ax.annotate('{:.1f}'.format(p.get_height()), (p.get_x()+0.25, p.get_height()+0.01))plt.show()
ВЫВОД
Инсайт Только около 6006 записей представляют мошеннические операции из почти 1 миллиона записей; поэтому мы имеем дело с несбалансированным набором данных.
Шаг 4. Предобработка и инженерия признаков
data['trans_date_trans_time'] = pd.to_datetime(data['trans_date_trans_time'], format='%d-%m-%Y %H:%M')data['trans_date']=data['trans_date_trans_time'].dt.strftime('%Y-%m-%d')data['trans_date']=pd.to_datetime(data['trans_date'])data['dob']=pd.to_datetime(data['dob'],format='%d-%m-%Y')data["age"] = data["trans_date"]-data["dob"]data["age"] = data["age"].astype('int64')data['trans_month'] = pd.DatetimeIndex(data['trans_date']).monthdata['trans_year'] = pd.DatetimeIndex(data['trans_date']).yeardata['Month_name'] = data['trans_month'].apply(lambda x: calendar.month_abbr[x])data['latitudinal_distance'] = abs(round(data['merch_lat']-data['lat'],3))data['longitudinal_distance'] = abs(round(data['merch_long']-data['long'],3))data.gender=data.gender.apply(lambda x: 1 if x=="M" else 0)data = data.drop(['cc_num','merchant','first','last','street','zip','trans_num','unix_time','trans_date_trans_time','city','lat','long','job','dob','merch_lat','merch_long','trans_date','state','Month_name'],axis=1)data =pd.get_dummies(data,columns=['category'],drop_first=True)#Performing Undersamplingnormal = data[data['is_fraud']==0]fraud = data[data['is_fraud']==1]normal_sample=normal.sample(n=len(fraud),random_state=42)new_data = pd.concat([normal_sample,fraud],ignore_index=True)
Сборка модели от начала до конца с использованием MS Azure и Airflow
В предыдущем шаге я читал файлы данных локально для визуализации, но для части реализации мы будем использовать облачные сервисы, такие как MS Azure. Я покажу вам, как интегрировать MS Azure с инструментом Airflow для ввода данных и построения модели. В MS Azure в первую очередь создайте учетную запись хранения, а затем внутри нее контейнер. В этом контейнере храните файл. Мы создадим конвейер Airflow, который забирает данные из контейнера и размещает их в требуемом месте. После этого мы создадим модель от начала до конца, а затем развернем ее в облачном потоке, где она может быть общедоступной.
Чтобы создать учетную запись хранения, вам необходимо создать учетную запись Azure. Выполните следующие действия:
- Создайте учетную запись MS Azure
- Создайте учетную запись хранения
- Создайте контейнер внутри учетной записи хранения
- После создания контейнера загрузите файл вручную или с помощью Airflow DAG.
Что такое Airflow?
Airflow – это платформа управления рабочим процессом с открытым исходным кодом, которая помогает создавать и контролировать модель. Она использует направленный ациклический граф (DAG) для определения рабочего процесса. Airflow предлагает несколько преимуществ, описанных ниже:
- Динамическое определение рабочих процессов: В Airflow мы можем определить настраиваемый поток воздуха с использованием Python. Вы можете легко создавать и изменять этот рабочий процесс, что обеспечивает гибкость рабочего процесса.
- Масштабируемость: Вы можете быстро масштабировать Airflow для обработки нескольких рабочих процессов одновременно с использованием распределенной архитектуры.
- Мониторинг и ведение журналов: Airflow предлагает дружественный пользовательский веб-интерфейс. С помощью веб-интерфейса пользователи могут мониторить и просматривать журналы. Это помогает быстро устранять проблемы.
- Параллельное выполнение: Airflow предлагает возможность запуска рабочего процесса параллельно, что существенно сокращает время выполнения. Это также улучшает производительность модели.
В реальном мире построение модели недостаточно; мы должны развернуть модель в производстве и отслеживать ее производительность со временем и то, как она взаимодействует с реальными данными. Мы можем создать машинное обучение от начала до конца и отслеживать его с помощью Airflow. В Airflow мы можем создать рабочий процесс и установить зависимость, в которой они будут выполняться. Состояние рабочего процесса также можно проверить в Airflow, независимо от того, выполнен ли он успешно, не удалось ли перезапустить и т. д. После выполнения рабочего процесса журналы можно отслеживать в Airflow. Таким образом, мы можем отслеживать нашу модель, готовую к производству. Я настоятельно рекомендую ознакомиться с документацией Airflow для получения дополнительной информации.
Рабочий процесс
Рабочий процесс состоит из следующих шагов:
- data_upload_operator: – Этот оператор возьмет файл из локального хранилища и загрузит его в контейнер Azure Blob.
- data_download_operator: – Этот оператор загрузит файл из Azure в локальное хранилище.
- data_preprocessing_operator: – Этот оператор выполняет предварительную обработку набора данных, загруженного из Azure.
- data_split_operator: – Этот оператор разделит набор данных на две части. В первой части модель будет обучаться, а во второй – модель будет тестироваться.
- model_training_operator: – Этот оператор обучает модель на наборе данных.
- model_evaluation_operator: – Этот оператор используется для оценки производительности модели.
- model_prediction_operator: – Этот оператор используется для предсказания модели на новом невидимом наборе данных.
Разработка модели
Как мы видим, здесь представлены различные операторы Airflow. Теперь давайте перейдем к части кодирования.
data_upload_operator
from azure.storage.blob import BlobServiceClientfrom config.constant import storage_account_key, storage_account_name, connection_string, container_name, file_path_up, file_namedef uploadToBlobStorage(): try: blob_service_client = BlobServiceClient.from_connection_string (connection_string) blob_client = blob_service_client.get_blob_client (container = container_name, blob = file_name) with open(file_path_up,"rb") as data: blob_client.upload_blob(data) print("Загрузка " + file_name + " из локального хранилища в контейнер " + container_name) except Exception as e: print(f"Произошла ошибка: {str(e)}")uploadToBlobStorage()
Выше мы определили метод uploadToBlobStorage (), который будет устанавливать связь с учетной записью хранилища MS Azure. Затем он возьмет файл из локального хранилища и загрузит его в облако.
data_download_operator
from azure.storage.blob import BlobServiceClientfrom config.constant import storage_account_key, storage_account_name, connection_string, container_name, blob_name, file_path_downdef downloadFromBlobStorage(): try: # Инициализируем BlobServiceClient с использованием строки подключения blob_service_client = BlobServiceClient.from_connection_string (connection_string) # Получаем BlobClient для целевого блоба blob_client = blob_service_client.get_blob_client (container=container_name, blob=blob_name) # Загружаем блоб в локальный файл with open(file_path_down, "wb") as data: data.write(blob_client.download_blob().readall()) print(f"Скачано {blob_name} из {container_name} в {file_path_down}") except Exception as e: print(f"Произошла ошибка: {str(e)}")downloadFromBlobStorage()
Здесь определен метод downloadFromBlobStorage(). Он будет устанавливать соединение с хранилищем и загружать файл. Затем файл будет сохранен по указанному пути.
data_preprocessing_operator
из airflow.models импортировать BaseOperatorfrom airflow.utils.decorators импортировать apply_defaultsimport pandas как pdimport calendarclass DataPreprocessingOperator(BaseOperator): @apply_defaults def __init__(self, предобработанные_данные, *args, **kwargs): super(DataPreprocessingOperator, self).__init__(*args, **kwargs) self.предобработанные_данные = предобработанные_данные def execute(self, context): попробуйте: # Выполните здесь логику предобработки данных # Например, вы можете очистить, преобразовать или создать #функции в принятых данных данные = pd.read_csv('data/processed/ingested_data.csv') данные['trans_date_trans_time'] = pd.to_datetime (data['trans_date_trans_time'], format='%d-%m-%Y %H:%M') данные['trans_date'] = данные['trans_date_trans_time'].dt.strftime('%Y-%m-%d') данные['trans_date'] = pd.to_datetime(данные['trans_date']) данные['dob'] = pd.to_datetime(данные['dob'], format='%d-%m-%Y') данные["age"] = данные["trans_date"] - данные["dob"] данные["age"] = данные["age"].astype('int64') данные['trans_month'] = pd.DatetimeIndex(данные['trans_date']).month данные['trans_year'] = pd.DatetimeIndex(данные['trans_date']).year данные['Month_name'] = данные['trans_month']. apply(lambda x: calendar.month_abbr[x]) данные['latitudinal_distance'] = abs(round(данные['merch_lat'] - данные['lat'], 3)) данные['longitudinal_distance'] = abs(round(данные['merch_long'] - данные['long'], 3)) данные.gender = данные.gender.apply(lambda x: 1 if x == "M" else 0) данные = данные.drop(['cc_num', 'merchant', 'first', 'last', 'street', 'zip', 'trans_num', 'unix_time', 'trans_date_trans_time', 'city', 'lat', 'long', 'job', 'dob', 'merch_lat', 'merch_long', 'trans_date', 'state', 'Month_name'], axis=1) данные = pd.get_dummies(данные, columns=['category'], drop_first=True) #Выполняем недообучение нормальные = данные[данные['is_fraud']==0] мошенничество = данные[данные['is_fraud']==1] нормальные_выборка = нормальные.sample(n=len(мошенничество), random_state=42) новые_данные = pd.concat([нормальные_выборка, мошенничество], ignore_index=True) #Выполняем переобучение # нормальные = данные[данные['is_fraud']==0] # мошенничество = данные[данные['is_fraud']==1] # мошенничество_выборка = мошенничество.sample(n=len(нормальные), replace=True, random_state=42) # новые_данные = pd.concat([нормальные, мошенничество_выборка], ignore_index=True) #Сохраняем предобработанные данные в выходной файл (например, CSV файл) новые_данные.to_csv(self.предобработанные_данные, index=False) except Исключение как e: self.log.error(f'Ошибка предобработки данных: {str(e)}') поднять e
- Выше мы изменили тип данных и удалили столбцы
- Поскольку набор данных несбалансирован, мы выполнили недообучение. Мы также поместили код для переобучения.
model_training_operator
из airflow.models импортировать BaseOperatorfrom airflow.utils.decorators импортировать apply_defaultsimport pandas как pdиз sklearn.ensemble импортировать RandomForestClassifierимпортировать joblibclass ModelTrainingRFCOperator(BaseOperator): """ Пользовательский оператор Apache Airflow для обучения модели машинного обучения и сохранение его в файл. """ def __init__(self, X_train_file, y_train_file, model_file, *args, **kwargs): """ Инициализировать оператор. :param X_train_file: Путь к файлу с признаками обучающей выборки (X_train). :param y_train_file: Путь к файлу с метками обучающей выборки (y_train). :param model_file: Путь к файлу, в котором сохранить обученную модель. """ super(ModelTrainingRFCOperator, self).__init__(*args, **kwargs) self.X_train_file = X_train_file self.y_train_file = y_train_file self.model_file = model_file def execute(self, context): self.log.info(f'Обучение модели машинного обучения с использованием данных из {self.X_train_file, self.y_train_file}') попробуйте: X_train = pd.read_csv(self.X_train_file) y_train = pd.read_csv(self.y_train_file) print(X_train.shape) print(y_train.shape) # Инициализировать и обучить модель машинного обучения #(заменить своим классом модели) RFC = RandomForestClassifier(n_estimators=100, random_state=0) RFC.fit(X_train, y_train) # Сохранить обученную модель в указанный model_file joblib.dump(RFC, self.model_file) except Исключение как e: self.log.error(f'Ошибка обучения модели: {str(e)}') поднять e
После предварительной обработки и разделения данных следующим шагом является обучение модели. В коде мы использовали RandomForestClassifier для обучения модели.
model_evaluation_operator
from airflow.models import BaseOperatorfrom airflow.utils.decorators import apply_defaultsimport pandas as pdfrom sklearn.metrics import accuracy_score, classification_reportimport joblibclass ModelEvaluationRFCOperator(BaseOperator): """ Пользовательский оператор Apache Airflow для оценки модели машинного обучения и сохранения результатов оценки в файл. """ @apply_defaults def __init__(self, X_test_file, y_test_file, model_file, output_file, *args, **kwargs): """ Инициализация оператора. :param X_test_file: Путь к файлу с признаками тестового набора (X_test). :param y_test_file: Путь к файлу с метками тестового набора (y_test). :param model_file: Путь к загруженной обученной модели. :param output_file: Путь к файлу для сохранения результатов оценки. """ super(ModelEvaluationRFCOperator, self).__init__(*args, **kwargs) self.X_test_file = X_test_file self.y_test_file = y_test_file self.model_file = model_file self.output_file = output_file def execute(self, context): self.log.info(f'Выполняется оценка модели машинного обучения с использованием данных из {self.X_test_file, self.y_test_file}') # Получение тестовых данных из предыдущей задачи с помощью XCom test_data = context['ti'].xcom_pull(task_ids='data_split_task', key='test_data') try: """ Выполнение оператора для оценки модели машинного обучения и сохранения результатов оценки в файл. """ # Загрузка тестовых данных и обученной модели из предоставленных файлов X_test = pd.read_csv(self.X_test_file) y_test = pd.read_csv(self.y_test_file) model = joblib.load(self.model_file) # Создание прогнозов с использованием обученной модели y_pred = model.predict(X_test) # Расчет и вывод метрик оценки accuracy = accuracy_score(y_test, y_pred) classification_rep = classification_report (y_test, y_pred, target_names=['класс_0', 'класс_1']) # Пользовательские метки при необходимости # Сохранение результатов оценки в указанный выходной файл with open(self.output_file, 'w') as f: f.write(f"Точность: {accuracy}\n\nОтчет о классификации:\n {classification_rep}") except Exception as e: self.log.error(f'Оценка модели не удалась: {str(e)}') raise e
После обучения модели мы провели оценку модели и подготовили отчет о классификации. Здесь мы проверяем точность модели, точность, полноту и F1-меру.
model_prediction_operator
from airflow.models import BaseOperatorfrom airflow.utils.decorators import apply_defaultsimport pandas as pdfrom sklearn.metrics import accuracy_score, classification_reportimport joblibimport calendarclass ModelPredictionOperator(BaseOperator): """ Пользовательский оператор Apache Airflow для оценки модели машинного обучения и сохранения результатов оценки в файл. """ @apply_defaults def __init__(self, input_file, model_file, output_file, *args, **kwargs): """ Инициализация оператора. :param X_test_file: Путь к файлу с признаками тестового набора (X_test). :param y_test_file: Путь к файлу с метками тестового набора (y_test). :param model_file: Путь к загруженной обученной модели. :param output_file: Путь к файлу для сохранения результатов оценки. """ super(ModelPredictionOperator, self).__init__(*args, **kwargs) self.input_file = input_file self.model_file = model_file self.output_file = output_file def execute(self, context): self.log.info(f'Выполняется оценка модели машинного обучения с использованием данных из {self.input_file}') try: """ Выполнение оператора для оценки модели машинного обучения и сохранения результатов оценки в файл. """ # Загрузка данных и обученной модели из предоставленных файлов new_data = pd.read_csv('data/raw/Test.csv') new_data['trans_date_trans_time'] = pd.to_datetime (new_data['trans_date_trans_time'], format='%d-%m-%Y %H:%M') new_data['trans_date'] = new_data['trans_date_trans_time']. dt.strftime('%Y-%m-%d') new_data['trans_date'] = pd.to_datetime(new_data['trans_date']) new_data['dob'] = pd.to_datetime(new_data['dob'], format='%d-%m-%Y') new_data["age"] = new_data["trans_date"] - new_data["dob"] new_data["age"] = new_data["age"].astype('int64') new_data['trans_month'] = pd.DatetimeIndex(new_data['trans_date']).month new_data['trans_year'] = pd.DatetimeIndex(new_data['trans_date']).year new_data['Month_name'] = new_data['trans_month'].apply(lambda x: calendar.month_abbr[x]) new_data['latitudinal_distance'] = abs(round(new_data['merch_lat'] - new_data['lat'], 3)) new_data['longitudinal_distance'] = abs(round(new_data['merch_long'] - new_data['long'], 3)) new_data.gender = new_data.gender.apply(lambda x: 1 if x == "M" else 0) new_data = new_data.drop(['cc_num', 'merchant', 'first', 'last', 'street', 'zip', 'trans_num', 'unix_time', 'trans_date_trans_time', 'city', 'lat', 'long', 'job', 'dob', 'merch_lat', 'merch_long', 'trans_date', 'state', 'Month_name'], axis=1) new_data = pd.get_dummies(new_data, columns=['category'], drop_first=True) X_new = new_data.drop(["is_fraud"], axis=1) y_new = new_data["is_fraud"] model = joblib.load(self.model_file) # Создание прогнозов с использованием обученной модели y_pred_new = model.predict(X_new) print('y_new', y_new) print('y_pred_new', y_pred_new) # Расчет и вывод метрик оценки accuracy = accuracy_score(y_new, y_pred_new) classification_rep = classification_report (y_new, y_pred_new, target_names=['класс_0', 'класс_1']) # Пользовательские метки при необходимости # Сохранение результатов оценки в указанный выходной файл with open(self.output_file, 'w') as f: f.write(f"Точность: {accuracy}\n\nОтчет о классификации:\n {classification_rep}") except Exception as e: self.log.error(f'Оценка модели не удалась: {str(e)}') raise e
В операторе прогнозирования мы тестируем модель на новом наборе данных, то есть на тестовом файле данных. После прогнозирования мы подготавливаем отчёт о классификации.
Настройка окружения и развертывание модели в облаке
Создайте виртуальное окружение с помощью Python или Anaconda.
#Команда для создания виртуального окруженияpython3 -m venv <название_виртуального_окружения>
Вам необходимо установить некоторые пакеты Python в вашем окружении с помощью следующей команды:
cd airflow-projects/fraud-predictionpip install -r requirements.txt
Перед запуском рабочего процесса вы должны установить Airflow и настроить базу данных.
#Установка Airflowpip install 'apache-airflow==2.7.1' \ --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-2.7.1/ constraints-3.8.txt"#Установка домашнего путиexport AIRFLOW_HOME=/c/Users/[Ваше_имя_пользователя]/airflow#Инициализация базы данных:airflow db init#Создание пользователя Airflowairflow users create --username admin –password admin –firstname admin –lastname admin –role Admin –email [email protected]#Проверка созданного пользователяairflow users list#Запуск Веб-сервера#Запуск планировщикаairflow scheduler#Если порт 8080 используется, измените порт, набрав:airflow webserver –port <номер_порта>
Мы можем войти на веб-портал Airflow, используя имя пользователя и пароль, созданные выше.
Выше мы создали различные операторы Airflow, которые можно запустить с помощью DAG Airflow. Мы можем запустить DAG одним нажатием.
![image.png](https://ai.miximages.com/av-eks-lekhak.s3.amazonaws.com/media/__sized__/article_images/image_fX88Zw2-thumbnail_webp-600x300.webp)
Существуют различные статусы, через которые проходит рабочий процесс, прежде чем успешно завершиться или завершиться с ошибкой. Они показаны ниже:
Ниже приведены различные операторы, о которых мы говорили выше. Мы также можем отслеживать статус рабочего процесса в режиме реального времени во время его выполнения.
Мы можем отслеживать журналы рабочего процесса, запущенного DAG, в Airflow. Ниже приведен образец.
Развертывание модели в облаке
После получения лучшей модели мы развернули модель с помощью кода Streamlit. Чтобы запустить это приложение Streamlit на вашей локальной системе, используйте следующую команду:
# команда для запуска приложения Streamlit локальноstreamlit run streamlit_app.py
Облачная версия приложения также может быть доступна по следующему URL-адресу, который можно открыть публично.
https://fraud-prediction-mlops-d8rcgc2prmv9xapx5ahhhn.streamlit.app/
Для полной реализации кода машинного обучения от начала до конца нажмите здесь.
Результаты
Мы провели эксперименты с несколькими алгоритмами и сравнили производительность каждой модели. Результаты следующие:
После использования техники ансамблирования на сильно несбалансированном наборе данных из указанного выше результата, мы видим, что все четыре модели показали очень хорошие результаты с точностью более 90%. Классификатор случайного леса и классификатор дерева решений имеют примерно одинаковую точность, причем случайный лес немного превосходит дерево решений.
- Точность: Точность – это отношение правильных прогнозов к общему количеству прогнозов.
- Полнота: Полнота – это количество правильных прогнозов в положительных классах.
- Призыв: Призыв определяется как количество правильных оптимистических прогнозов, сделанных из всех фактических положительных выборок в наборе данных.
- F1-мера: F1-мера измеряет точность модели. Она определяется как гармоническое среднее между точностью и точностью прогноза.
Демо-приложение
Живое демо-приложение этого проекта с использованием Streamlit. Оно принимает некоторые входные данные для продукта и прогнозирует действительную или мошенническую транзакцию с использованием наших обученных моделей.
Вывод
Сегодняшний мир цифровой, и технологии стали неотъемлемой частью нашей жизни. Существует увеличение онлайн-сервисов от книг до смартфонов и ноутбуков. Все можно купить онлайн. Поэтому предотвращение мошенничества и внедрение модели обнаружения мошенничества становится неотъемлемым для каждой компании. Машинное обучение может сыграть важную роль для бизнеса и клиентов.
- Повышает прибыль бизнеса, выявляя мошеннические финансовые операции.
- Помогает поддерживать деловую репутацию и увеличивать клиентов.
- Инструменты машинного обучения помогают предоставлять доступные и лучшие услуги.
- Помогает предоставлять качественные услуги и строить доверие с клиентами.
Часто задаваемые вопросы
Медиа, показанное в этой статье, не принадлежит Analytics Vidhya и используется по усмотрению автора.