Внедрение обнаружения мошеннических транзакций с использованием MLOPs

Эффективное выявление мошеннических транзакций с помощью MLOps

Введение

В сегодняшнем цифровом мире люди все больше переходят к онлайн-транзакциям и цифровым платежам из-за удобства, а не наличных денег. Вместе с увеличением перехода также увеличивается количество мошенничества. Мошенническая транзакция может быть любого типа, поскольку она включает в себя запрос денег с использованием ложной личности или ложной информации. Это представляет значительную проблему для отдельных лиц и финансовых учреждений. В этом проекте мы будем использовать набор данных по кредитным картам для разработки модели MLOPs с использованием инструмента Airflow для мониторинга живых транзакций и прогнозирования их подлинности или мошеннического характера.

Цели обучения

  • Важность обнаружения мошеннических транзакций.
  • Очистка данных, преобразование наборов данных и предварительная обработка наборов данных.
  • Визуальный анализ набора данных для получения исходной информации.
  • Применение модели обнаружения мошеннических транзакций в реальном мире с использованием науки о данных.
  • Анализ данных о мошеннических транзакциях с использованием языка программирования Python
  • Построение полноценной системы обнаружения мошенничества с использованием MS Azure и Airflow

Эта статья была опубликована в рамках Data Science Blogathon.

Что такое модель оценки мошеннических транзакций?

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

Анализ мошеннических транзакций

Анализ мошеннических транзакций – это процесс анализа предыдущих наборов данных. Целью анализа набора данных является выявление неправильностей в данных и обнаружение закономерностей в наборе данных. Анализ мошеннических транзакций играет важную роль в бизнесе для защиты клиентов и снижения финансовых потерь. Существуют различные типы анализа мошеннических транзакций, такие как анализ на основе правил и обнаружение аномалий.

  • Анализ на основе правил: Анализ на основе правил включает создание правил для выявления недопустимых транзакций. Например, правила могут быть созданы на основе географического положения.
  • Обнаружение аномалий: Обнаружение аномалий заключается в поиске необычной или аномальной транзакции. Например, транзакция, совершенная с нового IP-адреса.

Важность обнаружения мошеннических транзакций

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

  • Снижение финансовых потерь: Мошеннические транзакции стоят бизнесам значительные суммы денег, что снижает их прибыль. Поэтому для компаний важно обнаруживать мошеннические транзакции.
  • Защита репутации: Поддержание репутации является одним из важных аспектов для бизнеса, поскольку это может привести к потере потенциальных клиентов и покупателей.
  • Защита клиента и бизнеса: Мошеннические транзакции могут вызвать финансовый ущерб и негативное эмоциональное воздействие на клиентов. Путем обнаружения мошенничества бизнес может обезопасить клиентов и свои интересы.

Сбор и предварительная обработка данных

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

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

Визуализация набора данных по обнаружению мошенничества с использованием библиотек

Анализ числовых значений может не помочь вам понять их взаимосвязь. Мы будем использовать библиотеки Python для построения графиков и диаграмм для получения информации из набора данных.

  • Matplotlib: Одно из основных инструментов в Python, используемых для создания различных типов диаграмм и графиков, таких как столбчатые диаграммы и линейные графики.
  • Seaborn: Это еще один инструмент для визуализации в Python. Он помогает создавать более подробные визуализации, такие как тепловые карты и скрипичные графики.

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

  • Countplot: Countplot используется для построения гистограммы категориального значения. Это помогает отображать мошенничество по различным категориальным значениям, что помогает понять их взаимосвязь.
  • Distplot: С помощью distplot мы можем определить распределение во времени. Это помогает проверить асимметрию.

Практические случаи и применение модели обнаружения мошенничества MLOPs

Модель обнаружения мошенничества MLOP имеет несколько применений в различных отраслях. Ниже приведены примеры использования:

  1. Банковское и финансовое учреждение: – Банковские и финансовые учреждения используют инструменты MLOP для обнаружения мошеннических операций, таких как мошенничество с кредитными картами и страховым мошенничеством. Используя эти инструменты, они могут снизить количество мошенничества.
  2. Электронная коммерция и розничный сектор: – Обнаружение мошеннических операций при покупке товара может помочь в защите данных клиентов и деловой деятельности компаний.
  3. Здравоохранение и гостиничный бизнес: – Здравоохранение использует MLOP для обнаружения ложных медицинских требований или неправильных практик в выставлении счетов. С помощью модели обнаружения можно сократить эти неправильные практики.
  4. Телекоммуникации и электронный билетный сервис: – Обнаружение ложных сим-карт, мошенничества с подписками и ложных бронирований. Проблему можно решить с помощью модели 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

Существуют различные статусы, через которые проходит рабочий процесс, прежде чем успешно завершиться или завершиться с ошибкой. Они показаны ниже:

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

Мы можем отслеживать журналы рабочего процесса, запущенного DAG, в Airflow. Ниже приведен образец.

Развертывание модели в облаке

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

# команда для запуска приложения Streamlit локальноstreamlit run streamlit_app.py

Облачная версия приложения также может быть доступна по следующему URL-адресу, который можно открыть публично.

https://fraud-prediction-mlops-d8rcgc2prmv9xapx5ahhhn.streamlit.app/

Для полной реализации кода машинного обучения от начала до конца нажмите здесь.

Результаты

Мы провели эксперименты с несколькими алгоритмами и сравнили производительность каждой модели. Результаты следующие:

После использования техники ансамблирования на сильно несбалансированном наборе данных из указанного выше результата, мы видим, что все четыре модели показали очень хорошие результаты с точностью более 90%. Классификатор случайного леса и классификатор дерева решений имеют примерно одинаковую точность, причем случайный лес немного превосходит дерево решений.

  • Точность: Точность – это отношение правильных прогнозов к общему количеству прогнозов.
  • Полнота: Полнота – это количество правильных прогнозов в положительных классах.
  • Призыв: Призыв определяется как количество правильных оптимистических прогнозов, сделанных из всех фактических положительных выборок в наборе данных.
  • F1-мера: F1-мера измеряет точность модели. Она определяется как гармоническое среднее между точностью и точностью прогноза.

Демо-приложение

Живое демо-приложение этого проекта с использованием Streamlit. Оно принимает некоторые входные данные для продукта и прогнозирует действительную или мошенническую транзакцию с использованием наших обученных моделей.

Вывод

Сегодняшний мир цифровой, и технологии стали неотъемлемой частью нашей жизни. Существует увеличение онлайн-сервисов от книг до смартфонов и ноутбуков. Все можно купить онлайн. Поэтому предотвращение мошенничества и внедрение модели обнаружения мошенничества становится неотъемлемым для каждой компании. Машинное обучение может сыграть важную роль для бизнеса и клиентов.

  • Повышает прибыль бизнеса, выявляя мошеннические финансовые операции.
  • Помогает поддерживать деловую репутацию и увеличивать клиентов.
  • Инструменты машинного обучения помогают предоставлять доступные и лучшие услуги.
  • Помогает предоставлять качественные услуги и строить доверие с клиентами.

Часто задаваемые вопросы

Медиа, показанное в этой статье, не принадлежит Analytics Vidhya и используется по усмотрению автора.