Тема концептуальна, тож і завдання не про «навчити модель». Вони про те, щоб побачити межу власними числами: де правила ще працюють, де вже ні і де модель починає вигадувати.
Домен той самий, що в лекції та практиці — дошка оголошень про продаж вживаних
телефонів. Датасет міняти не треба: усе робиться на тому, що згенеровано
в practice.ipynb.
рівень 1Рівень 1 — База
Побудуй власний набір правил і поміряй, чого він вартий.
- Візьми
adsіз практики (або згенеруй такий самий у новому зошиті). - Напиши чотири правила фільтрації шахрайства. Два вже є в практиці
(
price_ratio < 0.60,account_age_days < 7) — придумай ще два своїх, наприклад комбіновані: «ціна нижча за 85 % і акаунту менше 30 днів». - Для всіх 16 поєднань правил (увімкнене / вимкнене) порахуй на тестовій
вибірці три числа: спіймано, хибних тривог, пропущено. Функція
count_hitsіз практики вже це вміє. - Склади результат у
DataFrameі відсортуй за кількістю спійманих.
Зроблено, якщо: є таблиця з 16 рядками, і ти назвав словами два поєднання — те, що ловить найбільше шахраїв, і те, що дає найменше хибних тривог. Поясни одним реченням, чому це різні поєднання, а не одне.
рівень 2Рівень 2 — Плюс
Покажи, що модель старіє, а правила старіють ще швидше.
- Розділи оголошення на «старі» й «нові» не випадково, а за
account_age_days: уяви, що це два різні місяці роботи дошки. - Зміни поведінку шахраїв у «новому» місяці: підніми їм знижку з 0.35–0.95 до 0.70–0.98 (шахраї перестали демпінгувати) і вік акаунта — з 0–60 до 0–120 днів (навчилися чекати).
- Візьми набір правил і модель, навчені на «старому» місяці, і застосуй обидва до «нового». Порахуй три числа для кожного.
- Перенавчи модель на «новому» місяці й порахуй ще раз.
Зроблено, якщо: є таблиця з трьома рядками — правила, стара модель, перенавчена модель — і всі три числа для кожного. Назви, на скільки впав показник «спіймано» у правил і у старої моделі, і поясни, чому перенавчання допомогло, а правила довелося б переписувати руками.
рівень 3Рівень 3 — Виклик
Змоделюй упереджені дані й покажи числами, як упередження переходить у модель.
- Додай до
adsколонкуcityіз двома значеннями, наприклад"A"і"B", розподіленими приблизно порівну. Простеж, щоб справжня частка шахрайства в обох містах була однаковою — це принципово. - Тепер зіпсуй мітки так, як їх псує реальний процес: уяви, що модератор
перевіряв місто
Bуважніше. Для містаAзалиш у колонціis_fraudлише половину справжніх шахраїв (решту познач нулями — їх «не помітили»), для містаBзалиш усі. - Навчи модель на ознаках
price_ratio,account_age_daysіcity(місто закодуйpd.get_dummiesабоOneHotEncoder). - Порахуй окремо для кожного міста: яку частку оголошень модель позначає і яка частка серед них шахрайська за справжніми мітками, а не за зіпсованими.
Зроблено, якщо: є дві пари чисел (по одній на місто), і з них видно, що
модель позначає місто B частіше за місто A, хоча справжня частка шахрайства
однакова. Назви, яке саме число довело б цю різницю сторонньому спостерігачеві,
і поясни в двох реченнях, чому модель тут не помилилась — вона точно
відтворила те, що було в мітках.
Підказки
- Рівень 1. Для перебору 16 поєднань зручний
itertools.product([False, True], repeat=4). Правила зберігай як список булевих масок, тоді фільтр — цеnp.logical_or.reduce([m for m, on in zip(masks, combo) if on]). Якщо ввімкнених правил нема, фільтр має бути порожнім — обробіть цей випадок окремо, інакшеreduceвпаде на порожньому списку. - Рівень 2. Найпростіше згенерувати два датасети окремо тим самим кодом,
змінивши тільки два діапазони. Не забудь:
price_ratioтреба перерахувати всередині кожного місяця, бо медіанна ціна теж могла зсунутись. - Рівень 3. Зберігай дві колонки міток:
is_fraud_true(справжня) іis_fraud_labeled(зіпсована, та, що бачить модель). Навчай на другій, оцінюй за першою — саме ця пара й робить ефект видимим.