Усі три рівні робляться на одному наборі даних. Візьми будь-який із двох:
дошку оголошень із практики (клітинка 1 зошита) або вбудований
sklearn.datasets.load_breast_cancer(). Головне — зафіксувати
random_state скрізь, де він є, інакше твої числа не повторяться навіть у тебе.
рівень 1Рівень 1 — База
Підбери один гіперпараметр однієї моделі так, як це зроблено в лекції: сітка по
одній осі, StratifiedKFold на 5 фолдів, тестова частина не чіпається до кінця.
Модель бери не kNN — наприклад, DecisionTreeClassifier із max_depth від 1 до 15
або LogisticRegression із C по логарифмічній шкалі [0.001, 0.01, 0.1, 1, 10, 100].
Побудуй три криві на одному графіку: точність на навчальній вибірці, оцінка крос-валідації, точність на відкладеній частині.
Зроблено, якщо: на графіку видно, що максимум кривої «навчання» стоїть не там, де максимум крос-валідації, і в підписі названо обидва значення гіперпараметра й обидві точності числами. Якщо для твоєї моделі криві збіглися — напиши, чому (підказка: подивись, чи керує твій гіперпараметр складністю моделі взагалі).
рівень 2Рівень 2 — Плюс
Порівняй сітку й випадковий пошук на однаковому бюджеті.
- Склади сітку з чотирьох гіперпараметрів своєї моделі — так, щоб вийшло
не менше 200 комбінацій. Запусти
GridSearchCVі заміряй час. - Запусти
RandomizedSearchCVпо тих самих діапазонах ізn_iter, рівним чверті кількості комбінацій. Заміряй час. - Порівняй три речі: найкращу оцінку, кількість навчань і час.
- Повтори крок 2 із п'ятьма різними
random_stateі подивись на розкид найкращої оцінки випадкового пошуку.
Зроблено, якщо: є таблиця з рядками «сітка» й «випадковий пошук ×5» і колонками «найкраща оцінка», «навчань», «секунд», а в тексті сказано, чи потрапив хоч один із п'яти запусків випадкового пошуку в оцінку сітки — і чому це не питання везіння, а питання того, скільки ручок у твоїй сітці справді впливають на результат.
рівень 3Рівень 3 — Виклик
Виміряй оптимістичне зміщення на своїх даних так, щоб число не можна було списати на одне вдале розбиття.
- Зроби 15 різних розбиттів
train_test_splitіз різнимиrandom_state. - Для кожного: підбери гіперпараметр крос-валідацією на навчальній частині, запам'ятай найкращу CV-оцінку й точність цієї ж моделі на відкладеній частині.
- Окремо порахуй те саме для гіперпараметра, зафіксованого заздалегідь
(візьми значення за замовчуванням
scikit-learn). - Порівняй середні розриви «оцінка мінус правда» для обраного й для фіксованого.
- Тепер збільш сітку вдесятеро — додай ще дві ручки — і повтори пункти 1–4.
Зроблено, якщо: є два числа чистої ціни вибору (для малої й великої сітки) і сформульовано, у який бік вона змінилась. Якщо зміна виявилась меншою, ніж ти очікував, — поясни це через кореляцію між кандидатами, а не через «експеримент не вдався».
Підказки
- Логарифмічна шкала. Для
C,alpha,gamma,learning_rateрівномірна сітка марна: між 0.001 і 0.01 стільки ж змісту, скільки між 1 і 10. Бериnp.logspace(-3, 2, 6), а у випадковому пошуку —scipy.stats.loguniform. - Масштабування всередині конвеєра. Якщо твоя модель чутлива до масштабу
(kNN, SVM, логістична регресія зі штрафом), клади
StandardScalerуmake_pipelineразом із моделлю. Порахувавши середнє й відхилення один раз на всій таблиці, ти пустиш у навчання інформацію про валідаційні рядки. - Скільки це триватиме. Перед запуском порахуй
комбінації × фолдий помнож на час одного навчання, який заміряв на одній моделі. Число, більше за кілька хвилин, — привід зменшити сітку, а не привід чекати. - Розкид важливіший за середнє. Якщо два кандидати відрізняються менше, ніж на стандартне відхилення по фолдах, вони не відрізняються.