# Домашнє завдання · Порівняння моделей

> Лекція: [lecture.html](lecture.html) · Практика: [practice.ipynb](practice.ipynb) · Тест: [quiz.html](quiz.html)

Усі три рівні працюють на дошці оголошень із практики — функція `зробити_дошку` в першій
клітинці зошита. Копіюй її до себе й починай.

Одне правило наскрізь: **усе, що ти порівнюєш, має бути поміряне на тому самому поділі,
тією самою метрикою й з тим самим бюджетом на налаштування**. Якщо в звіті два числа
здобуті по-різному, вони не порівнюються, і завдання не зараховане.

---

## 🟢 Рівень 1 — База

Візьми **регресійну** задачу з розділу 7 практики (передбачити ціну чесних оголошень)
і побудуй для неї повну таблицю порівняння за зразком розділу 3:

* базова лінія `DummyRegressor(strategy="mean")`;
* лінійна регресія, kNN, дерево, ліс, бустинг;
* один `KFold(5, shuffle=True, random_state=42)` на всіх;
* дві метрики в таблиці: MAE в гривнях і R².

Потім додай до таблиці колонку `у скільки разів краще за базову`: MAE базової лінії
поділити на MAE моделі.

**Зроблено, якщо:** у таблиці шість рядків, у кожного число в новій колонці, і ти
письмово відповів на два питання: (1) яка модель дає найбільший виграш над базовою
лінією і в скільки разів, (2) чому лінійна регресія тут помітно гірша за дерева —
одне-два речення про форму залежності ціни від року.

---

## 🟡 Рівень 2 — Плюс

Перевір на власних числах твердження з §05 лекції: **розкид від поділу буває більший
за різницю між моделями**.

1. Візьми дві моделі, які в практиці стоять поруч у рейтингу — наприклад, дерево
   й логістичну регресію на задачі про шахрайство.
2. Прожени кожну через `StratifiedKFold(5, shuffle=True, random_state=s)` для
   `s = 0, 1, 2, …, 9`. Це десять різних поділів тих самих даних.
3. Для кожної моделі порахуй мінімум, максимум і розмах F1 по цих десяти запусках.
4. Побудуй графік: по горизонталі номер поділу, дві лінії — по одній на модель.

**Зроблено, якщо:** ти назвав розмах кожної моделі числом, порівняв його з різницею
між їхніми середніми F1 і відповів: чи існує пара поділів, на яких «гірша» модель
виглядає кращою за «кращу»? Якщо існує — випиши номери цих поділів і обидва числа.

---

## 🔴 Рівень 3 — Виклик

Побудуй **криву «бюджет проти рейтингу»** — покажи, як кількість спроб налаштування
змінює те, хто перемагає.

1. Напиши функцію `рейтинг_за_бюджету(бюджет)`, яка для кожної з шести моделей
   класифікації бере **рівно `бюджет` кандидатів** зі своєї сітки (перші `бюджет`
   значень), підбирає найкращого вкладеною крос-валідацією й повертає таблицю
   з F1 і місцем у рейтингу.
2. Прожени її для `бюджет = 1, 2, 4, 8`.
3. Намалюй графік: по горизонталі бюджет (логарифмічна шкала), по вертикалі місце
   в рейтингу (1 угорі, 6 унизу), шість ліній — по одній на модель.
4. Окремо поміряй сумарний час на кожен бюджет.

**Зроблено, якщо:** на графіку видно щонайменше одне перетинання ліній — тобто модель,
яка міняє місце зі зростанням бюджету, — і ти письмово пояснив: (1) яка модель
найчутливіша до бюджету і чому саме вона, (2) починаючи з якого бюджету рейтинг
перестає мінятись, (3) скільки часу коштує кожне подвоєння бюджету.

---

## Підказки

* **Рівень 1.** `cross_validate` приймає список метрик: `scoring=["neg_mean_absolute_error", "r2"]`.
  Знак не забудь: MAE повертається зі знаком мінус, бо sklearn скрізь максимізує.
* **Рівень 2.** Щоб побачити «перевертання», порівнюй не середні, а окремі запуски:
  найгірший результат сильної моделі проти найкращого результату слабкої.
* **Рівень 3.** Місце в рейтингу зручно рахувати через `Series.rank(ascending=False)`.
  Щоб графік читався, підпиши кожну лінію біля правого краю, а не легендою збоку.
* Якщо якийсь прогін триває довше за хвилину — зменш `n_estimators` у лісі й бустингу.
  Абсолютні числа зміняться, порядок моделей майже ні, а чекати не доведеться.
