Домашнє завдання

Дерева рішень

Усі три рівні незалежні — можна робити будь-який. Здавати одним зошитом, у якому кожна відповідь супроводжується числом або графіком, а не тільки словами.


рівень 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 — Плюс

Порівняй два способи гальмувати дерево: до росту й після.

  1. Побудуй криву тестової точності від min_samples_leaf (значення 1, 2, 5, 10, 20, 50).
  2. Отримай список кандидатів ccp_alpha викликом дерево.cost_complexity_pruning_path(X_навч, y_навч) і побудуй криву тестової точності від ccp_alpha.
  3. Для найкращого 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⁻⁶; - описано, у якому місці твоя реалізація відрізняється від бібліотечної за складністю (підказка: подивись, скільки разів ти перераховуєш ентропію для одного й того самого вузла).


Підказки