Выявление мошеннических транзакций с помощью ML!Детекция мошеннических операций — одна из основных задач финтех-систем. Модель должна оценивать риск транзакции и выявлять подозрительную активность в потоке платежей.
Установка библиотек:
pip install pandas scikit-learn
Будем использовать pandas для работы с данными и scikit-learn для построения модели.
Импорт модулей:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
Мы будем использовать пайплайн, который объединяет предобработку и модель — это стандартная практика для воспроизводимости и предотвращения утечек данных.
Пример структуры данных (учебный):
data = pd.DataFrame({
"amount": [12, 35, 60, 15, 22, 40, 2500, 4200, 5000, 3600],
"hour": [14, 18, 12, 10, 16, 19, 3, 2, 1, 2],
"is_foreign": [0, 0, 0, 0, 0, 0, 1, 1, 1, 1],
"transactions_last_24h": [2, 3, 1, 2, 2, 3, 15, 20, 25, 18],
"fraud": [0, 0, 0, 0, 0, 0, 1, 1, 1, 1]
})Признаки отражают типичные сигналы риска: сумма операции, время суток, зарубежная транзакция и активность аккаунта за последние сутки. Целевая переменная
fraud показывает, признана ли операция мошеннической.
Разделим данные на признаки и целевую переменную:
X = data.drop(columns=["fraud"])
y = data["fraud"]
Теперь модель будет учиться предсказывать
fraud на основе остальных признаков.
Разделим данные на обучающую и тестовую выборки:
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42, stratify=y
)
Стратификация сохраняет долю мошеннических операций в обеих выборках, что особенно важно при дисбалансе классов.
В антифроде логистическая регрессия часто используется как базовая модель: она быстрая, понятная и умеет оценивать вероятность мошенничества. Чтобы учесть дисбаланс классов, зададим веса.
Обучим модель в составе пайплайна:
model = Pipeline(steps=[
("scaler", StandardScaler()),
("clf", LogisticRegression(max_iter=1000, class_weight="balanced"))
])
model.fit(X_train, y_train)
StandardScaler нормализует числовые признаки, что улучшает сходимость линейных моделей.
Оценка качества модели:
y_pred = model.predict(X_test)
print(classification_report(y_test, y_pred))
Отчёт показывает
precision,
recall и
F1-меру для каждого класса. На малых данных, метрики приведены исключительно в демонстрационных целях.
Пример оценки новой транзакции:
tx = pd.DataFrame([{
"amount": 3200,
"hour": 2,
"is_foreign": 1,
"transactions_last_24h": 18
}])
risk = model.predict_proba(tx)[0][1]
print("Вероятность мошенничества:", round(risk, 2))Модель возвращает вероятность
fraud, которую можно использовать для принятия решения.
🔥 В настоящих системах такие модели работают в режиме реального времени: вероятность риска влияет на блокировку операции, запрос дополнительной аутентификации или передачу транзакции на ручную проверку.
👉 Java Ready | #практика