У грі «двадцять питань» один гравець загадує предмет, а другий має його вгадати, ставлячи запитання, на які можна відповісти лише «так» або «ні». Хороший гравець ніколи не питає навмання. Він починає з питання, яке ділить світ навпіл: «це жива істота?». Кожна відповідь відрізає половину варіантів, і за двадцять кроків можна дійти до мільйона предметів.
Дерево рішень — це та сама гра, тільки питання ставить алгоритм, а загаданий предмет — відповідь для конкретного обʼєкта. Модель складається з вузлів рішення (питання про одну ознаку), гілок (відповіді «так» і «ні») та листків (готовий прогноз). Навчити дерево — це підібрати самі питання і їхній порядок так, щоб дійти до впевненої відповіді за якнайменше кроків.
Уся лекція побудована навколо однієї задачі. Банк хоче знати, чи залишиться клієнт із ним на наступний рік. Про кожного клієнта відомі лише два числа: стаж — скільки місяців він уже обслуговується, і витрати — скільки в середньому тисяч гривень проходить через його картку щомісяця. Двовимірна задача зручна тим, що модель можна намалювати цілком: усе, що дерево «думає», видно на площині.
ІдеяМодель, яку можна прочитати вголос
Почнімо з кінця — подивімось на готову модель. Кожне питання дерева має вигляд «ознака ≤ поріг». Питання про стаж проводить на площині вертикальну лінію, питання про витрати — горизонтальну. Кожна лінія розрізає прямокутник, у якому ми зараз перебуваємо, на два менші прямокутники. Після всіх розрізів площина розпадається на набір прямокутних клітин, і в кожній клітині дерево дає одну й ту саму відповідь.
Таку модель називають кусково-сталою: «стала» — бо всередині однієї плитки відповідь не змінюється зовсім, «кусково» — бо плиток багато й на межі між ними відповідь стрибає. Пряма лінія в лінійній регресії змінює прогноз потроху з кожним кроком ознаки; дерево тримає прогноз незмінним, а потім різко перемикає його. Порухай повзунок глибини й подивись, як плиток стає більше:
Як дерево ріже площину
Глибина — це максимальна кількість питань поспіль. Пунктир — справжня межа, за якою генерувались дані.
Зверни увагу на дві речі. По-перше, при глибині 0 модель вироджується в константу — вона завжди називає більший клас незалежно від того, що їй показали. Це нижня межа, з якою порівнюють будь-яке дерево: у нашій навчальній вибірці 103 клієнти лишились і 97 пішли, тож відповідь «лишиться» всім підряд дає 51.5% влучань на навчальних даних. Будь-яке дерево, що не побило це число, не навчилось нічого. По-друге, при великій глибині зʼявляються крихітні плитки навколо окремих точок: дерево виділяє під один-єдиний обʼєкт власну кімнату. Це вже перенавчання, і до нього ми ще повернемось окремо.
Що насправді лежить у листку
Листок — не просто напис «лишиться». Усередині записано, скільки навчальних обʼєктів у нього потрапило і як вони розподілились між класами. Наприклад, один із листків нашого дерева зберігає пару «54 лишились, 4 пішли». З цієї пари беруть дві речі:
- мітку більшості — той клас, якого в листку більше. Тут це «лишиться», бо 54 більше за 4. Саме її повертає звичайний прогноз;
- частку більшого класу — 54 / 58 = 0.931. Її повертають як оцінку
ймовірності: «дерево на 93% упевнене, що цей клієнт лишиться». У
scikit-learnце різниця міжpredictіpredict_proba.
Звідси й насиченість плиток на малюнку вище: чим ближча частка до 0 або до 1, тим яскравіша плитка. Бліда плитка — це листок, у якому класи майже порівну, і дерево там чесно зізнається, що не знає відповіді. Ось чому дерево вміє не лише відповідати, а й показувати, наскільки воно впевнене, — і робить це без жодної додаткової формули.
І ще одне, що корисно засвоїти одразу: дерево нічого не памʼятає про самі обʼєкти. Після навчання від 200 клієнтів лишається тільки набір питань і кілька пар чисел у листках. Тому прогноз коштує кілька порівнянь, а вся модель уміщається на аркуші паперу.
ГеометріяЧому розрізи перпендикулярні осям
Питання дерева завжди стосується однієї ознаки: «витрати ≤ 4.7?». Воно ніколи не має вигляду «0.3·стаж + 0.7·витрати ≤ 5». Причина суто обчислювальна. Щоб перебрати всі пороги за однією ознакою, достатньо відсортувати обʼєкти й пройти список — це десятки операцій. Щоб перебрати всі можливі нахилені площини, треба шукати в неперервному багатовимірному просторі напрямків, а це вже окрема задача оптимізації всередині кожного вузла.
Наслідок такий: межа рішень дерева завжди складається з відрізків, паралельних осям. Якщо справжня межа в даних теж «прямокутна» — дерево влучає в неї майже точно. А якщо справжня межа діагональна, дерево змушене будувати сходинки: багато дрібних розрізів, які наближають пряму ламаною лінією.
Ціна сходинок — не абстракція. Кожна сходинка зʼїдає один вузол, а вузол ділить дані навпіл. Отже після трьох сходинок у кожній комірці лишається ввосьмеро менше обʼєктів, ніж було, і наступні рішення дерево ухвалює з жменьки точок — тобто з шуму. Дерево витрачає свій бюджет складності не на структуру задачі, а на апроксимацію нахилу.
У наступному інтерактиві дані ті самі — просто повернуті. Логістична регресія на них працювала б однаково добре під будь-яким кутом. Дерево — ні:
Та сама задача, повернута на кут
Справжня межа — одна пряма (пунктир). Повертаємо дані й дивимось, що робить дерево фіксованої глибини 3.
Заміряно на цих самих даних, дерево глибини 3: при куті 0° воно дає 94.6% на тесті, а стеля — 94.8%, тобто дерево практично дістає ідеал. При 25° — уже 88.6%, при 45° — 88.5%. Стеля при цьому не змінюється взагалі: пряма під будь-яким кутом розділяє ті самі точки так само добре, бо повернулись і точки, і межа разом. Отже втрачені 6.1 відсоткового пункта — це не складність задачі, а невдалий вибір системи координат.
x ≤ t не
змінюється, якщо ознаку помножити на 100 або виміряти в інших одиницях — поріг просто
перерахується. Помножили витрати на тисячу, щоб рахувати в гривнях замість тисяч гривень, —
дерево вийде буквально те саме, лише в порогах стоятиме 4730 замість 4.73. Те саме з будь-яким
монотонним перетворенням, тобто таким, що не міняє порядок обʼєктів: логарифм, корінь,
переведення в проценти. Тому деревам, на відміну від градієнтних методів і
kNN, стандартизація ознак не потрібна взагалі. Це одна з
причин, чому їх так люблять на «брудних» табличних даних.ЧистотаЕнтропія: міра безладу
Тепер головне питання: як алгоритм обирає, де саме різати? Потрібна числова відповідь на питання «наскільки в цьому прямокутнику намішано класів». Набір, де всі обʼєкти одного класу, називають чистим; набір, де класи порівну, — максимально брудним.
Класична міра безладу прийшла з теорії інформації. Клод Шеннон 1948 року шукав, як виміряти кількість інформації в повідомленні, і отримав величину, яку назвав ентропією. У формулі стоїть логарифм, тож спершу розберімось із ним — без нього далі не буде зрозуміло нічого.
log₂8 і читають «логарифм вісім за основою два». Оскільки 2·2·2 = 8, відповідь
дорівнює 3. Так само log₂1 = 0 (двійка в нульовому степені — це одиниця),
log₂2 = 1, log₂16 = 4.
Побутовою мовою: логарифм за основою 2 — це кількість поділів навпіл. Скільки разів треба поділити 8 навпіл, щоб дійти до одиниці? Три рази: 8 → 4 → 2 → 1. Ось тобі
log₂8 = 3. Це та сама гра у двадцять питань: кожне питання ділить світ навпіл,
і логарифм каже, скільки таких питань потрібно.
Для чисел, менших за одиницю, логарифм відʼємний: щоб отримати одну восьму, двійку треба піднести в мінус третій степінь, тому
log₂0.125 = −3. Це знадобиться
за секунду. І остання дрібниця: логарифм не мусить бути цілим — log₂3 ≈ 1.585,
бо трійка лежить між двійкою (log 1) і четвіркою (log 2).Тепер сама формула:
Словами, без жодного символу: ентропія — це середня кількість питань «так / ні», яку доведеться поставити, щоб дізнатись клас навмання взятого обʼєкта з набору.
Що означає кожен символ:
- H — сама ентропія, число, яке ми рахуємо. Вимірюється в бітах, тобто в питаннях «так / ні»;
- i — номер класу. У нас класів два, тож i пробігає значення «піде» і «лишиться»;
- pi — частка i-го класу у вузлі. Якщо з 200 клієнтів лишились 103, то частка класу «лишиться» дорівнює 103 / 200 = 0.515;
- Σ (грецька велика «сигма») — знак суми: «додай те, що стоїть праворуч, для кожного значення i». Тут це означає «порахуй доданок для «піде», порахуй для «лишиться» й склади їх»;
- − спереду. Частка завжди від 0 до 1, а логарифм такого числа відʼємний, тож сума виходить відʼємною. Мінус повертає H у додатні числа.
Навіщо вона тут: дереву треба одним числом сказати, наскільки в цьому вузлі намішано класів, — щоб потім порівняти «було» і «стало» після розрізу. Ентропія й дає це одне число.
Шеннон шукав міру, яка має одну властивість: інформація двох незалежних питань мусить додаватись. Якщо одне питання відрізає половину варіантів, а друге — половину від решти, разом вони мають коштувати рівно два біти, а не «півтора» й не «чотири».
Але кількість варіантів при цьому не додається, а множиться: дві половинки
від восьми — це 8 → 4 → 2, тобто ділення на 2 і ще раз на 2. Потрібна функція, яка
перетворює множення на додавання. Такою функцією є рівно одна річ у математиці —
логарифм: log₂(a·b) = log₂a + log₂b. Ось і вся причина. Логарифм тут не
прикраса й не традиція, а єдиний спосіб, щоб біти складались як біти.
Величина −log₂p — це «ціна» однієї конкретної відповіді: рідкісна подія
(мале p) коштує багато бітів, часта — мало. Але нас цікавить не одна відповідь, а
середня по всьому вузлу. Середнє рахують так: кожну ціну множать на те, як часто
вона трапляється, і складають. Частота — це і є pi. Тому у
формулі стоїть сума pi · (−log₂pi).
Для двох класів формула спрощується: якщо частка першого класу дорівнює p, то другого — рівно (1 − p), бо третього нема куди подітись. Отже вся ентропія залежить від одного числа:
Ентропія і Джині як функції складу
Тягни повзунок: змінюється частка класу «лишиться» у вибірці. Дивись на обидві криві.
Порахуймо руками
Візьмімо вузол із 40 клієнтів і проженімо три склади. Тобі знадобляться лише два
значення логарифма: log₂1 = 0 і log₂0.5 = −1.
- Усі 40 лишились. Тоді p = 40 / 40 = 1 для класу «лишиться» і 0 для «піде».
Доданок нульового класу пропускаємо (його частка нульова, і він нічого не додає), а
перший дає
−1 · log₂1 = −1 · 0 = 0. Ентропія 0 біт: невизначеності немає взагалі, питання ставити нема про що. Це готовий листок. - 20 лишились, 20 пішли. Обидві частки дорівнюють 0.5. Рахуємо:
−0.5·(−1) − 0.5·(−1) = 0.5 + 0.5 = 1. Ентропія 1 біт — рівно одне питання «так / ні» відділяє нас від відповіді, і це максимум для двох класів. Саме такий вузол алгоритм найбільше хоче розрізати. - 30 лишились, 10 пішли. Частки 0.75 і 0.25. Тут потрібні
log₂0.75 ≈ −0.415іlog₂0.25 = −2(бо чверть — це два поділи навпіл). Рахуємо:−0.75·(−0.415) − 0.25·(−2) = 0.311 + 0.5 = 0.811. Ентропія 0.811 біт — уже менше за максимум, але далеко не нуль.
Помічаєш? Ентропія не питає, скільки обʼєктів у вузлі. Вона питає тільки, в якій пропорції вони поділені. Вузол із 4 обʼєктів «3 і 1» і вузол із 400 «300 і 100» мають ту саму ентропію 0.811 біт. Розмір вузла врахується окремо, у наступному розділі — і це буде важливо.
Для більш ніж двох класів усе те саме, лише доданків більше. Для трьох рівних класів
максимум становить log₂3 ≈ 1.585, для восьми рівних — рівно 3 біти: щоб
вгадати один із восьми варіантів, потрібно три питання «так / ні».
Вибір розрізуПриріст інформації
Ентропія міряє безлад в одному наборі. Але розріз створює два набори, і треба якось порівняти «було» з «стало». Тут є тонкість: після розрізу в нас дві ентропії, і просто додати їх не можна — вузол зі ста обʼєктів важить більше за вузол із трьох.
Розвʼязок — зважене середнє, де вага кожного нащадка дорівнює частці обʼєктів, які до нього потрапили. Різниця між ентропією до розрізу і зваженою ентропією після нього називається приростом інформації (information gain):
Словами: скільки бітів безладу зникло завдяки цьому питанню.
Символи: Hбатько — ентропія вузла до розрізу; N — скільки обʼєктів у ньому було; NL і HL — розмір і ентропія вузла, куди пішли ті, хто відповів «так» (індекс L від left, лівий нащадок); NR і HR — те саме для тих, хто відповів «ні» (right, правий нащадок). Дроби NL/N і NR/N — це частки обʼєктів, що пішли ліворуч і праворуч; вони завжди додаються до одиниці.
Навіщо: це та єдина оцінка, за якою алгоритм порівнює між собою всі можливі питання й обирає одне.
Уяви розріз, який відрізає одну-єдину точку. Вона одна, отже її вузол ідеально чистий: H = 0. Якби ми брали просте середнє двох ентропій, такий розріз здався б чудовим — половина доданків обнулилась! Зважування ставить усе на місце: вузол з однієї точки має вагу 1/N і майже не впливає на результат.
Зважена ентропія нащадків не може перевищити ентропію батька — це наслідок опуклості логарифма. У найгіршому випадку розріз нічого не змінює (обидва нащадки мають той самий склад, що й батько), і тоді IG = 0. Тому нульовий приріст — це сигнал «краще не різати».
Приріст залежить не від точного значення порога, а лише від того, як він розділяє
відсортовані обʼєкти. Тому кандидатів рівно на один менше, ніж різних значень
ознаки: беруть середини між сусідніми значеннями. Для n обʼєктів і m ознак це
m·(n−1) варіантів — на наших 200 клієнтах і двох ознаках виходить 398, —
і всі вони перебираються повним перебором, без жодної хитрості. (Літеру m тут узято
навмисне: p у цій лекції вже зайняте часткою класу.)
Порахуймо приріст руками — на справжньому розрізі
Візьмімо корінь нашого дерева: усі 200 навчальних клієнтів, з яких 103 лишились і 97 пішли. І перевірмо один конкретний розріз — «витрати ≤ 7.76 тис. грн». Усе, що потрібно, — чотири рядки арифметики.
Частка класу «лишиться» дорівнює 103 / 200 = 0.515, класу «піде» — 0.485.
Логарифми: log₂0.515 ≈ −0.957, log₂0.485 ≈ −1.044.
Майже рівно один біт — класи в корені поділені майже навпіл, безлад максимальний.
Клієнтів із витратами до 7.76 виявилось 157: із них 63 лишились, 94 пішли. Решта 43 — у вузлі «ні»: 40 лишились, 3 пішли.
Вузол «ні» став майже чистим: у ньому майже самі ті, хто лишається. Вузол «так» майже не покращився — там усе ще намішано.
Ваги — це частки обʼєктів: 157/200 = 0.785 і 43/200 = 0.215.
Тобто це питання прибрало приблизно шосту частину невизначеності. Звучить скромно — але саме це найкраще, що можна витиснути з одного питання на цих даних. Найкращий розріз за другою ознакою, стажем, дає лише 0.119 біт, тому коренем стане питання про витрати.
Візьми олівець і перевір крок 3: якщо замість ваг 0.785 і 0.215 узяти по половині, вийде (0.972 + 0.365) / 2 = 0.669, і «приріст» роздувся б до 0.331 — удвічі більший за справжній. Ось ціна незваженого середнього, про яку йшлося вище.
Наступний інтерактив показує цей перебір наживо. Угорі — розріз, який ти рухаєш повзунком, унизу — приріст інформації для всіх можливих порогів одразу. Алгоритм обере вершину чорної кривої:
Перебір усіх порогів
Нижній графік — три криві: ентропія вузла «так», вузла «ні» і приріст інформації. Ромб — оптимум.
АльтернативаКритерій Джині
Ентропія — не єдина міра безладу. На практиці частіше використовують
індекс Джині, і за замовчуванням у scikit-learn стоїть саме він:
Символи ті самі, що в ентропії: pi — частка i-го класу, Σ — знак суми, а 2 означає «помножити саме на себе». Логарифмів тут немає взагалі — тільки множення й віднімання. Перевір на знайомому складі: якщо класи порівну, p = 0.5, то Gini = 1 − 0.25 − 0.25 = 0.5; якщо вузол чистий, p = 1, то Gini = 1 − 1 = 0; для складу «30 і 10» (p = 0.75) виходить 1 − 0.5625 − 0.0625 = 0.375.
У Джині є гарна ймовірнісна інтерпретація. Витягни з вузла випадковий обʼєкт, подивись на його клас, поверни назад. Витягни другий. Джині — це ймовірність, що класи двох витягнутих обʼєктів не збігуться. У чистому вузлі така подія неможлива, звідси нуль; при рівних класах вона трапляється в половині випадків, звідси 0.5.
Обидві криві на інтерактиві 3 мають однакову форму: нуль на краях, максимум у центрі, горб угору. Різниця в масштабі (ентропія доходить до 1, Джині до 0.5) і в тому, що ентропія трохи «гостріше» карає майже-чисті вузли. Практичні наслідки:
| критерій | формула | максимум | особливість |
|---|---|---|---|
| Ентропія | −Σ p log₂ p | 1 біт | потребує логарифмів — трохи повільніша |
| Джині | 1 − Σ p² | 0.5 | тільки множення, за замовчуванням у sklearn |
| Помилка | 1 − max p | 0.5 | без вигину — погано розрізняє розрізи |
Третій рядок пояснює, чому дерева не оптимізують безпосередньо точність. Подивись на сіру криву на інтерактиві 3: це два прямі відрізки, що сходяться гострим кутом посередині. Пряма ділянка означає, що на ній величина змінюється рівномірно, — а тоді розріз, який перекинув десять обʼєктів із одного вузла в інший, і розріз, який перекинув їх зовсім інакше, дадуть однакове число. Дві криві з вигином — Джині й ентропія — такі випадки розрізняють.
Показати це найлегше на цифрах. Уяви вузол із 800 клієнтів, у якому рівно 400 пішли й 400 лишились, і два різні розрізи. Перший ділить його на дві рівні половини, у кожній із яких перевага три до одного. Другий відрізає невелику групу, зате ідеально чисту:
| розріз | вузол «так» піде / лишиться | вузол «ні» піде / лишиться | помилка | Джині | ентропія |
|---|---|---|---|---|---|
| батько | 400 / 400 разом | 0.500 | 0.500 | 1.000 | |
| А | 300 / 100 (400 шт.) | 100 / 300 (400 шт.) | 0.250 | 0.375 | 0.811 |
| Б | 200 / 400 (600 шт.) | 200 / 0 (200 шт.) | 0.250 | 0.333 | 0.689 |
За помилкою більшості обидва розрізи однакові: 0.250 проти 0.250. Тобто міра «частка помилок» узагалі не бачить між ними різниці й обере той, що трапиться першим. А різниця величезна: розріз Б віддав нам двісті клієнтів, про яких усе відомо остаточно, — далі цю гілку можна не чіпати. І Джині, і ентропія це бачать: 0.333 проти 0.375 і 0.689 проти 0.811. Обидві криві з вигином віддають перевагу розрізу Б.
Ось за що дерева платять логарифмами й квадратами замість простого підрахунку помилок: за здатність відрізнити «стало трохи рівномірно краще» від «зʼявився шматок остаточної правди». Другого простий лічильник помилок не помічає.
Коли Джині й ентропія розходяться, а коли ні
Коротка відповідь: майже завжди вони обирають ту саму ознаку й дуже часто — різний поріг. Наші дані показують це буквально. Обидві міри в корені хочуть різати за витратами. Але:
| розріз у корені | приріст за ентропією | приріст за Джині |
|---|---|---|
| витрати ≤ 7.76 | 0.158 ← найкращий | 0.094 |
| витрати ≤ 4.73 | 0.151 | 0.101 ← найкращий |
Дві міри поставили ті самі два розрізи в протилежному порядку — і подивись, на скільки: за ентропією різниця 0.158 проти 0.151, тобто менш ніж 5%. Кандидати практично рівноцінні, і мікроскопічна різниця в мірі безладу вирішує все. Це та сама нестабільність, про яку йтиметься в розділі 11, тільки викликана не зміною даних, а зміною формули.
Наслідок видно на дереві: за Джині корінь — «витрати ≤ 4.73», за ентропією — «витрати ≤ 7.76», і далі дерева розходяться. На малій глибині це коштує помітно: дерево глибини 1 за Джині дає 75.1% на тесті, за ентропією — 65.8%. Але вже з глибини 5 обидва виходять на 84–85%, а розбіжність між ними падає з 30% площини до 6–8%. Наступний інтерактив дає проганяти це самому.
gini, який стоїть
у scikit-learn за замовчуванням, і не витрачай на цей вибір багато часу.
Дивись на числа вище правильно: коли дерево ще замале й недонавчене (глибина 1 і 2),
різниця величезна — 9.3 відсоткового пункта, — але це різниця між двома однаково поганими
моделями. Щойно дерево дістає достатньо глибини, обидва критерії приходять до майже
однакової якості. Тобто велика розбіжність між Джині й ентропією — це не привід вибирати
критерій, а ознака того, що дерево ще не доросло. Глибина, мінімальний розмір листка
й обрізання важать тут на порядок більше.
Ентропію варто спробувати, коли класи сильно незбалансовані: подивись на криві в інтерактиві 3 біля самого краю — рожева спадає до нуля помітно повільніше за бірюзову. Отже за ентропією вузол «майже чистий» усе ще коштує помітних бітів, і розріз, який дочищає рідкісний клас, має шанс виграти.
scikit-learn за
замовчуванням. Тому поріг кореня 7.76 на інтерактиві 4 і 4.73 на інтерактиві 6 — не
помилка й не різні дані, а рівно та розбіжність критеріїв, про яку йшлося вище.Джині проти ентропії на тих самих даних
Два дерева тієї самої глибини, навчені на однаковій вибірці різними критеріями.
АлгоритмЯк дерево навчається крок за кроком
Тепер усі складники є, і можна зібрати алгоритм навчання. Дві сімʼї алгоритмів зʼявились майже одночасно й незалежно одна від одної. ID3 Росса Квінлана (1986) увів приріст інформації як критерій вибору розрізу — і саме звідси в темі взялась ентропія. CART команди Лео Бреймана (1984) робить те саме, але з двома відмінностями: розрізи завжди двійкові, а безлад міряють Джині.
Це важливо не як історична довідка. DecisionTreeClassifier зі
scikit-learn — оптимізований CART, а не ID3, тому в цій лекції
ми описуємо саме двійкові розрізи «ознака ≤ поріг».
| алгоритм | рік | розрізи | міра безладу | обрізання |
|---|---|---|---|---|
| ID3 (Квінлан) | 1986 | по одній гілці на кожне значення ознаки | приріст інформації | немає |
| C4.5 (Квінлан) | 1993 | двійкові для чисел, багатогілкові для категорій | gain ratio | є |
| CART (Брейман та ін.) | 1984 | завжди двійкові | Джині (регресія: дисперсія) | cost-complexity |
Різниця між ID3 і CART важливіша, ніж здається. ID3 умів працювати тільки з
категоріальними ознаками — на кшталт «місто клієнта» — і на кожне значення
робив окрему гілку. Ознака «місто» з тридцятьма значеннями розколювала вузол одразу на
тридцять частин, у кожній із яких лишалась жменька обʼєктів. Такі гілки виглядають чистими
просто тому, що вони крихітні, і ID3 систематично закохувався в ознаки з великою кількістю
значень. C4.5 полагодив це нормуванням (gain ratio), а CART — тим, що взагалі
не робить більш ніж двох гілок. Ту саму хворобу ми ще зустрінемо наприкінці лекції, коли
говоритимемо про важливість ознак.
Сам порядок дій у всіх трьох однаковий:
- Почни з кореня. У корені лежить уся навчальна вибірка. Порахуй її ентропію (або Джині) — це відправна точка.
- Перебери кандидатів. Для кожної ознаки відсортуй обʼєкти й розглянь усі пороги між сусідніми значеннями. Для кожного порога порахуй зважену ентропію двох нащадків і приріст інформації.
- Візьми найкращий розріз. Той, у якого приріст максимальний. Створи вузол рішення з цією ознакою й цим порогом. Ніяких «а що як інший розріз краще спрацює через два кроки» — вибір робиться тут і зараз.
- Розділи дані на дві частини й запусти ту саму процедуру окремо для кожної. Це рекурсія: кожен нащадок стає новим коренем для своєї підзадачі.
- Зупинись і зроби листок, коли спрацював один із критеріїв зупинки. У листку записується мітка більшості (для класифікації) або середнє значення (для регресії).
Простежмо два перші кроки на наших даних, щоб рекурсія перестала бути словом.
- Корінь. 200 клієнтів, склад 97 / 103, Джині 0.500. Алгоритм перебирає 199 порогів за стажем і 199 за витратами — разом 398 варіантів — і перемагає «витрати ≤ 4.73» з приростом 0.101.
- Ліва гілка («так», витрати не більші за 4.73). Сюди дійшло 96 клієнтів, з них пішли 69. Тепер це окрема, менша задача, і алгоритм робить із нею рівно те саме: перебирає всі пороги всередині цих 96 обʼєктів. Перемагає «стаж ≤ 17.10». Зверни увагу: ознака інша, ніж у корені, і поріг такий, якого в корені не було в переможцях, — бо склад даних тут інший.
- Права гілка («ні», витрати більші за 4.73). Тут 104 клієнти, з них лишились 76. Незалежно від того, що сталось у лівій гілці, алгоритм перебирає пороги тут і бере «стаж ≤ 9.87».
- Далі кожна з чотирьох утворених груп ділиться так само, і так доки не спрацює гальмо.
Це і є вся рекурсія: одна й та сама процедура, застосована до дедалі менших шматків даних. Ніякої «глобальної оптимізації» немає — є 200 обʼєктів, потім 96 і 104, потім 64, 32, 35, 69, і в кожному вузлі своя маленька незалежна задача.
n·log n дій) і пройти список один раз,
оновлюючи лічильники класів. Разом на рівень виходить приблизно
p·n·log n дій, а рівнів зазвичай десяток. Тому дерево на таблиці в сотню тисяч
рядків навчається за секунди — це одна з причин, чому ансамблі з сотень дерев узагалі
можливі.Ціна така: існують задачі, де перший розріз із нульовим приростом відкрив би шлях до ідеального дерева, але алгоритм його не зробить. Класичний приклад — «виключне АБО»: уяви, що клієнт лишається, коли рівно одна з двох умов виконана, а коли обидві або жодна — іде. На площині це шахівниця два на два. Будь-який одиничний розріз ділить її на дві половини, у кожній із яких класи знову порівну, — приріст рівно нуль, і жадібний критерій каже «різати нема сенсу». Хоча два розрізи поспіль розвʼязали б задачу ідеально.
СтруктураЯк виглядає готове дерево
Ту саму модель, яку ми досі бачили як плитки на площині, можна намалювати як схему. Це не інша модель — це той самий обʼєкт з іншого боку. Одна плитка на площині — це один листок на схемі; одна лінія розрізу на площині — це один вузол рішення на схемі. Корінь угорі, під ним два нащадки, під ними їхні нащадки. Кожен вузол підписаний питанням, а колірна смужка показує склад класів у ньому. Дивись, як дерево росте, коли ти дозволяєш йому ще один рівень:
Дерево як схема
Смужка під питанням — склад вузла. Число під нею — скільки навчальних обʼєктів сюди дійшло.
Те саме дерево словами
Схема гарна, але її треба вміти прочитати. Ось те саме дерево глибини 3, виписане
повністю. Відступ означає рівень; «так» веде ліворуч, «ні» — праворуч. Праворуч —
n, скільки навчальних клієнтів дійшло до вузла, і склад «піде / лишиться».
витрати ≤ 4.73? n=200 97 / 103
├─ так → стаж ≤ 17.10? n= 96 69 / 27
│ ├─ так → стаж ≤ 8.56? n= 64 55 / 9
│ │ ├─ так → листок «піде» n= 26 25 / 1
│ │ └─ ні → листок «піде» n= 38 30 / 8
│ └─ ні → витрати ≤ 2.21? n= 32 14 / 18
│ ├─ так → листок «піде» n= 15 14 / 1
│ └─ ні → листок «лишиться» n= 17 0 / 17
└─ ні → стаж ≤ 9.87? n=104 28 / 76
├─ так → витрати ≤ 7.85? n= 35 21 / 14
│ ├─ так → листок «піде» n= 20 20 / 0
│ └─ ні → листок «лишиться» n= 15 1 / 14
└─ ні → стаж ≤ 22.60? n= 69 7 / 62
├─ так → листок «лишиться» n= 58 4 / 54
└─ ні → листок «лишиться» n= 11 3 / 8
Сім вузлів рішення, вісім листків — і це вся модель. Ніяких ваг, ніяких матриць: сім питань і вісім пар чисел.
Чотири речі, які варто помітити в цьому дереві
- Листки бувають дуже різної якості. Листок «20 піде / 0 лишиться» — ідеально чистий: усі, хто витрачає багато, але з банком менш ніж десять місяців, пішли. А листок «30 піде / 8 лишиться» — каламутний: дерево там дає відповідь «піде» з упевненістю 30 / 38 = 0.789, тобто кожен пʼятий такий прогноз буде помилковим. Обидва — рівноправні листки того самого дерева.
- Одна ознака може повторюватись на шляху. Ліворуч дерево питає про витрати в корені, потім про стаж, потім знову про витрати (≤ 2.21). Це нормально: після першого розрізу залишились інші клієнти, і в них витрати грають уже іншу роль. Саме так дерево само собою знаходить взаємодії ознак, яких лінійна модель не побачить без того, щоб їх туди вписали руками.
- Не всі листки корисні. Останній розріз «стаж ≤ 22.60» ділить 69 обʼєктів на 58 і 11, і обидва нащадки кажуть те саме — «лишиться». Тобто це питання не змінює жодного прогнозу; воно лише трохи підчистило склад. Такі розрізи — перші кандидати на обрізання, до якого ми дійдемо в розділі 10.
- Ліва й права половини дерева зовсім не схожі. Ліворуч питання «стаж ≤ 17.10», праворуч — «стаж ≤ 9.87». Той самий стаж, різні пороги, бо це вже різні підзадачі. Дерево не мусить бути симетричним, і майже ніколи не буває.
Як прочитати прогноз для конкретного клієнта
Прийшов клієнт: стаж 20 місяців, витрати 6.4 тис. грн на місяць. Спускаємось:
- Витрати 6.4 більші за 4.73 → відповідь «ні», ідемо праворуч, у вузол зі 104 клієнтів.
- Стаж 20 більший за 9.87 → знову «ні», праворуч, у вузол із 69 клієнтів.
- Стаж 20 не більший за 22.60 → «так», ліворуч, у листок «58 обʼєктів: 4 піде / 54 лишиться».
- Відповідь: лишиться, з оцінкою ймовірності 54 / 58 = 0.931.
Три порівняння чисел — і готово. Це і є той самий шлях, який на площині означає прямокутник «витрати від 4.73 і вище, стаж від 9.87 до 22.60». Правило, яке отримали, можна записати одним реченням і показати кому завгодно: «якщо клієнт витрачає понад 4.73 тисячі на місяць і обслуговується від десяти до двадцяти двох місяців — він лишиться, і ми в цьому впевнені на 93%». Жодна інша сімʼя моделей не перекладається людською мовою так дослівно.
ГальмаКритерії зупинки
Якщо алгоритму не заважати, він працюватиме, доки кожен листок не стане ідеально чистим. Для будь-яких даних без повторюваних обʼєктів це завжди можливо: у найгіршому випадку дерево виділить кожному обʼєкту власний листок. Навчальна точність стане рівно 100%, а модель — марною.
Це не риторична фігура, а заміряний факт на наших даних. Ось що коштує відсутність гальм:
| дерево | листків | точність train | точність test | розрив |
|---|---|---|---|---|
| без гальм | 37 | 100.0% | 81.0% | 19.0 в. п. |
| глибина 3 | 8 | 91.0% | 86.8% | 4.2 в. п. |
| min_samples_leaf = 16 | 10 | 90.0% | 87.5% | 2.5 в. п. |
Тобто дерево, яке вивчило навчальні дані напамʼять, працює на нових клієнтах на 6.5 відсоткового пункта гірше за дерево з десятьма листками замість тридцяти семи. Гальма — не косметика, вони і є половина роботи з деревом.
Пʼять гальм і що кожне робить
| параметр | що обмежує | як діє |
|---|---|---|
| max_depth | кількість питань поспіль | найгрубіше й найзрозуміліше гальмо |
| min_samples_leaf | розмір листка | забороняє листки з двох-трьох обʼєктів |
| min_samples_split | розмір вузла для розрізу | не дає різати й без того малі вузли |
| max_leaf_nodes | загальну кількість листків | ріже тільки найприбутковіші вузли |
| min_impurity_decrease | мінімальний приріст | відсікає розрізи «ні про що» |
DecisionTreeClassifier зі scikit-learn стоїть
max_depth=None, min_samples_leaf=1,
min_samples_split=2, max_leaf_nodes=None,
min_impurity_decrease=0.0. Тобто виклик DecisionTreeClassifier()
без аргументів дає рівно перший рядок таблиці вище: дерево, що доросло до 100% на
навчальних даних. Це не помилка бібліотеки — це чесна відмова вгадувати за тебе, скільки
складності витримають твої дані. Але це означає, що дерево з коробки майже завжди
перенавчене.Яке гальмо тиснути першим
Гальма не рівноцінні, і порядок такий:
- min_samples_leaf — перше й найкорисніше. Воно говорить про дані
прямо: «не роби висновку менш ніж із N клієнтів». Це обмеження локальне —
там, де даних багато, дерево далі росте вглиб, а там, де мало, зупиняється. Саме тому
воно зазвичай обходить
max_depthза якістю. - max_depth — коли потрібна читабельність. Глибина обмежує все дерево однаково, і густі ділянки страждають разом із рідкими. Зате саме глибина вирішує, чи вміститься схема на слайд: дерево глибини 3 має щонайбільше 8 листків і читається вголос, дерево глибини 6 — до 64, і вже ні.
- min_impurity_decrease — тонке налаштування. Відсікає розрізи, які майже нічого не покращують, як-от «стаж ≤ 22.60» з попереднього розділу, після якого обидва нащадки кажуть те саме.
Правильне значення жодного з них не вгадується з голови: воно залежить від того, скільки
в тебе даних і скільки в них шуму. Його добирають перебором із
крос-валідацією — так само, як будь-який
інший гіперпараметр (тема 20). На наших 200
клієнтах перебір min_samples_leaf від 1 до 40 дав максимум при 16 — це 8%
вибірки; на іншому наборі оптимум буде іншим.
Природні зупинки, які працюють завжди
| параметр | що обмежує | як діє |
|---|---|---|
| max_depth | кількість питань поспіль | найгрубіше й найзрозуміліше гальмо |
| min_samples_leaf | розмір листка | забороняє листки з двох-трьох обʼєктів |
| min_samples_split | розмір вузла для розрізу | не дає різати й без того малі вузли |
| max_leaf_nodes | загальну кількість листків | ріже тільки найприбутковіші вузли |
| min_impurity_decrease | мінімальний приріст | відсікає розрізи «ні про що» |
Крім штучних обмежень, є дві зупинки, які спрацьовують самі й яких не можна вимкнути:
- Вузол уже чистий. Усі обʼєкти одного класу, безлад дорівнює нулю, приросту не буде за визначенням. Різати нема чого — це листок.
- Жоден розріз не дає додатного приросту. Найчастіший випадок: у вузлі лежать обʼєкти з однаковими ознаками, але різними мітками. Два клієнти зі стажем 12 місяців і витратами 5.0 тис. грн, один із яких лишився, а другий пішов, — дерево не має чим їх розрізнити, бо в даних просто немає ознаки, яка б їх відрізняла. У реальних таблицях таке трапляється постійно, і це не дефект: це та частина світу, якої в наших даних не записано. Дерево тоді робить листок і чесно ставить у ньому частку «50 на 50».
Ці дві зупинки — саме та причина, чому дерево без гальм дає 100% на навчальних даних майже завжди, а не завжди: якщо в таблиці є два однакові рядки з різними мітками, 100% недосяжні навіть теоретично.
ПасткаЧому глибокі дерева перенавчаються
Розберімо механіку перенавчання буквально по кроках. Нехай у нашому наборі клієнт із дуже великими витратами все одно пішов — просто через обставини, які в даних не записані. Для дерева це не випадковість, а факт, який треба пояснити. Воно робить розріз, потім ще один, і зрештою будує навколо цього клієнта крихітний прямокутник, у якому лежить лише він.
Тепер у цьому прямокутнику модель прогнозує «піде» з упевненістю 100%. Будь-який новий клієнт, що випадково потрапить у цю зону, отримає впевнений і, найімовірніше, помилковий прогноз. Дерево вивчило не закономірність, а шум.
Чому 100% на навчальних даних — не досягнення
Тут потрібна одна річ, без якої весь розділ висить у повітрі: у наших даних є стеля, і вона не дорівнює 100%. Клієнтів згенеровано за чітким правилом «сходинки» — воно й намальоване пунктиром на кожній фігурі, — але приблизно кожну десяту мітку перевернуто навмисно, щоб імітувати обставини, яких у таблиці немає: хтось переїхав, хтось посварився з менеджером. Це і є шум.
Порахуймо стелю. Якби ми знали справжнє правило точно й застосували його до 800 нових клієнтів, ми б угадали 89.6% — решту зіпсував перевернутий шум. Це найкраще, чого взагалі може досягти будь-яка модель на цих даних. Тепер порівняй:
| модель | точність train | точність test | до стелі 89.6% |
|---|---|---|---|
| справжнє правило | 89.5% | 89.6% | — |
| дерево глибини 3 | 91.0% | 86.8% | −2.8 в. п. |
| дерево без обмежень | 100.0% | 81.0% | −8.6 в. п. |
Подивись на перший рядок уважно: саме правило, за яким дані створювались, дає на навчальній вибірці лише 89.5%. А дерево без обмежень дає 100%. Отже дерево описало навчальні дані краще, ніж істина, — і це вже не перемога, а діагноз. Єдиний спосіб перевершити істину на навчальних даних — вивчити напамʼять ті самі перевернуті мітки, які істиною не є.
Ось чому «100% на train» само по собі не означає нічого, і чому дивитись треба на розрив між train і test. У правильного правила розрив дорівнює −0.1 відсоткового пункта, у дерева глибини 3 — 4.2, у необмеженого — 19.0.
На кривих нижче видно два дуже різні сюжети. Навчальна точність росте монотонно й доходить до 100% — інакше й бути не може, бо глибше дерево завжди може дозаучити те, що не вмістилось. Тестова точність спочатку росте разом із нею, потім розвертається:
Глибина проти узагальнення
Рожева крива — точність на навчальних даних, бірюзова — на 800 нових клієнтах, яких модель не бачила.
ЛікиОбрізання: до і після
Є два способи не дати дереву розростись, і вони працюють у різні моменти.
Попереднє обрізання (pre-pruning)
Це те, що ми вже бачили: обмеження, які зупиняють ріст під час навчання —
max_depth, min_samples_leaf і компанія. Дешево і просто.
Слабке місце — короткозорість: алгоритм зупиняється, побачивши слабкий розріз, і не дізнається,
що одразу за ним був сильний. Це та сама проблема жадібності, тільки з іншого боку.
Мінімальний розмір листка
Глибина не обмежена. Єдине гальмо — заборона листків, менших за поріг.
min_samples_leaf зазвичай корисніший за
max_depth: він ріже там, де даних мало, і не заважає там, де їх багато.Наступне обрізання (post-pruning)
Другий підхід чесніший: спочатку виростити дерево повністю, а потім зрізати гілки, які не
виправдовують свого існування. У scikit-learn це
cost-complexity pruning, він же алгоритм слабкої ланки. Кожному піддереву
приписують «вартість»:
Словами: вартість дерева — це його помилка плюс орендна плата за кожен листок.
Символи: T — дерево (або будь-яке його піддерево);
R(T) — частка помилок цього дерева на навчальних даних, число від 0 до 1;
|листків T| — скільки в ньому листків; α (грецька мала «альфа») —
ціна одного листка, яку призначаємо ми. Rα(T) —
підсумкова вартість, яку алгоритм мінімізує.
Порахуймо на нашому дереві. Є два кандидати: повністю вирощене дерево (37 листків, 0 помилок із 200, тобто R = 0.000) і дерево глибини 3 (8 листків, 18 помилок, R = 0.090). Питання: за якої ціни листка більше дерево перестає окупатись?
Прирівнюємо й розвʼязуємо: 37α = 0.090 + 8α, отже 29α = 0.090, отже
Поки листок коштує менш ніж 0.0031, вигідніше велике дерево: кожен зайвий листок окупається зменшенням помилки. Щойно ціна переступає 0.0031 — вигіднішим стає мале. Перевір підстановкою: при α = 0.01 велике дерево коштує 0.37, а мале — 0.17, тобто більш ніж удвічі дешевше.
При α = 0 вигідне найбільше дерево завжди — воно ж має нуль помилок. Зі зростанням α листки один за одним стають нерентабельними, і алгоритм згортає найслабші піддерева у листки. Виходить не одне дерево, а ціла послідовність вкладених дерев від найбільшого до пенька; правильне α обирають крос-валідацією.
Чому це чесніше за попереднє обрізання: рішення про кожну гілку ухвалюється, коли вже видно, що під нею виросло. Попереднє обрізання зупиняє алгоритм наосліп, до того як стало відомо, чи був за слабким розрізом сильний.
sklearn потрібні значення
ccp_alpha отримують викликом tree.cost_complexity_pruning_path(X, y) —
він повертає список усіх α, на яких дерево змінюється. Далі звичайний перебір по цьому списку
з крос-валідацією. Це на порядок надійніше, ніж вгадувати max_depth навмання.Слабке місцеНестабільність
А тепер найважливіша вада дерев, і саме вона за одну лекцію приведе нас до випадкового лісу.
Згадай, як обирається корінь: перебір усіх порогів і вибір максимуму приросту. Часто два чи три різні розрізи мають майже однаковий приріст. Наскільки «майже» — ми вже бачили на власні очі в розділі 5: у корені наших даних розріз «витрати ≤ 7.76» дає приріст 0.158, а «витрати ≤ 4.73» — 0.151. Різниця менш ніж 5%, тобто в межах того, що змінює одна жменька клієнтів. Але алгоритм детермінований: він бере максимум і не дивиться, наскільки той відірвався від другого місця. Переможець забирає все, і різниця в третьому знаку перетворюється на два зовсім різні дерева.
Тепер прибери з вибірки кілька випадкових обʼєктів або додай трохи шуму. Порядок кандидатів може помінятись: тепер виграє той, що був другим. Корінь інший — і вся структура під ним будується заново, бо кожен наступний розріз залежить від попереднього. Мала зміна на вході дає велику зміну на виході.
Важливо зрозуміти, чому це саме каскад, а не локальна дрібниця. Змінився корінь — змінилось, які саме 96 і 104 клієнти потрапили ліворуч і праворуч. А розріз у лівій гілці шукається тільки серед тих обʼєктів, які туди дійшли. Інший набір обʼєктів — інші кандидати, інший переможець, інші два вузли під ним. Помилка не гаситься з глибиною, а множиться: кожен рівень успадковує чужий поділ і додає до нього свій.
Ось що показує заміряний прогін. Те саме дерево (глибина 4, мінімальний листок 4) навчено вісім разів на випадкових підвибірках тих самих 200 клієнтів. Підвибірку беруть із поверненням: 200 разів витягують випадкового клієнта й щоразу повертають його назад, тож дехто потрапляє двічі-тричі, а дехто не потрапляє зовсім — у наших прогонах щоразу лишалось близько 125 різних клієнтів зі 200. Дані ті самі, змінюється тільки те, кому пощастило потрапити:
| прогін | питання в корені | листків | точність test |
|---|---|---|---|
| вихідний | витрати ≤ 4.73 | 14 | 86.8% |
| 1 | витрати ≤ 7.08 | 12 | 79.8% |
| 2 | витрати ≤ 5.45 | 13 | 82.4% |
| 3 | витрати ≤ 5.43 | 13 | 82.1% |
| 4 | стаж ≤ 9.91 | 13 | 76.8% |
| 5 | витрати ≤ 4.62 | 12 | 85.1% |
| 6 | стаж ≤ 15.32 | 12 | 75.4% |
| 7 | витрати ≤ 5.43 | 13 | 81.0% |
| 8 | стаж ≤ 11.02 | 11 | 83.1% |
Три прогони з восьми змінили саму ознаку в корені — не поріг, а питання. Тестова точність гуляє від 75.4% до 85.1%, тобто на 9.7 відсоткового пункта. І це при тому, що дані ті самі, алгоритм той самий і жодного випадкового числа всередині алгоритму немає: змінилось лише те, які саме клієнти потрапили у вибірку.
Порівняй із лінійною регресією: там викидання кількох точок трохи посуне коефіцієнти, але форма моделі — пряма — лишиться прямою, і читати її треба буде так само. Дерево ж міняє не числа всередині відомої форми, а саму структуру: інші питання в іншому порядку. Саме тому одне дерево не можна показувати замовникові зі словами «ось які ознаки насправді важливі»: на іншій половині тих самих даних вийшов би інший список.
Те саме завдання, інша підвибірка
Кожне натискання — нова випадкова підвибірка тих самих клієнтів і навчання з нуля.
Мовою зміщення й дисперсії: у глибокого дерева мале зміщення (воно здатне описати майже будь-яку залежність) і велика дисперсія (результат сильно залежить від конкретної вибірки). Обрізання зменшує дисперсію ціною зміщення, але повністю проблему не знімає.
І зверни увагу на парадокс, який робить ансамблі можливими: нестабільність із вади перетворюється на ресурс. Стабільна модель на всіх підвибірках дає майже те саме, і усереднювати нема чого. Дерево ж кожного разу помиляється по-новому — саме тому з нього виходить хороший будівельний матеріал.
БалансЩо дерево вміє краще за всіх
Попри всі вади дерева лишаються робочим інструментом, і не тільки як цеглинка для ансамблів. Ось за що їх цінують:
- Інтерпретованість. Модель можна роздрукувати й показати юристові. Кожен прогноз супроводжується явним ланцюжком правил — це те, чого вимагають регуляції в кредитуванні й медицині.
- Жодної підготовки ознак. Не треба стандартизувати, не треба прибирати монотонні перетворення (логарифм ознаки не змінить дерева взагалі), не треба будувати поліноміальні ознаки — взаємодії виникають самі, бо кожен розріз робиться всередині вже відрізаної області.
- Стійкість до викидів. Розріз реагує на порядок значень, а не на їхню величину. Клієнт із витратами в мільйон гривень зсуне середнє, але для дерева він просто «крайній праворуч».
- Змішані типи даних. Категоріальні ознаки, пропуски, різні шкали в одній таблиці — усе це дерева переживають без танців із бубном.
- Швидкий прогноз. Класифікація — це кілька порівнянь чисел; глибина дерева зазвичай менша за 20.
А ось за що не варто братися деревом:
- Гладкі залежності. Пряму дерево наближає сходинками, і кожна сходинка коштує вузла, тобто даних. Там, де лінійна регресія обійдеться двома числами, деревові знадобляться десятки листків — і воно все одно програє.
- Тисячі розріджених ознак — текст, кліки, покупки. Кожен розріз бере одну ознаку, а їх сто тисяч, і майже кожна майже завжди дорівнює нулю. Дерево просто не встигне їх обійти, і кожен окремий розріз майже нічого не пояснює.
- Екстраполяція за межі навчального діапазону. У листку записано константу, а не формулу. Найправіший листок нашого дерева каже «лишиться» для всіх, у кого стаж понад 22.60 місяця, — і для клієнта зі стажем 24 місяці, і для клієнта зі стажем 200 місяців відповідь буде та сама. Лінійна модель у такій ситуації хоча б продовжить тенденцію; дерево не має чим її продовжувати.
- Задачі, де межа проходить під кутом до осей — розділ 2 показав це наочно: поворот тих самих даних на 45° коштує дереву 6.1 відсоткового пункта на порожньому місці.
scikit-learn це поле
feature_importances_.
Читати ці числа треба обережно. Оцінка систематично завищує ознаки з великою кількістю різних значень: у неперервної ознаки на 200 обʼєктах є 199 кандидатів на поріг, а в ознаки «так / ні» — рівно один. Що більше спроб, то вищий шанс, що якийсь поріг випадково ляже вдало на шум. Тому ідентифікатор клієнта, який не означає взагалі нічого, може отримати помітну «важливість» просто тому, що він унікальний у кожного. Це та сама хвороба, через яку ID3 закохувався в багатозначні категорії (розділ 6). Детально — у темі 24.
ПідсумокЩо варто винести
Дерево рішень — це послідовність питань «ознака ≤ поріг», яка розкладає простір на прямокутники. Питання обираються жадібно: на кожному кроці той розріз, що найбільше зменшує безлад. Безлад міряють ентропією або Джині; різниця між ними на практиці невелика, а от різниця між обмеженим і необмеженим ростом — величезна.
Ланцюжок, який варто вміти переказати без підказки: ентропія міряє безлад в одному вузлі → приріст інформації порівнює безлад до й після розрізу → жадібний перебір бере розріз із найбільшим приростом → рекурсія повторює це в кожному нащадку → гальма кажуть, коли спинитись. Усе інше в темі — наслідки цих пʼяти кроків.
Пʼять речей, які легко забути й дорого відновлювати:
- Логарифм у формулі ентропії стоїть не для краси. Він єдиний перетворює множення варіантів на додавання бітів, і тільки завдяки цьому «два питання» коштують рівно два біти.
- Приріст рахують зі зваженим середнім. Без ваг найкращим здається розріз, що відрізає одну точку в ідеально чистий вузол.
- Дерево без обмежень завжди дає 100% на навчальних даних. Цей результат не означає нічого, крім того, що дерево має достатньо листків. На наших даних навіть справжнє правило, за яким їх створено, дає лише 89.5% — тобто 100% можна отримати, тільки вивчивши шум.
- Розрив між train і test — головний індикатор. Дивись на нього, а не на абсолютні числа: 19.0 відсоткового пункта в необмеженого дерева проти 4.2 у дерева глибини 3.
- Одне дерево нестабільне за побудовою. Це не помилка налаштування, це властивість жадібного рекурсивного алгоритму, і лікується вона не зерном генератора, а ансамблем — про що й буде наступна тема.