Одна думка на всі три рівні: число без розкиду — це не результат. Скрізь, де ти
звітуєш метрику, звітуй і .std().
рівень 1Рівень 1 — База
Візьми будь-який набір із sklearn.datasets (load_wine, load_breast_cancer, load_digits)
і будь-який класифікатор.
- Порахуй
cross_val_scoreзK = 3, 5, 10і випиши для кожного середнє та.std(). - Для $K = 5$ прожени крос-валідацію з пʼятьма різними
random_stateуKFold(shuffle=True, random_state=...). - Порівняй: наскільки середнє гуляє від зміни
random_state?
Зроблено, якщо: є таблиця «K → середнє ± σ» з трьох рядків і окремий список із пʼяти
CV-оцінок для різних random_state. І ти назвав(ла) числом, який діапазон оцінок дає та
сама модель на тих самих даних просто від зміни перемішування.
рівень 2Рівень 2 — Плюс
У практиці ми ловили залежність рядків через групи. Тепер найпідступніший її різновид — час.
- Згенеруй часовий ряд зі 160 точок із помітною автокореляцією: кожна наступна точка — це попередня, помножена на 0.9, плюс невеликий шум.
- Побудуй просту модель прогнозу (наприклад, «наступне значення = середнє трьох
попередніх») і поміряй її якість трьома способами: звичайним
KFold,TimeSeriesSplitі на справжньому майбутньому — останніх 20 точках, які ти не чіпав(ла) взагалі. - Повтори з автокореляцією 0.0 (чистий білий шум).
Зроблено, якщо: є таблиця з шести чисел (три способи × два рівні автокореляції), і по
ній видно, що при сильній автокореляції звичайний KFold дає помітно оптимістичну оцінку,
TimeSeriesSplit — близьку до правди, а при нульовій автокореляції обидві схеми
збігаються. Поясни одним реченням, чому витік зникає разом із залежністю в даних.
рівень 3Рівень 3 — Виклик
Виміряй оптимізм від вибору — те, про що розділ 10 лекції.
- Візьми задачу, де кандидати насправді однаково хороші: кожен кандидат — це базова модель плюс рівно одна випадкова ознака-шум, не пов'язана з ціллю.
- Для кількості кандидатів $m$ від 1 до 30 порахуй три величини:
- проста CV: найкраща CV-оцінка серед $m$ кандидатів;
- справжня якість: якість цього переможця на незалежній вибірці з 1000 обʼєктів;
- вкладена CV:
cross_val_score(GridSearchCV(...), X, y, cv=зовнішній_KFold). - Усередни все по 20 незалежних наборах даних, щоб криві не тремтіли.
Зроблено, якщо: на одному графіку три криві, і по них видно, що зі зростанням $m$ крива «проста CV» невпинно повзе вгору, «справжня якість» стоїть на місці, а «вкладена CV» не дрейфує. І ти написав(ла), чому саме сталість, а не точність до відсотка, робить вкладену CV чесною.
Підказки
- Рівень 1: якщо
.std()виявився крихітним — швидше за все, задача надто легка й усі фолди дають майже 1.0. Візьми складніші дані або зменш вибірку: цікаве починається там, де модель помиляється. - Рівень 2: щоб зробити «схожі» записи одного пацієнта, згенеруй пацієнту вектор-профіль, а кожен його запис — це профіль плюс маленький шум. Тоді звичайна CV покаже майже ідеал: модель просто впізнає профіль, який уже бачила в навчанні.
- Рівень 3: мінімум із $m$ зашумлених чисел у середньому менший за їхнє справжнє значення — це чиста статистика. Тому оптимізм росте саме з $m$, а не з якості кандидатів.
- І скрізь: усе, що навчається на даних (масштабування, відбір ознак, балансування), має
бути кроком
Pipeline, а не препроцесингом. Інакше ти поміряєш не те, що думаєш.