Проект по обнаружению мошеннических операций с кредитными картами с использованием машинного обучения.
EDA.ipynb- разведочный анализ данныхbaseline1.ipynb- базовые модели и экспериментыhyperparam_tuning.ipynb- тонкая настройка гиперпараметров с Optuna (не дала результатов)improvements.ipynb- улучшения моделей
Цель: Предсказать мошеннические операции с кредитными картами в режиме реального времени.
Таргет: Class (0 - легитимная операция, 1 - мошенническая)
Данные: 284,807 транзакций, из них 492 мошеннических (0.17%)
Фичи:
V1-V28- анонимизированные PCA признакиTime- время в секундах от первой транзакцииAmount- сумма транзакции
Основная метрика: AUPRC (Precision-Recall AUC) из-за сильного дисбаланса классов
- Экстремальный дисбаланс - соотношение классов 578:1
- Amount имеет сильно скошенное распределение
- Time требует циклического преобразования из-за суточных паттернов
- Выбросы присутствуют в большинстве признаков
- Низкая мультиколлинеарность - VIF в основном <5
log_amount- логарифмирование суммы для нормализации распределенияcos_time- косинусное преобразование времени для учета суточной цикличности- Удалены исходные
TimeиAmount
- Сильные предикторы: V4, V11, V14, V17 (высокая корреляция с таргетом)
- Слабые предикторы: V8, V13, V15, V22, V23, V25
- Временные паттерны: мошеннические операции имеют неравномерное распределение по времени
Изначально, по бейзлайну наилучший результат показывал RandomForest, однако я бы не стал ее использовать при решении реальной задачи, т.к. нет scale_pos_weight, early_stopping, хуже выявляет нелинейные зависимости, в отличии от бустинговых моделей, да и то же время инференса на бОльших данных будет больше.
XGBoost (топ-5):
- V14 (0.128)
- V4 (0.095)
- V17 (0.079)
- V10 (0.069)
- V12 (0.067)
Random Forest (топ-5):
- V17 (0.145)
- V14 (0.132)
- V12 (0.098)
- V10 (0.085)
- V16 (0.072)
Вывод по baseline: XGBoost показал наилучшие результаты по всем метрикам, особенно по precision (94.1%), что критично для фрод-детекшена.
- Feature selection по XGBoost importance - удаление признаков с importance < 0.01
- Feature selection по SHAP importance - удаление признаков с SHAP < 0.3
- Clipping выбросов по IQR - для топ-5 признаков
- Методы балансировки (SMOTE, ADASYN, RandomUnderSampling)
| Метод | Features | AUPRC | F1-Score | Результат |
|---|---|---|---|---|
| Baseline XGBoost | 30 | 0.8803 | 0.8392 | Лучший |
| XGB_Reduced | 25 | 0.8781 | 0.8347 | -0.2% |
| SHAP_Reduced | 26 | 0.8791 | 0.8380 | -0.1% |
| Clipped_IQR | 30 | 0.8756 | 0.8296 | -0.5% |
| SMOTE | 30 | 0.8623 | 0.8124 | -2.0% |
| ADASYN | 30 | 0.8589 | 0.8087 | -2.4% |
- Удаление признаков ухудшает качество - даже слабые признаки содержат полезную информацию
- Удаление выбросов снижает качество - выбросы содержат паттерны мошенничества, поэтому обрезание выбросов по IQR ухудшает целевую метрику
- Методы оверсемплинга ухудшают результаты - создают искусственные слишком шумные данные
- ** XGBoost + class_weight оптимален** - проще в поддержке и показывает лучшее качество
- Лучшее качество дал Class Weight, я связываю это со спецификой метода. Функция потерь дополнительно учитывает коэффициент дисбаланса между классами, то есть штраф за ошибку на минорном классе намного больше. Другие методы саязаны с изменением данных, что плохо сказывается на качестве, мы не знаем изначальной сути признаков, которые были получены с помощью PCA.
Тюнинг гиперпараметров не дал результатов, не нашелся оптимум.
- Алгоритм: TPE Sampler + Hyperband Pruner
- Валидация: 3-fold Stratified CV
- Масштаб: 300 trials, 4 часа времени
- Метрика: AUPRC = 0.8784 (без тюнинга AUPRC = 0.8803)
max_depth: 2-20learning_rate: 0.0005-0.7 (log)subsample/colsample: 0.6-1.0reg_alpha/lambda: 0-35gamma: 0-20
{ 'max_depth': 8, 'learning_rate': 0.1, 'subsample': 0.8, 'colsample_bytree': 0.8, 'reg_alpha': 10, 'reg_lambda': 15, 'min_child_weight': 5, 'gamma': 2, 'max_delta_step': 1 }