Machine Learning
КНЕУ::ІІТЕ
2023-05-01
Дерева рішень
Дерева рішень
Приклад: Просте дерево рішень, що класифікує дефолт кредитної картки
Давайте подивимося, як працює дерево
Давайте подивимося, як працює дерево (за замовчуванням: Так vs. Ні).
Перший розділ дылить баланс у $1800 доларів США.
Другий розділ ділить баланс на $1972 (за умови балансу > $1800).
Третій розділ ділить дохід у $27K для баллансу від $1800 до $1972 доларів.
Ці три розділи дають нам чотири області…
Прогнози: наприклад, використовуючи найпоширеніший клас області.
Прогнози: наприклад, використовуючи найпоширеніший клас області.
Прогнози: наприклад, використовуючи найпоширеніший клас області.
Прогнози: наприклад, використовуючи найпоширеніший клас області.
Області відповідають кінцевим вузлам (або листям) дерева.
Розділові лінії графіка відповідають внутрішнім вузлам дерева.
Сегменти, що з’єднують вузли всередині дерева, є його гілками.
Тепер ви знаєте анатомію дерева рішень.
Але звідки беруться дерева — як ми навчаємо дерево?
Ми почнемо з регресійних дерев, тобто дерев, які використовуються в задачах регресії.
Як ми бачили, завдання вирощування дерева складається з двох основних кроків:
\[ \begin{align} \hat{y}_{R_j} = \frac{1}{n_j} \sum_{i\in R_j} y \end{align} \]
Ми вибираємо області для мінімізації RSS серед усіх \(J\) областей, тобто,
\[ \begin{align} \sum_{j=1}^{J} \left( y_i - \hat{y}_{R_j} \right)^2 \end{align} \]
Проблема: Вивчення кожного можливого розділу обчислювально неможливо.
Рішення: алгоритм зверху вниз, жадібний під назвою рекурсивне двійкове розбиття
Нагадування Дерева регресії вибирають поділ, який мінімізує RSS.
Щоб знайти цей поділ, нам потрібно
Шукаючи в кожному з наших предиктор \(\color{#6A5ACD}{j}\) і всіх їхніх cutoff \(\color{#e64173}{s}\),
ми вибираємо комбінацію, яка мінімізує RSS.
Приклад Розглянемо набір даних
i | pred. | y | x1 | x2 |
---|---|---|---|---|
1 | 0 | 0 | 1 | 4 |
2 | 0 | 8 | 3 | 2 |
3 | 0 | 6 | 5 | 6 |
Лише з тьома спотсереженнями кожна змінна має лише два фактичних розбиття
Одне можливие розбиття: x1 на 2, що дає (1) x1 < 2 vs. (2) xx1 ≥ 2
i | pred. | y | x1 | x2 |
---|---|---|---|---|
1 | 0 | 0 | 1 | 4 |
2 | 7 | 8 | 3 | 2 |
3 | 7 | 6 | 5 | 6 |
Одне можливие розбиття: x1 на 2, що дає (1) x1 < 2 vs. (2) x1 ≥ 2
i | pred. | y | x1 | x2 |
---|---|---|---|---|
1 | 0 | 0 | 1 | 4 |
2 | 7 | 8 | 3 | 2 |
3 | 7 | 6 | 5 | 6 |
Таке розбиття дає RSS 02 + 12 + (-1)2 = 2.
Note1 Розщеплення x1 на 2 дає ті самі результати, що й 1,5, 2,5 — будь-що в (1, 3).
Note2 Дерева часто ростуть, доки вони не досягнуть певної кількості спостережень у листі.
Альтернативне поділ: x1 на 4, що дає (1) x1 < 4 vs. (2) x1 ≥ 4
i | pred. | y | x1 | x2 |
---|---|---|---|---|
1 | 4 | 0 | 1 | 4 |
2 | 4 | 8 | 3 | 2 |
3 | 6 | 6 | 5 | 6 |
Таке розбиття дає RSS (-4)2 + 42 + 02 = 32.
Раныше: Розбиття x1 на 2 дало RSS = 2. (Набагато краще)
Інший поділ: x2 на 3, що дає (1) x1 < 3 vs. (2) x1 ≥ 3
i | pred. | y | x1 | x2 |
---|---|---|---|---|
1 | 3 | 0 | 1 | 4 |
2 | 8 | 8 | 3 | 2 |
3 | 3 | 6 | 5 | 6 |
Таке розбиття дає RSS (-3)2 + 02 + 32 = 18.
Остаточний поділ: x2 на 5, що дає (1) x1 < 5 vs. (2) x1 ≥ 5
i | pred. | y | x1 | x2 |
---|---|---|---|---|
1 | 4 | 0 | 1 | 4 |
2 | 4 | 8 | 3 | 2 |
3 | 6 | 6 | 5 | 6 |
Таке розбиття дає RSS (-4)2 + 42 + 02 = 32.
Серед наших чотирьох можливих поділів (по дві змінні з двома поділами)
Розбиття x1 на 2 генерує найнижчий RSS.
Примітка: Категориальні предиктори працюють точно так само.
Ми хочемо спробувати усі можливі комбінації категорій.
Ex: Для чотирирівневого категоріального предикатора (рівні: A, B, C, D)
нам потрібно буде спробувати 7 можливих розділень.
Коли ми робимо наш спліт, ми продовжуємо розділяти,
умовно на області з наших попередніх поділів.
Отже, якщо наше перше розбиття створює R1 і R2, то наше наступне розбиття
шукає в просторі предикторів лише в R1 або R2.
Дерево продовжує рости, доки воно не досягне певного порогу,
наприклад, щонайбільше 5 спостережень на кожному листі.
Можна мати занадто багато поділів
Q Чому?
A “Більше розділень” означає
Q Отже, що ми можемо зробити?
A Обрізайте свої дерева!
Обрізання дозволяє нам “зтиснути” наші дерева до їх «найкращого вигляду».
Ідея: Деякі області можуть збільшити варіацію більше, ніж зменшити зміщення.
Видаляючи ці області, ми виграємо в тестовій MSE.
Кандидати на скорочення: області, які не дуже сильно зменшують RSS.
Оновлена стратегія: Вирощуйте великі дерева \(T_0\), а потім обрізайте \(T_0\) до оптимального піддерева.
Оновлена проблема: Розгляд усіх можливих піддерев може коштувати дорого.
Cost-complexity pruning1 пропонує рішення.
Так само, як ми робили з ласо, cost-complexity pruning змушує дерево платити ціну (штраф), за складнысть.
Складність тут визначається як кількість областей \(|T|\).
Зокрема, cost-complexity pruning додає штраф \(\alpha |T|\) до RSS, тобто,
\[ \begin{align} \sum_{m=1}^{|T|} \sum_{i:x\in R_m} \left( y_i - \hat{y}_{R_m} \right)^2 + \alpha |T| \end{align} \]
Для будь-якого значення \(\alpha (\ge 0)\) ми отримуємо піддерево \(T\subset T_0\).
\(\alpha = 0\) генерує \(T_0\), але зі збільшенням \(\alpha\) ми починаємо зрізати дерево.
Ми вибираємо \(\alpha\) через перехресну перевірку.
Класифікація за допомогою дерев дуже схожа на регресію.
Дерева регресії
Дерева класифікації
Додатковий нюанс для дерева класифікації: ми зазвичай дбаємо про пропорції класів у листках, а не лише про остаточний прогноз.
Нехай \(\hat{p}_{mk}\) позначає частку спостережень у класі \(k\) і область \(m\).
Індекс Джіні говорить нам про «чистоту» області
\[ \begin{align} G = \sum_{k=1}^{K} \hat{p}_{mk} \left( 1 - \hat{p}_{mk} \right) \end{align} \] якщо область дуже однорідна, то індекс Джині буде малим.
Однорідні області легше передбачити.
Зменшення індексу Джині дає змогу отримати більш однорідні регіони
∴ Ми хочемо мінімізувати індекс Джіні.
Джині як функція ‘чистоти’
Нехай \(\hat{p}_{mk}\) позначає частку спостережень у класі \(k\) і регіоні \(m\).
Ентропія також вимірює “чистоту” вузла/листка
\[ \begin{align} D = - \sum_{k=1}^{K} \hat{p}_{mk} \log \left( \hat{p}_{mk} \right) \end{align} \]
Ентропія також мінімізується, коли значення \(\hat{p}_{mk}\) близькі до 0 і 1.
Ентропія як функція ‘чистоти’
Q Чому ми використовуємо індекс Джіні або ентропію (vs. частота помилок)?
A Частота помилок недостатньо чутлива, щоб виростити хороші дерева.
Індекс Джіні та ентропія говорять нам про композицію листа.
Приклад Розглянемо два різних листка в трирівневій класифікації.
Листок 1
Листок 2
Індекс Джіні та ентропія говорять нам про розподіл.
Щоб навчити дерева рішень у R, ми можемо використовувати parsnip
, який спирається на rpart
.
У parsnip
ми використовуємо функцію decision_tree()
.
Модель decision_tree()
(з механізмом rpart
) потребує чотирьох аргументів:
mode
: "regression"
або "classification"
cost_complexity
: штраф за складністьtree_depth
: макс. глибина дерева (макс. кількість розділень у «гілці»)min_n
: мін. к-ть спостережень для вузла, який потрібно розділити# CV split
set.seed(12345)
default_cv = default_df %>% vfold_cv(v = 5)
# Дерево рішень
default_tree = decision_tree(
mode = "classification",
cost_complexity = tune(),
tree_depth = tune(),
min_n = 10 # Довільний вибір «10»
) %>% set_engine("rpart")
# Визначити рецепт
default_recipe = recipe(default ~ ., data = default_df)
# Визначте робочий процес
default_flow = workflow() %>%
add_model(default_tree) %>% add_recipe(default_recipe)
# Налаштування!
default_cv_fit = default_flow %>% tune_grid(
default_cv,
grid = expand_grid(
cost_complexity = seq(0, 0.15, by = 0.01),
tree_depth = c(1, 2, 5, 10),
),
metrics = metric_set(accuracy, roc_auc)
)
Точність, складність і глибина
ROC AUC, складність і глибина
Щоб побудувати дерево, вибране CV…
1. Fit обрана/найкраща модель.
2. Витягіть підігнану модель, наприклад,, за допомогою extract_fit_parsnip
.
Старий/застарілий спосіб: pull_workflow_fit()
3. Графік дерева, наприклад,, за допомогою rpart.plot()
з rpart.plot
.
Попереднє дерево має вартість складності 0,03 (і максимальну глибину 5).
Ми можемо порівняти це «найкраще» дерево з менш обрізаним/оштрафованим деревом
cost_complexity = 0,005
tree_depth = 5
Що, якщо ми залишимо складність вартості постійною, але збільшимо макс. глибина?
cost_complexity = 0,005
tree_depth = 10
(збільшено з 5
)
Що, якщо ми збільшимо константу складності?
cost_complexity = 0,1
(збільшено з 0,005
)tree_depth = 10
Q Як дерева порівнюються з лінійними моделями?
A Це залежить від того, наскільки лінійна істині значення.
Лінійна межа: дерева намагаються відтворити лінію.
Нелінійна межа: дерева легко повторюють нелінійну межу.
Як і в будь-якому іншому методі, дерева рішень мають компроміси.
Сильні сторони
+ Легко пояснюється/інтерпретується
+ Включає кілька графічних параметрів
+ Дзеркало прийняття рішень людиною?
+ Працють з категор та числ. змін1.
Слабкі сторони
- Інші методи можуть бути кращі
- Боротьба з лінійністю
- Може бути дуже “не робастими”
Не робасті: Невеликі зміни даних можуть спричинити значні зміни в нашому дереві.
ihor.miroshnychenko@kneu.ua