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

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

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

Импорт набора данных:

# Import necessary libraries
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report

# Load and clean the data
data = pd.read_csv("procurement_data.csv")
data = data.dropna()

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

Мы используем data.head() только для того, чтобы убедиться, что мы загружаем соответствующий набор данных. И мы видим, что все хорошо (пока).

Добавление столбца «Разница в сумме»

# Create new features
data["amount_diff"] = data["invoice_amount"] - data["order_amount"]

# Create target variable
data["fraud"] = np.where(data["amount_diff"] > 0, 1, 0)

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

Затем код создает целевую переменную fraud, которой присваивается значение 1, если amount_diff больше 0, и 0 в противном случае.

Классификатор случайного леса

Затем данные разбиваются на обучающие и тестовые наборы с помощью функции train_test_split из модуля sklearn.model_selection:

# Split data into training and test sets
X = data.drop(["fraud", "amount_diff"], axis=1)
y = data["fraud"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

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

# Train the model
clf = RandomForestClassifier(n_estimators=100)
clf.fit(X_train, y_train)

Но вот в процессе обучения модели мы упираемся в стену:

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

Итак, сначала нам нужно проверить все типы значений столбцов:

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

LabelEncoder — это класс из модуля sklearn.preprocessing, который можно использовать для преобразования категорийных данных (т. е. нечисловых данных, таких как строки) в числовые данные, которые можно использовать в алгоритмах машинного обучения.

from sklearn.preprocessing import LabelEncoder

# Initialize the encoder
encoder = LabelEncoder()

# Fit and transform the Purchase Order ID column
data['Purchase Order ID Encoded'] = encoder.fit_transform(data['Purchase Order ID'])

# Fit and transform the Vendor ID column
data['Vendor ID Encoded'] = encoder.fit_transform(data['Vendor ID'])

# Fit and transform the Employee ID column
data['Employee ID Encoded'] = encoder.fit_transform(data['Employee ID'])

# Fit and transform the Item Description column
data['Items Encoded'] = encoder.fit_transform(data['Items'])

Это создаст четыре новых столбца в вашем фрейме данных, каждый с закодированными значениями. Обратите внимание, что метод fit_transform() вызывается для каждого столбца отдельно, чтобы обеспечить независимое кодирование каждого столбца.

И затем мы снова проверим типы значений наших столбцов:

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

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

Результат

Наконец, код оценивает точность модели, используя функции accuracy_score и classification_report из модуля sklearn.metrics.

Вывод кода показывает, что модель достигла идеальной точности на тестовом наборе, правильно идентифицировав все три транзакции как немошеннические:

Accuracy:  1.0
              precision    recall  f1-score   support

           0       1.00      1.00      1.00         3

    accuracy                           1.00         3
   macro avg       1.00      1.00      1.00         3
weighted avg       1.00      1.00      1.00         3

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

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

Конечно, стоит отметить, что это лишь один из примеров того, как машинное обучение можно использовать для обнаружения мошенничества в сфере закупок.