Усі три рівні незалежні — можна робити будь-який. Здавати одним зошитом, у якому кожна відповідь супроводжується числом або графіком, а не тільки словами.
рівень 1Рівень 1 — База
Повтори криву «глибина проти узагальнення» на своїх даних.
Візьми будь-який табличний датасет із sklearn.datasets — підійдуть
load_breast_cancer() або load_wine(). Розбий на train/test через
train_test_split(..., random_state=0), навчи DecisionTreeClassifier для
max_depth від 1 до 15 і побудуй дві криві точності на одному графіку.
Зроблено, якщо:
- на графіку видно точку, після якої тестова крива розвертається вниз або виходить на плато;
- у тексті названо оптимальну глибину і виписано розрив train − test у цій точці та при max_depth=None;
- одним реченням пояснено, чому навчальна крива не може спадати.
рівень 2Рівень 2 — Плюс
Порівняй два способи гальмувати дерево: до росту й після.
- Побудуй криву тестової точності від
min_samples_leaf(значення 1, 2, 5, 10, 20, 50). - Отримай список кандидатів
ccp_alphaвикликомдерево.cost_complexity_pruning_path(X_навч, y_навч)і побудуй криву тестової точності відccp_alpha. - Для найкращого
ccp_alphaнамалюй обрізане дерево черезplot_treeі порівняй кількість листків із необрізаним.
Зроблено, якщо:
- обидві криві побудовані, на кожній позначено максимум;
- у таблиці зведено три числа для трьох моделей (необрізане дерево, найкращий min_samples_leaf,
найкращий ccp_alpha): тестова точність, кількість листків, розрив train − test;
- сформульовано висновок, який спосіб дав кращу точність на однаковій кількості листків,
і чому попереднє обрізання може «недобачити» сильний розріз.
рівень 3Рівень 3 — Виклик
Напиши власне дерево з нуля й доведи, що воно збігається з бібліотечним.
Реалізуй функцію виростити(X, y, глибина), яка:
- рахує безлад вузла через Джині;
- викликає найкращий_розріз із практики;
- зупиняється при досягненні max_depth, при чистому вузлі або при нульовому прирості;
- повертає вкладену структуру (словник із ключами ознака, поріг, ліво, право)
або листок із міткою більшості.
Далі напиши спрогнозувати(дерево, X) і зістав свої прогнози з
DecisionTreeClassifier(max_depth=3, random_state=0) на тих самих даних.
Зроблено, якщо:
- у зошиті проходить перевірка
assert np.array_equal(наші_прогнози, прогнози_sklearn) на всіх 200 навчальних обʼєктах;
- окремою клітинкою виведено список порогів твого дерева поруч зі
sklearn_дерево.tree_.threshold і показано, що вони збігаються з точністю до 10⁻⁶;
- описано, у якому місці твоя реалізація відрізняється від бібліотечної за складністю
(підказка: подивись, скільки разів ти перераховуєш ентропію для одного й того самого вузла).
Підказки
- Рівень 1. Якщо тестова крива не розвертається взагалі — у датасеті замало шуму.
Спробуй зменшити навчальну вибірку (
train_size=0.2) або навмисно перевернути 10% міток. - Рівень 2.
cost_complexity_pruning_pathповертає обʼєкт із полямиccp_alphasтаimpurities. Останнє значенняccp_alphasзавжди відповідає дереву-пеньку — його зазвичай відкидають. - Рівень 3. Рекурсія природно записується так: спочатку перевір усі умови зупинки й поверни листок, і тільки потім, якщо жодна не спрацювала, ріж і виклич себе двічі. Найчастіша помилка — забути умову «поріг не розділив жодного обʼєкта» і піти в нескінченну рекурсію.
- Для порівняння структур зручно обходити
sklearn_дерево.tree_полямиchildren_left,children_right,feature,threshold: значення-2вfeatureозначає листок.