Головна ідея теми в одному реченні: класифікатор помиляється двома різними способами, і ці способи майже ніколи не рівноцінні — тому звітують парою чисел на конкретному порозі, а не одним відсотком.
рівень 1Рівень 1 — База
Візьми load_breast_cancer зі sklearn.datasets, навчи логістичну регресію
й повтори розбір із практики на реальних даних:
- Отримай оцінки моделі через
predict_proba(...)[:, 1]. - Побудуй матрицю плутанини власною функцією (не
confusion_matrix) для порогів 0,3, 0,5 і 0,7. - Для кожного порогу порахуй precision, recall і F1 своїми формулами.
- Звір усі числа з
classification_report.
Зроблено, якщо: у зошиті є таблиця з трьох рядків (по одному на поріг) із
колонками TP / FP / FN / TN / precision / recall / F1, і є перевірка
assert np.allclose(наші, бібліотечні), яка проходить.
рівень 2Рівень 2 — Плюс
Візьми задачу, у якій дорожча протилежна помилка, ніж у медичному скринінгу, — наприклад, спам-фільтр: лист, помилково відправлений у спам (FP), болючіший за рекламу у вхідних (FN).
- Знайди поріг за вимогою «precision не нижче 0,99».
- Знайди поріг за максимумом F0.5.
- Знайди поріг за максимумом F2 (це вимога протилежної задачі).
- Побудуй один графік із трьома вертикальними лініями на трьох порогах поверх кривих precision і recall.
Зроблено, якщо: ти назвав усі три пороги числами, показав для кожного recall, який доводиться прийняти, і написав два-три речення про те, який поріг узяв би для спам-фільтра, а який — для онкоскринінгу, і чому.
рівень 3Рівень 3 — Виклик
Реалізуй з нуля три способи усереднення метрик для багатокласової задачі: макро, мікро і зважене.
- Візьми три класи різного розміру (наприклад, 500 / 300 / 50 об'єктів).
- Порахуй precision, recall і F1 окремо для кожного класу за схемою «один проти решти» — власною функцією.
- Зведи їх у три підсумкові числа: макро (просте середнє), мікро (спершу скласти TP, FP, FN по всіх класах, потім порахувати метрику) і зважене.
- Звір усі три з
f1_score(..., average='macro' / 'micro' / 'weighted'). - Зроби модель, яка повністю ігнорує найменший клас (жодного прогнозу цього класу), і подивись, як поводяться три усереднення.
Зроблено, якщо: усі три числа збіглися з бібліотечними до 10⁻⁸, і ти показав конкретним прикладом, наскільки просідає кожне усереднення, коли цілий клас ігнорується. Окремо поясни, чому мікро-F1 у задачі з однією міткою на об'єкт математично дорівнює accuracy.
Підказки
- «Один проти решти» для класу c означає буквально:
y_true_binary = (y == c)іy_pred_binary = (pred == c). Далі працює та сама функція, що й для двох класів, — переписувати нічого не треба. - Щоб знайти поріг під вимогу, не потрібен оптимізатор. Побудуй масив порогів
через
np.linspace, порахуй метрику для кожного, а далі — маскаprecision >= 0.99і вибір потрібного краю. Пам'ятай, у який бік монотонний recall. - Якщо мікро-F1 у тебе не дорівнює accuracy — перевір, чи не рахуєш ти «негативи» двічі. У задачі з однією міткою на об'єкт кожна помилка одночасно є FP для одного класу і FN для іншого.