# Домашнє завдання · Наскрізний проєкт

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

Тема була про порядок дій, а не про новий прийом. Тому й завдання перевіряють порядок:
не «яка вийшла метрика», а «чи можна цьому числу вірити».

---

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

Візьми зошит із практики й доведи його до кінця ще раз, змінивши **рівно одну річ** —
**поріг рішення**.

1. Навчи фінальну модель на всій навчальній частині (це вже зроблено в зошиті).
2. Отримай ймовірності на тесті: `фінальна_модель.predict_proba(...)[:, 1]`.
3. Для порогів **0.3, 0.5, 0.7** порахуй чотири числа: скільки шахраїв пропущено,
   скільки чесних продавців потурбовано, precision і recall.
4. Склади з цього таблицю на три рядки.

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

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

---

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

У розділі 8 практики ми з'ясували, що **62 % помилок сидять у 8 % рядків** — тих, де
ціни немає. Перевір, чи можна це полагодити ознакою.

Додай до `додати_ознаки` дві нові:

- **`оголошень_у_групі`** — скільки оголошень у групі «модель + рік» (карта будується на
  `навч_X` через `groupby([...]).size()`). Здогад: у маленькій групі медіана шумна, тому
  «відхилення» там ненадійне, і модель має про це знати.
- **`вік_телефона`** — `2025 − рік`. Ознака проста й правдоподібна: шахраєві зручніше
  ховатись за старою моделлю.

Проміряй `оцінити()` тричі: без нових ознак, із першою, з обома. Потім подивись на
матрицю помилок і скажи, чи змінилась частка помилок серед рядків без ціни.

Увага: результат «жодна з двох ознак нічого не дала» — **правильна відповідь**, якщо це
те, що показали числа. Ховати невдалу спробу не можна; тема саме про це.

**Зроблено, якщо:** є три значення F1, є частка помилок серед рядків без ціни до і після,
і є висновок одним реченням — спрацювало чи ні, і чому ти так думаєш.

---

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

Проведи **власний наскрізний проєкт** на своїх даних. Не на нашій дошці — на будь-якій
таблиці, яка тобі цікава: витрати з банківської виписки, статистика ігор улюбленої
команди, оцінки в школі, будь-що з відкритих даних. Головна вимога — **ти маєш розуміти
предметну область**, бо без цього не вийде ні постановки, ні аналізу помилок.

Пройди всі кроки в тому самому порядку й запиши результат кожного:

| крок | що має бути в звіті |
|---|---|
| 1. Постановка | що передбачаємо, у який момент, кому це потрібно, ціна кожної помилки, обрана метрика — **до** будь-якого навчання |
| 2. Поділ | тест відкладено першою дією; сказано, скільки рядків і чому саме стільки |
| 3. Розвідка | тільки на навчальній частині; окремо перевірено, чи немає колонки, якої в момент прогнозу ще не існує |
| 4. Базова лінія | число дурного прогнозу |
| 5. Перша модель | проста модель у конвеєрі, крос-валідація |
| 6. Ітерації | щонайменше **три** спроби, кожна з числом до і після; щонайменше **одна невдала** |
| 7. Помилки | подивився на конкретні рядки, де модель помилилась, і назвав, що в них спільного |
| 8. Тест | один замір, один раз, наприкінці |
| 9. Висновок | чи можна це запускати і що заважає |

Якщо своїх даних немає — візьми `sklearn.datasets.fetch_openml` або будь-який відкритий
набір, який завантажується локально. Але постановку все одно пиши своїми словами: «що
передбачаємо і навіщо» має бути зрозуміло людині, яка не бачила таблиці.

**Зроблено, якщо:**

1. усі дев'ять кроків пройдено, у кожного є число або чітке рішення;
2. серед ітерацій є **щонайменше одна, яка погіршила метрику**, і вона не викинута зі звіту;
3. тест поміряно **рівно один раз**, і число з тесту не краще за крос-валідацію (а якщо
   краще — ти пояснив, чому так вийшло);
4. у звіті є речення «запускати можна / не можна, бо…» з обґрунтуванням не через метрику,
   а через задачу.

---

## Підказки

- **Не починай із моделі.** Найчастіша причина провалу третього рівня — сісти писати
  `fit` до того, як записано, що саме передбачаємо. Постановку пиши текстом, у зошиті,
  у markdown-клітинці. Вона займе десять рядків і зекономить годину.
- **Підозріло високий результат — привід шукати витік, а не радіти.** Якщо перша ж модель
  дала 0.98, майже напевно в ознаках є колонка, яка знає відповідь. У нашому проєкті такою
  була `скарг`.
- **Ітерація — це одна зміна.** Додав ознаку й одночасно замінив модель — отримав одне
  число, з якого нічого не зрозуміло. Заведи табличку «крок → що змінив → F1» від першого
  кроку.
- **Другий рівень: щоб приклеїти розмір групи**, зроби на `навч_X` карту
  `groupby(["модель", "рік"]).size()`, а потім у `додати_ознаки` зістав її з рядками
  так само, як робиться з `карта_типових_цін` — через `pd.MultiIndex.from_arrays`.
- **Не переживай через невдалі спроби.** У реальному проєкті їх приблизно половина.
  Звіт, у якому кожен крок покращує метрику, виглядає підозріло, а не переконливо.
