Як машинне навчання допомагає виявляти шахрайство: приклад Aviva на £230 млн

Як Aviva використовує машинне навчання для виявлення шахрайства та економії понад 230 мільйонів фунтів

Страхове шахрайство — це не дрібниці: щороку компанії по всьому світу втрачають мільярди фунтів через підроблені або перебільшені страхові випадки. Британський страховик Aviva використав машинне навчання і зберіг понад £230 млн за кілька років, виявляючи шахрайські заявки до того, як гроші покидали компанію. У цьому туторіалі ти дізнаєшся, як відтворити подібну систему виявлення шахрайства на реальних даних — від завантаження датасету до побудови та оцінки моделі. Потрібно близько 3-4 годин і базове знання Python.

🛠️ Що знадобиться

  • Python 3.11+ — основна мова для побудови моделі; безкоштовний, завантаж з python.org
  • Google Colab або Jupyter Notebook — середовище для запуску коду; Colab безкоштовний і не потребує інсталяції
  • Бібліотеки: pandas, scikit-learn, imbalanced-learn, matplotlib, xgboost — всі безкоштовні, встановлюються однією командою pip
  • Датасет страхового шахрайства з Kaggle — публічний датасет “Insurance Fraud Detection Dataset”; безкоштовний після реєстрації на kaggle.com
  • Kaggle API або браузерне завантаження — щоб отримати CSV-файл з даними

📋 Покрокова інструкція

Крок 1: Завантаження даних та підготовка середовища

Відкрий Google Colab (colab.research.google.com) і створи новий ноутбук через меню “File → New Notebook”. У першій клітинці введи команду встановлення бібліотек: !pip install xgboost imbalanced-learn і натисни Shift+Enter для виконання. Далі зайди на kaggle.com, знайди датасет “Auto Insurance Fraud Detection” і завантаж файл insurance_claims.csv (близько 15 000 рядків). У Colab натисни іконку папки зліва → “Upload to session storage” → обери завантажений CSV. Переконайся, що файл з’явився у файловій системі — він має бути видимий у боковій панелі.

Крок 2: Завантаження та первинний аналіз даних

У новій клітинці завантаж дані і одразу перевір їх якість. Скопіюй цей блок коду: import pandas as pd; df = pd.read_csv('insurance_claims.csv'); print(df.shape); print(df['fraud_reported'].value_counts()). Після виконання ти побачиш, що датасет сильно незбалансований — шахрайських заявок лише ~24%, решта чесні. Це класична проблема fraud detection: якщо просто навчити модель “говорити завжди ні” — вона матиме 76% точності, але нічого не виявить. Саме тут Aviva використовував методи балансування — ти зробиш те саме на кроці 4.

Крок 3: Очищення та підготовка фіч

Страхові дані завжди містять “сміття”: символ “?” замість пропущених значень, дати у вигляді рядків, категорійні поля. Замини символи запитання на NaN командою df.replace('?', pd.NA, inplace=True), потім видали колонки з більш ніж 40% пропусків: df.dropna(thresh=int(0.6*len(df)), axis=1, inplace=True). Після цього перетвори категорійні змінні на числові за допомогою one-hot encoding: виділи всі стовпці типу object через df = pd.get_dummies(df, drop_first=True). Важливий підводний камінь: колонка policy_number та insured_zip — це ідентифікатори, вони не несуть предиктивної цінності, тому видали їх вручну перед get_dummies командою df.drop(['policy_number','insured_zip'], axis=1, inplace=True).

Крок 4: Балансування класів та розбивка на train/test

Саме тут відтворюється логіка Aviva — модель має вміти знаходити рідкісні шахрайські заявки серед тисяч чесних. Використай метод SMOTE (Synthetic Minority Over-sampling Technique) з бібліотеки imbalanced-learn. Спочатку відділи цільову змінну: X = df.drop('fraud_reported_Y', axis=1); y = df['fraud_reported_Y']. Потім розбий дані: from sklearn.model_selection import train_test_split; X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y). Тепер застосуй SMOTE тільки до тренувальної вибірки: from imblearn.over_sampling import SMOTE; sm = SMOTE(random_state=42); X_train_res, y_train_res = sm.fit_resample(X_train, y_train). Ніколи не застосовуй SMOTE до тестової вибірки — це призведе до штучно завищених результатів і зробить оцінку моделі безглуздою.

Крок 5: Навчання моделі XGBoost та оцінка результатів

XGBoost — це саме той клас алгоритмів (gradient boosting), який використовують провідні страховики, включно з Aviva. Навчи модель: from xgboost import XGBClassifier; model = XGBClassifier(n_estimators=200, max_depth=5, learning_rate=0.05, random_state=42, eval_metric='logloss'); model.fit(X_train_res, y_train_res). Після навчання отримай метрики: from sklearn.metrics import classification_report, roc_auc_score; y_pred = model.predict(X_test); print(classification_report(y_test, y_pred)); print('ROC-AUC:', roc_auc_score(y_test, model.predict_proba(X_test)[:,1])). Фінальний результат, який ти маєш побачити: ROC-AUC від 0.82 до 0.88, Recall для класу шахрайства — від 0.70 і вище. Щоб зрозуміти, які ознаки найважливіші для моделі (як у реальній системі Aviva), побудуй графік важливості фіч: import matplotlib.pyplot as plt; xgb.plot_importance(model, max_num_features=15); plt.show().

⚠️ Типові помилки та як їх уникнути

  • Застосування SMOTE до всього датасету перед розбивкою — це “витік даних” (data leakage), модель бачить синтетичні копії тестових прикладів під час навчання і показує нереалістично хороші результати; завжди роби split спочатку, SMOTE — тільки потім
  • Оцінка моделі лише за Accuracy — при незбалансованих класах модель може ігнорувати шахрайство і все одно мати 76% точності; використовуй F1-score для мінорного класу та ROC-AUC як основні метрики
  • Залишення колонок-ідентифікаторів у датасеті — policy_number або ID клієнта не мають предиктивної сили, але модель може “перевчитися” на них; видаляй будь-які унікальні ідентифікатори перед навчанням
  • Ігнорування порогу класифікації — за замовчуванням XGBoost використовує поріг 0.5, але для fraud detection вигідніше знизити його до 0.3-0.35, щоб ловити більше шахраїв ціною деякої кількості хибних спрацьовувань; регулюй через model.predict_proba(X_test)[:,1] > 0.35

💡 Поради для кращого результату

По-перше, поєднуй SMOTE з undersampling більшості: from imblearn.combine import SMOTETomek; smt = SMOTETomek(random_state=42) — це дає кращий баланс, ніж чистий SMOTE, і модель рідше перевчається. По-друге, додай крос-валідацію зі стратифікацією: використовуй StratifiedKFold(n_splits=5) замість простого train/test split — так оцінка буде стабільнішою на малих датасетах. По-третє, інтерпретуй модель за допомогою SHAP-значень (бібліотека shap): це покаже не просто “яка ознака важлива”, а “чому саме цей запис є підозрілим” — саме так аналітики Aviva пояснювали рішення регуляторам. По-четверте, налаштуй гіперпараметр scale_pos_weight у XGBoost рівним відношенню кількості чесних до шахрайських заявок — це вбудований спосіб балансування без SMOTE, і іноді він спрацьовує краще.

❓ Часті запитання (FAQ)

1. Яку саме суму зберегла Aviva і як вони цього досягли?
Aviva публічно заявила про виявлення шахрайства на суму понад £230 млн протягом 2021-2023 років завдяки впровадженню ML-системи аналізу заявок у реальному часі. Їхня система аналізує понад 60 ознак кожної заявки та автоматично позначає підозрілі для ручної перевірки спеціалістами.

2. Чому XGBoost, а не нейронні мережі?
Для табличних страхових даних gradient boosting стабільно перевершує нейронні мережі — це підтверджено десятками змагань на Kaggle та дослідженнями 2024-2025 років. Крім того, XGBoost легше інтерпретувати, що критично важливо для страхових регуляторів, які вимагають пояснення кожного відмовленого позову.

3. Чи можна застосувати цей підхід для виявлення банківського шахрайства?
Так, логіка ідентична: незбалансовані класи, табличні дані, потреба в інтерпретованості. Для транзакційного шахрайства додатково використовують ознаки часових рядів — швидкість транзакцій, відхилення від типового патерну клієнта. Датасет “Credit Card Fraud Detection” на Kaggle — чудова точка старту.

4. Скільки даних потрібно для реальної системи?
Мінімально — 5 000-10 000 підтверджених шахрайських випадків для навчання надійної моделі. Aviva має мільйони заявок щороку, що дозволяє навчати моделі значно точніші. На менших обсягах використовуй агресивніший SMOTE та ансамблі з Random Forest.

5. Як модель оновлюється при появі нових схем шахрайства?
Це ключовий виклик — шахраї адаптуються. У production-системах модель перенавчають щоквартально на нових підтверджених випадках, а також використовують anomaly detection (Isolation Forest, Autoencoder) паралельно з класифікатором для виявлення незнайомих патернів.

🏁 Підсумок

Ти пройшов повний цикл побудови системи виявлення шахрайства: від завантаження сирих даних через очищення, балансування класів методом SMOTE до навчання XGBoost-моделі з ROC-AUC понад 0.85 та інтерпретації результатів — саме таку архітектуру використовують реальні страховики на кшталт Aviva для захисту сотень мільйонів фунтів стерлінгів.

Починай просто: відкрий Google Colab прямо зараз, завантаж датасет з Kaggle і запусти перші три кроки — на це піде не більше 30 хвилин. Коли модель запрацює, спробуй замінити XGBoost на LightGBM і порівняй метрики — це наступний природний крок у вивченні fraud detection на практиці.

РОЗСИЛКА

📬 Щотижневий AI-дайджест

Найкращі статті про ШІ та автоматизацію — без спаму, лише суть

Без спаму · Відписатись будь-коли

Telegram