Машинне навчання · Блок 6 · Тема 26

Ліс замість дерева

Одне дерево нестабільне, і виправити це всередині дерева неможливо. Зате можна побудувати сотню поганих дерев і змусити їх голосувати.

Наприкінці 1906 року статистик Френсіс Гальтон опинився на сільському ярмарку, де відвідувачі за монету вгадували вагу бика. Гальтон зібрав 787 записок і, готуючись посміятися з натовпу, порахував медіану здогадок. Вона відрізнялась від справжньої ваги менш ніж на один відсоток — точніше за будь-якого окремого фермера й точніше за експертів.

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

Ми продовжимо працювати з даними попередньої лекції: 200 клієнтів банку, дві ознаки — стаж обслуговування в місяцях і середні місячні витрати, — і питання, чи залишиться клієнт на наступний рік. Там ми зупинились на неприємному висновку: одне дерево гуляє від підвибірки до підвибірки й ніколи не знає, чи можна йому вірити. Тепер полагодимо саме це.

01 / ІдеяМудрість натовпу

Ансамбль — це набір моделей, чиї прогнози обʼєднують в один. Для класифікації обʼєднання зазвичай означає голосування більшістю: скільки моделей сказали «лишиться», скільки «піде», перемагає більший табір. Для регресії беруть середнє.

Щоб ансамбль виграв у окремої моделі, потрібні дві умови, і обидві однаково важливі:

Перша умова для дерев виконується легко. Друга — головна інженерна задача всієї теми, і половина цієї лекції присвячена тому, як штучно зробити дерева різними.

02 / ТеоріяТеорема Кондорсе

Що дає голосування більшістю, порахували ще 1785 року. Маркіз де Кондорсе розглядав присяжних: нехай кожен із M присяжних незалежно ухвалює правильне рішення з ймовірністю p, а вердикт визначає більшість. Ймовірність правильного вердикту — це ймовірність, що правильно проголосувала більш ніж половина:

P(M, p) = Σk > M/2 C(M, k) · pk · (1 − p)M−k

Це звичайний хвіст біноміального розподілу. Висновок із формули відомий як теорема присяжних, і в ній три випадки, які треба знати напамʼять:

  1. Якщо p > 0.5, то P зростає з M і прямує до одиниці. Достатньо взяти більше голосів — і колективна помилка стане як завгодно малою.
  2. Якщо p = 0.5, то P дорівнює 0.5 за будь-якого M. Натовп монеток — це монетка.
  3. Якщо p < 0.5, ефект обертається: P спадає з M і прямує до нуля. Натовп поганих моделей упевнено помиляється — і що більший натовп, то впевненіше.

Інтерактив 1 · Крива Кондорсе

Скільки моделей потрібно, щоб більшість була права. Сірі криві — орієнтири для p = 0.4, 0.5, 0.6, 0.7.

P більшості
виграш, в.п.
при 11 деревах
при 51 дереві
Спробуй p = 0.45. Крива піде вниз: кожне додане дерево робить ансамбль гіршим. Це не парадокс, а та сама математика з іншим знаком — більшість надійно відтворює те, у чому окремі моделі систематично помиляються.

03 / Дрібний шрифтЗастереження про незалежність

У формулі Кондорсе захована умова, без якої вона не працює: голоси мають бути незалежними. Саме тому там стоїть біноміальний коефіцієнт — він рахує кількість способів отримати k правильних голосів із M, припускаючи, що кожен голос кидається окремо.

У житті присяжні перемовляються, а моделі вчаться на одних і тих самих даних. Якщо всі дерева побудовані на однаковій вибірці однаковим детермінованим алгоритмом, вони будуть ідентичними. Ефективна кількість голосів у такому ансамблі дорівнює одиниці, скільки б дерев ми не додали.

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

04 / Трюк першийБегінг і бутстреп

Ідеально було б навчити кожне дерево на власній свіжій вибірці з реального світу. Але вибірка в нас одна. Лео Брейман 1996 року запропонував підробку, яка виявилась напрочуд робочою: бутстреп — витягування n обʼєктів із наявних n з поверненням.

Витягнули клієнта — записали й повернули назад у мішок. Тому один і той самий клієнт може потрапити у вибірку двічі й тричі, а хтось інший не потрапити взагалі. Розмір вибірки лишається тим самим, але склад щоразу інший. Метод «навчи модель на кожній бутстреп-вибірці й усередни прогнози» називається беггінгом (bagging — bootstrap aggregating).

05 / АрифметикаЗвідки береться 63%

Скільки різних обʼєктів потрапляє в одну бутстреп-вибірку? Порахуймо це до кінця — виведення коротке й дуже показове.

крок 1 · одне витягування

Візьмімо конкретного клієнта. За одне витягування ймовірність, що дістали саме його, дорівнює 1/n. Отже, ймовірність, що дістали не його:

1 − 1/n
крок 2 · усі n витягувань

Витягування незалежні, тому ймовірність, що його не взяли жодного разу за n спроб, — це добуток n однакових множників:

P(не потрапив) = (1 − 1/n)n
крок 3 · границя

Це класична границя з математичного аналізу:

limn→∞ (1 − 1/n)n = e−1 ≈ 0.368

Причому збіжність швидка: вже при n = 20 значення дорівнює 0.358, при n = 100 — 0.366.

крок 4 · висновок

Отже, приблизно 36.8% обʼєктів у кожну конкретну вибірку не потрапляють, а 63.2% потрапляють хоча б раз:

частка унікальних ≈ 1 − e−1 ≈ 0.632

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

Інтерактив 2 · Що відбувається при бутстрепі

Кожна клітинка — один обʼєкт вибірки. Колір показує, скільки разів його витягнули.

унікальних
теорія
поза вибіркою
max повторів
Що читати: сірі клітинки — обʼєкти, які в цю вибірку не потрапили, тобто out-of-bag. Їхня частка коливається навколо 36.8% і майже не залежить від n — у цьому і краса границі.

06 / Трюк другийВипадкові ознаки й декореляція

Самого беггінгу мало. Якщо в даних є одна дуже сильна ознака, то майже кожна бутстреп-вибірка обере її для кореня — і дерева знову вийдуть схожими, просто з трохи різними порогами. Кореляція між ними лишиться високою, а ансамбль виграє менше, ніж міг би.

Друга ідея Бреймана усуває саме це: у кожному вузлі розріз шукається не серед усіх ознак, а серед випадкової підмножини розміру mtry. Не один раз на дерево — а заново в кожному вузлі. Якщо сильна ознака цього разу не потрапила у вибір, дерево змушене будувати розріз на чомусь іншому й знаходить структуру, яку інакше б проґавило.

Стандартні рекомендації такі:

задачаmtry за замовчуваннямміркування
класифікація√pсильна декореляція, дерева слабші, але різні
регресіяp/3у регресії дерева чутливіші, потрібно більше ознак
mtry = pце вже просто беггінгдерева найсильніші, але найсхожіші

Тут працює компроміс сили й кореляції, який Брейман сформулював прямо: якість лісу зростає, коли окремі дерева сильніші, і коли вони менш корельовані. Але ці дві вимоги тягнуть у різні боки. Малий mtry робить дерева різними — і водночас слабшими, бо найкорисніша ознака часто буває недоступною. Великий mtry робить кожне дерево сильним — і всі їх схожими. Оптимум зазвичай десь посередині, і √p — непогане перше наближення.

Щоб побачити компроміс на числах, потрібно більше ознак, ніж дві. Для наступного інтерактиву в датасет додано ще чотири колонки: кількість транзакцій (майже дублює витрати), вік акаунта в застосунку (майже дублює стаж), ідентифікатор сесії (чистий шум) і канал звернення (теж шум, але лише двох значень).

Інтерактив 3 · Скільки ознак дозволити вузлу

Шість ознак, ліс із 24 дерев. Три криві: сила окремого дерева, схожість дерев і точність ансамблю.

точність лісу
середнє дерево
згода дерев
найкращий mtry
Що читати: «згода дерев» — частка тестових обʼєктів, на яких два випадково взяті дерева дають однакову відповідь. Це практична міра кореляції: 100% означало б, що ансамбль вироджений і складається фактично з однієї моделі.

07 / ЗбіркаАлгоритм цілком

Тепер можна записати весь випадковий ліс у пʼять рядків. Нехай задано кількість дерев T, розмір підмножини ознак mtry й обмеження на дерево:

  1. Для кожного дерева t = 1…T витягни бутстреп-вибірку розміру n з поверненням.
  2. Вирости на ній дерево звичайним жадібним алгоритмом, але в кожному вузлі перебирай лише mtry випадково обраних ознак.
  3. Дерево не обрізай. Так, у попередній лекції ми казали, що глибокі дерева перенавчаються — тут це навмисне.
  4. Для прогнозу пропусти обʼєкт крізь усі T дерев і візьми більшість голосів (або середнє від часток класу, якщо потрібні ймовірності).
  5. Обʼєкти, що не потрапили в бутстреп конкретного дерева, використай для OOB-оцінки.

Пункт 3 бентежить найбільше, тому розберімо його окремо. Глибоке дерево має мале зміщення й велику дисперсію. Усереднення багатьох моделей зменшує дисперсію, але не змінює зміщення. Отже, вигідно брати в ансамбль моделі саме з малим зміщенням — а з дисперсією розбереться усереднення. Обрізане дерево мало б і зміщення, і від нього ансамбль уже не врятує.

Інтерактив 4 · Скільки дерев треба

Повертаємось до двох ознак. Насиченість кольору — наскільки одностайно голосує ліс у цій точці.

точність лісу
одне дерево
приріст
межа 36 дерев
Що видно: при одному дереві межа — рвані прямокутники з різкими краями. З десятком дерев зʼявляються півтони: там, де дерева не згодні, ліс не впевнений. Крива внизу усереднена за чотирма незалежними лісами, щоб не показувати випадкові коливання одного запуску.
Скільки дерев брати. Точність виходить на плато, і додаткові дерева її вже не псують — на відміну від глибини одного дерева, більше ніколи не означає гірше. Тому n_estimators обирають не якістю, а бюджетом часу: 100–500 у типовій задачі, більше — коли потрібні стабільні оцінки ймовірностей.

08 / ПеревіркаДерево проти лісу

Найпереконливіший доказ — прямий експеримент. Візьмімо ту саму процедуру, що в кінці попередньої лекції: витягуємо нову підвибірку клієнтів і вчимося з нуля. Тільки тепер паралельно навчаються двоє: одне дерево і ліс із 25 дерев.

Натисни кнопку кілька разів і дивись на числа праворуч. Нас цікавить не так точність, як стабільність: наскільки сильно змінюється відповідь моделі, коли дані змінились ледь-ледь.

Інтерактив 5 · Наскільки ліс стабільніший

Ліворуч — одне дерево, праворуч — ліс із 25 дерев. Обидва вчаться на одній і тій самій новій підвибірці.

зсув межі · дерево
зсув межі · ліс
test · дерево
test · ліс
у середньому за всі запуски · дерево / ліс
«Зсув межі» — частка площини, де модель класифікує інакше, ніж на попередньому запуску. Для дерева це зазвичай 10–20%, для лісу — одиниці відсотків. Дисперсія не зникла: вона поділилась на кількість дерев.

09 / БонусOOB — безкоштовна валідація

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

Повторивши це для всіх n клієнтів, отримаємо out-of-bag оцінку якості:

OOB-точність = ⅟n Σi [ ŷiOOB = yi ]

Це майже те саме, що крос-валідація, тільки безкоштовно: ніякого повторного навчання, ніякої відкладеної вибірки. У scikit-learn вона вмикається одним аргументом oob_score=True, і результат читається з rf.oob_score_.

Інтерактив 6 · OOB проти тестової вибірки

Рожева крива рахується всередині навчальних даних, бірюзова — на 1200 клієнтах, яких модель не бачила.

OOB
test
розбіжність
дерев на голос
Чому на початку крива стрибає: при пʼяти деревах кожен клієнт отримує голоси лише від двох-трьох дерев, які його не бачили, та ще й рахується все на 200 обʼєктах. Це оцінка мікроскопічного ансамбля з величезною власною похибкою. Із зростанням кількості дерев вона заспокоюється й підходить до тестової.
Коли OOB бреше. Якщо в даних є групи повʼязаних записів (кілька транзакцій одного клієнта, кілька знімків одного пацієнта), бутстреп розкидає їх по різні боки, і «невидимий» обʼєкт насправді майже дублює побачений. OOB тоді завищує якість — рівно так само, як звичайна випадкова крос-валідація. Рятує групова валідація за ідентифікатором.

10 / ІнтерпретаціяВажливість ознак і її пастки

Ліс втратив головну перевагу дерева: сто дерев не намалюєш і вголос не прочитаєш. Натомість він пропонує зведену характеристику — важливість ознак. Способів порахувати її два, і вони міряють різні речі.

MDI — середнє зменшення забрудненості

Це те, що sklearn віддає у feature_importances_. Для кожного вузла беруть приріст чистоти від його розрізу, множать на частку обʼєктів у вузлі й додають до рахунку тієї ознаки, за якою різали. Потім усе усереднюють по деревах і нормують на суму:

MDI(f) = Σвузли по f (nвузла/N) · Δimpurity

Рахується безкоштовно — усі числа вже є після навчання. Але має дві відомі вади. Перша: зсув на користь ознак із багатьма різними значеннями. У неперервної ознаки сотні кандидатів на поріг, у бінарної — один; за чистої випадковості неперервна частіше знаходить розріз, який хоч трохи зменшує забрудненість. Друга: MDI рахується на навчальних даних, тому щедро оплачує розрізи, зроблені по шуму.

Permutation importance — падіння якості від псування ознаки

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

PI(f) = точність(X) − точність(X із перемішаною колонкою f)

Дорожче (потрібні повторні прогони) і шумніше (перемішування випадкове, тому роблять кілька повторів і усереднюють), зате чесно: вимірюється на даних, яких модель не бачила.

Інтерактив 7 · Дві важливості на одному лісі

Той самий ліс, шість ознак. Дві останні — навмисний шум, який нічого не пояснює.

MDI · id сесії
PI · id сесії
MDI · канал
PI · канал
Головне спостереження: «ідентифікатор сесії» — випадкове число, яке за побудовою не несе жодної інформації. MDI все одно дає йому помітну частку, бо в нього багато різних значень. Permutation importance майже нульова — і вона права.

Обидві важливості відповідають на питання «що впливає загалом». Питання «чому модель так вирішила про це конкретне оголошення» — інше, і відповідають на нього іншими засобами: значеннями Шеплі, локальними наближеннями, частинною залежністю. Разом із тим, чому переконливе пояснення буває небезпечнішим за його відсутність, це розібрано в темі 40 · Інтерпретованість.

І ще одна пастка — корельовані ознаки. «Кількість транзакцій» майже дублює «витрати». Інформація в них одна й та сама, але кожне дерево бере ту, що випала йому в підмножину, — і важливість ділиться між двома колонками. Кожна виглядає слабшою, ніж є насправді; при трьох-чотирьох дублікатах вони цілком можуть опуститися нижче порога, за яким ознаки відкидають як непотрібні. Тому важливості ознак — інструмент для формування гіпотез, а не для остаточних висновків про причини.

11 / ТеоріяЧому ліс не перенавчається

Тепер найцікавіше питання лекції: чому ансамбль із необрізаних дерев, кожне з яких перенавчене, не перенавчений сам? Відповідь дає розклад дисперсії середнього.

крок 1 · незалежні моделі

Нехай кожне дерево дає прогноз із дисперсією σ². Якщо прогнози незалежні, дисперсія середнього з M штук — класична формула:

Var(середнє) = σ2 / M

Тобто при M = 100 розкид падає в сто разів. Занадто добре, щоб бути правдою.

крок 2 · корельовані моделі

Насправді дерева вчаться на тих самих даних, і їхні помилки корельовані з коефіцієнтом ρ. Тоді формула стає такою:

Var(середнє) = ρ·σ2 + (1 − ρ)·σ2 / M
крок 3 · читаємо результат

Другий доданок згасає з ростом M — його ми перемагаємо кількістю дерев. Перший не залежить від M взагалі: скільки дерев не додавай, нижче ρσ² дисперсія не опуститься. Ось чому декореляція така важлива: вона знижує саме ту стелю, яку кількістю не пробити.

Тепер видно, як усе складається докупи. Бутстреп і випадкові ознаки зменшують ρ. Велике M прибирає другий доданок. Необрізані дерева тримають зміщення малим. Ліс справді може перенавчитись — але тільки якщо ρ близька до одиниці, тобто якщо дерева перестали бути різними.

Строго кажучи. Брейман довів, що з ростом кількості дерев помилка узагальнення випадкового лісу збігається до скінченної межі, а не зростає. Тому фразу «ліс не перенавчається» варто читати так: він не перенавчається від додавання дерев. Перенавчитись на самих даних — наприклад, на крихітній вибірці з шумними мітками — він цілком здатен.

12 / ПорівнянняЛіс проти бустингу

Випадковий ліс — не єдиний спосіб зібрати ансамбль із дерев. Другий великий підхід — бустинг (XGBoost, LightGBM, CatBoost), і різниця між ними принципова. Тут — коротке порівняння; механіку бустингу крок за кроком розібрано в наступній темі 27 · Бустинг.

Ліс будує дерева паралельно й незалежно, кожне на своїй вибірці, і зменшує дисперсію. Бустинг будує дерева послідовно: кожне наступне вчиться виправляти помилки вже зібраного ансамблю, і зменшує зміщення. Звідси всі практичні відмінності:

критерійвипадковий лісградієнтний бустинг
дереваглибокі, незалежнімілкі (3–8), послідовні
зменшуєдисперсіюзміщення
навчанняпаралельне, легко масштабуєтьсяпослідовне за побудовою
налаштуванняпрацює «з коробки»чутливий до learning_rate і глибини
перенавчанняне росте з кількістю деревросте — потрібна рання зупинка
стеля якостітрохи нижчазазвичай вища на табличних даних

Практичне правило просте. Ліс — це надійна базова лінія, яку варто отримати за пʼять хвилин на початку роботи: він майже не вимагає налаштування, дає OOB-оцінку задарма й рідко поводиться несподівано. Бустинг — це те, чим виграють змагання, коли готовий витратити час на підбір гіперпараметрів і маєш достатньо даних.

13 / ПідсумокЩо варто винести

Випадковий ліс — це відповідь на конкретну ваду конкретної моделі. Дерево має малу похибку зміщення й величезну дисперсію; усереднення багатьох дерев прибирає дисперсію, не чіпаючи зміщення. Уся інженерія зводиться до того, щоб дерева не були схожими:

І головне, що варто запамʼятати з обох лекцій: слабкість алгоритму не завжди лікують всередині алгоритму. Іноді дешевше побудувати сто його недосконалих копій і дати їм проголосувати.

Далі в практиці. У practice.ipynb ти зібереш беггінг вручну на DecisionTreeClassifier, порівняєш його з RandomForestClassifier, побудуєш криву OOB проти тестової помилки, порахуєш обидві важливості через permutation_importance і зіставиш ліс із градієнтним бустингом на одному датасеті.

Далі в темі

Теорію прочитано. Тепер закріпи її на практиці.