Уяви, що ти ведеш курс і хочеш заздалегідь розуміти, хто з групи ризикує не скласти іспит. Єдине, що ти знаєш про кожного студента — скільки годин він реально готувався. Мітка на виході не число, а факт: склав або не склав. Одиниця або нуль.
Задача ніби та сама, що й у лінійній регресії, але вже на першому кроці все ламається. Пряма не вміє зупинятися на нулі й одиниці — у неї немає ні підлоги, ні стелі. А ще тобі потрібне не саме число, а впевненість: «цей складе з імовірністю 0.83». Із такої відповіді можна ухвалювати різні рішення залежно від того, чого ти боїшся більше.
ПостановкаКоли відповідь — «так» або «ні»
Задача класифікації відрізняється від регресії однією деталлю: множина відповідей скінченна. Один клас домовляються називати позитивним і позначати одиницею, другий — негативним і нулем. Слово «позитивний» тут не про добро: у медицині позитивний клас — це якраз хвороба.
Логістична регресія розвʼязує цю задачу так: вона моделює не сам клас, а ймовірність того, що обʼєкт належить позитивному класу:
Розберемо запис по символах, бо далі вони працюватимуть на кожній сторінці.
y — це відповідь, нуль або одиниця. x — набір ознак одного
обʼєкта: для студента це «скільки годин готувався», для транзакції — сума, час, країна.
Вертикальна риска в P(y = 1 | x) читається «за умови» і не має жодного
стосунку до ділення: увесь запис означає «ймовірність того, що відповідь буде одиниця,
якщо нам відомі ознаки x». Символи β1 …
βp (грецька «бета») — ваги ознак: по одному числу
на ознаку, і саме їх модель підбирає під час навчання. β0 —
вільний член: те, що модель каже, коли всі ознаки дорівнюють нулю. p —
скільки всього ознак. А σ — грецька «сигма», назва функції, яку ми виведемо
в розділі 04; поки що досить знати, що вона стискає будь-яке число у проміжок від 0 до 1.
Величину z — ту саму лінійну комбінацію ознак, що й у
лінійній регресії, — називають
лінійним предиктором. Новизна лише в тому, що результат пропускають
крізь σ. Звідси й дивна назва «регресія» для алгоритму класифікації:
всередині досі сидить лінійна модель, просто її вихід переведено у шкалу ймовірностей.
Порахуймо один раз руками, щоб запис перестав бути абстракцією. Хай ознака одна —
години підготовки, β0 = −4.6 і
β1 = 0.34. Для студента, який готувався
x = 10 годин: z = −4.6 + 0.34 · 10 = −1.2, і модель
переводить це в імовірність приблизно 0.23. Для того, хто готувався 20 годин:
z = −4.6 + 0.34 · 20 = +2.2, імовірність приблизно 0.90. Одна й та сама
пара чисел, різні ознаки — різна впевненість.
Провал прямоїЧому лінійна регресія тут ламається
Найчесніший спосіб зрозуміти, навіщо потрібна сигмоїда, — спробувати обійтися без неї. Проведемо через дані про підготовку звичайну пряму методом найменших квадратів, ніби нулі й одиниці — це числа.
Проблеми виринають одразу. Перша очевидна: пряма необмежена — вона видає відʼємні «ймовірності» ліворуч і більші за одиницю праворуч. Друга підступніша: пряма мінімізує квадрат відхилення від мітки, тому кожна далека точка тягне її на себе, навіть якщо нічого нового не додає. Додай у групу студентів-марафонців, які готувалися по 70 годин і, звісно, склали, — і подивись, що станеться з межею.
Пряма проти сигмоїди на мітках 0/1
Повзунок додає студентів із дуже великою підготовкою (усі склали). Дивись, яка крива зрушить.
ШансиІмовірність, шанси, логіт
Щоб зрозуміти, звідки береться сигмоїда, зайдемо не з формули, а з логіки. Проблема
проста й груба: лінійний предиктор z уміє видавати будь-яке
число — і −40, і +1200, — а ймовірність зобовʼязана лежати між 0 і 1. Два діапазони не
збігаються, і їх треба якось поєднати.
Найпростіше, що спадає на думку, — просто обрізати: усе, що менше нуля, вважати нулем,
усе, що більше одиниці, — одиницею. Так робити не можна, і причина не в красі. Обрізана
функція плоска на обох кінцях: для студента, якому модель дала «−3», і
для того, кому дала «−40», результат однаковий — нуль. Модель більше не бачить різниці
між «майже не склав» і «не мав жодного шансу», а разом із різницею зникає й підказка,
куди рухати коефіцієнти. Потрібне перетворення, яке стискає нескінченність у відрізок
без плоских ділянок: щоб кожній парі різних z відповідали різні
ймовірності.
Тому підемо з іншого боку: не будемо тиснути z у проміжок, а навпаки —
розтягнемо ймовірність так, щоб вона дотяглася до нескінченності в
обидва боки. Це три кроки, і кожен розширює діапазон.
Це те, що ми хочемо отримати, але діапазон надто тісний: лінійний предиктор у нього не влізе.
Шанси (odds) — це відношення ймовірності події до ймовірності її відсутності. Мова азартних ігор: «шанси три до одного».
Якщо p = 0.75, то odds = 0.75 / 0.25 = 3: подія втричі
ймовірніша за свою відсутність — саме це й означає «три до одного». Якщо
p = 0.5, то odds = 0.5 / 0.5 = 1: рівні шанси.
А якщо p = 0.99, то odds = 0.99 / 0.01 = 99. Стеля
зникла: що ближче p до одиниці, то більші шанси, і межі немає.
Але нижня межа лишилась: шанси не бувають відʼємними, бо це відношення двох
додатних чисел. Найменше, до чого вони можуть підійти, — нуль.
Лишилось прибрати нижню межу — і це вміє робити логарифм. Логарифм шансів називають логітом:
Тепер діапазон збігається з діапазоном лінійного предиктора: логіт пробігає всі числа від мінус до плюс нескінченності. Отже, можна просто прирівняти їх.
ln означає натуральний логарифм: основа в нього — число
e ≈ 2.718, те саме, що стоїть в експоненті ez.
Тобто ln(a) = b — це інший спосіб написати eb = a.
Дві властивості пояснюють, чому логарифм тут доречний, і більше нічого знати не треба. Перша: він переводить проміжок «від нуля до нескінченності» у проміжок «від мінус нескінченності до плюс нескінченності». Число 1 стає нулем (
ln 1 = 0), числа більші за одиницю — додатними, менші за одиницю —
відʼємними, а чим ближче число до нуля, тим глибше вниз іде логарифм. Саме це нам і
потрібно: шанси «1 до 1» опиняються рівно посередині нової шкали.
Друга: логарифм перетворює множення на додавання, ln(a·b) = ln a + ln b.
Через це подвоєння шансів завжди додає до логіта ту саму величину, звідки б ми не
стартували, — і саме тому логіт можна прирівняти до лінійного виразу.Ось усі три шкали на кількох числах. Зверни увагу на симетрію: імовірності 0.25 і 0.75 дають шанси 1/3 і 3, а логіти −1.099 і +1.099 — те саме число з різними знаками.
| імовірність p | шанси p/(1−p) | логіт ln(шансів) | як це читається |
|---|---|---|---|
| 0.01 | 0.0101 | −4.595 | майже напевно ні |
| 0.10 | 0.1111 | −2.197 | один шанс із девʼяти |
| 0.25 | 0.3333 | −1.099 | один до трьох |
| 0.50 | 1.0000 | 0.000 | рівні шанси |
| 0.75 | 3.0000 | +1.099 | три до одного |
| 0.90 | 9.0000 | +2.197 | девʼять до одного |
| 0.99 | 99.0000 | +4.595 | майже напевно так |
Перевір один рядок руками, щоб таблиця перестала бути чужою:
p = 0.75 дає 0.75 / (1 − 0.75) = 0.75 / 0.25 = 3, а
ln 3 = 1.099. І навпаки, p = 0.25 дає
0.25 / 0.75 = 1/3, а ln(1/3) = −1.099 — той самий модуль,
протилежний знак. Шкала логіта симетрична відносно нуля, і нуль на ній означає
«не знаю».
Три лінійки, одна точка
Одна й та сама впевненість, записана трьома способами. Повзунок рухає точку по нижній лінійці — дві верхні йдуть за нею.
Це і є справжнє означення логістичної регресії — вона лінійна не за ймовірністю, а за логітом:
СигмоїдаРозвʼязуємо тотожність назад
Модель записана в термінах логіта, але прогнозувати треба ймовірність. Ми маємо
рівність ln( p / (1 − p) ) = z, у якій відоме z, а шукане —
p. Отже, треба розвʼязати її назад, щоб p лишилось
саме зліва. Це чотири рядки шкільної алгебри, і в кінці саме собою зʼявиться сигмоїда.
Логарифм і піднесення e до степеня — дії, що взаємно скасовуються:
якщо ln(a) = z, то a = ez. Тут у
ролі a стоять шанси:
Позбуваємось дробу — і одразу розкриваємо дужки праворуч:
Доданок p·ez переносимо наліво й виносимо
p за дужки:
Формула вже готова, але її прийнято писати інакше. Поділимо чисельник і знаменник
на ez — від цього дріб не зміниться.
Зверху лишиться одиниця, а знизу 1 / ez, що
те саме, що e−z:
Обидва записи однакові — перевір на z = 0:
e0 = 1, зліва
1 / (1 + 1) = 0.5, справа теж 1 / (1 + 1) = 0.5.
Отже, сигмоїда не обрана «бо схожа на сходинку» — вона обернена до логіта. Ми домовились, що лінійною є логарифмічна шкала шансів, і сигмоїда просто повертає нас назад в ймовірності.
Три властивості сигмоїди варто памʼятати напамʼять:
σ(0) = 0.5— точка перелому рівно посередині. Логіт нуль означає «шанси один до одного», тобто «не знаю»;σ(−z) = 1 − σ(z)— симетрія відносно цієї точки. Перевір:σ(1.099) = 0.75, аσ(−1.099) = 0.25, і 0.25 = 1 − 0.75;σ′(z) = σ(z)·(1 − σ(z))— крутість кривої в точці виражається через саму криву. Штрих тут означає похідну, тобто «наскільки різко змінюється ймовірність, коли логіт зсувається на крихту». Максимум цієї крутості —0.5 · 0.5 = 0.25приz = 0; на хвостах, деσблизька до нуля або до одиниці, добуток згасає майже до нуля.
Тепер подивись, що роблять із кривою два її параметри. β₁ керує крутістю
переходу, β₀ — його положенням.
Що роблять β₀ і β₁
Крапки внизу — ті, хто не склав; угорі — ті, хто склав. Пунктир — межа рішення при порозі 0.5.
МежаДе модель міняє думку
Межа рішення — множина точок, у яких модель вагається рівно навпіл. Знайти її легко: ймовірність дорівнює 0.5 тоді й лише тоді, коли логіт нульовий:
А це — рівняння прямої, площини або гіперплощини, залежно від кількості ознак.
Гіперплощина — це просто слово для «площини» у просторі, де вимірів
більше за три: з двома ознаками межа є прямою на площині, з трьома — площиною в
обʼємі, а з десятьма ознаками уявити її вже не можна, зате рівняння лишається тим самим.
Для однієї ознаки межа вироджується в точку x* = −β₀/β₁ — те саме
рівняння, розвʼязане відносно x. Перевір на знайомих числах: при
β₀ = −4.3 і β₁ = 0.36 межа стоїть на
4.3 / 0.36 ≈ 11.9 години підготовки.
Звідси й термін лінійний класифікатор: розділювальна поверхня завжди пласка, хоч крива ймовірності й вигинається. Вигинається саме впевненість, а не межа: сигмоїда лише каже, наскільки швидко модель переходить від «ні» до «так», коли обʼєкт віддаляється від межі.
x₁² + x₂² перетворює
коло на пряму, і задача стає лінійною.ПорігВажіль, який не належить моделі
Ось найважливіша думка лекції, і її регулярно пропускають. Модель віддає число від 0 до 1. Перетворення цього числа на рішення — окремий крок, якого модель не робить і не може зробити. Порівнювати ймовірність із 0.5 — не закон природи, а домовленість за замовчуванням.
Чому модель не може обрати поріг сама — варто сказати прямо, бо це не примха розробників бібліотеки. Щоб обрати поріг, треба знати ціну кожної з двох помилок, а ця ціна живе не в даних, а поза ними. Дані кажуть, хто склав іспит, а хто ні; вони нічого не кажуть про те, що дорожче — даремно викликати студента на консультацію чи проґавити того, хто справді завалиться. Модель бачить лише дані, отже ціни вона не бачить у принципі, скільки її не навчай.
Дві задачі, ті самі числа на виході, протилежні пороги:
| задача | поріг | чому саме так |
|---|---|---|
| Скринінг на рідкісну, але виліковну хворобу | низький, 0.05 | пропустити хворого — інвалідність або смерть; хибна тривога — ще один аналіз. Ціни розрізняються в тисячі разів |
| Автоматичне блокування картки за підозрою в шахрайстві | високий, 0.90 | хибна тривога — клієнт із заблокованою карткою в чужій країні. Дешевше пропустити частину шахрайства, ніж масово блокувати чесних |
| Наш іспит: кого запросити на додаткову консультацію | середній, 0.5 | обидві помилки коштують приблизно однаково — година часу. Тут і тільки тут 0.5 справді доречні |
Зверни увагу: модель у всіх трьох рядках може бути одна й та сама. Змінюється не вона, а число, з яким порівнюють її вихід. Тому в промисловому коді модель і поріг зберігають окремо: модель перенавчають раз на місяць, а поріг переглядають щоразу, коли змінюється ціна помилки — наприклад, коли компанія вирішила, що втрачений клієнт коштує дорожче, ніж пропущене шахрайство.
Зменшуючи поріг, ти ловиш більше справжніх позитивів і водночас набираєш більше хибних тривог; збільшуючи — навпаки. Цю торгівлю описують двома знайомими метриками:
Розшифруємо літери, бо далі вони трапляться ще не раз. TP
(true positive) — модель сказала «так», і це правда. FP (false positive) —
модель сказала «так», а насправді ні: хибна тривога. FN (false negative) —
модель сказала «ні», а насправді так: пропуск.
Precision (точність): «серед тих, кого модель позначила позитивними,
скільки насправді такі?». Recall (повнота): «серед усіх справжніх
позитивних, скількох модель знайшла?». Перша захищає від хибних тривог, друга — від
пропусків. Максимізувати обидві одночасно неможливо, і поріг — саме той важіль, яким ти
обираєш, чим жертвувати.
Порахуймо на маленькому прикладі, щоб формули ожили. Хай зі 100 студентів завалили
іспит 20, і модель на порозі 0.5 позначила «завалить» 15 осіб, з яких вгадала 12.
Тоді TP = 12, FP = 15 − 12 = 3, FN = 20 − 12 = 8.
Precision дорівнює 12 / 15 = 0.80, recall — 12 / 20 = 0.60.
Опустимо поріг: модель позначає вже 30 осіб і вгадує 18 із 20. Тепер
TP = 18, FP = 12, FN = 2, precision
18 / 30 = 0.60, recall 18 / 20 = 0.90. Recall виріс, precision
впав — і жодна з цих двох моделей не «краща», поки ти не сказав, що дорожче.
Поріг і матриця плутанини
Модель зафіксована, змінюється тільки поріг. 240 студентів, гістограми прогнозованих імовірностей.
ВтратаLog-loss і чому не MSE
Тепер про навчання. Потрібна функція, яка вимірює, наскільки погані наші ймовірності. Природна ідея — узяти звичний MSE. Це працює, але погано. Правильна втрата тут — log-loss, або бінарна крос-ентропія:
Спершу символи. yi — справжня мітка
i-го обʼєкта, нуль або одиниця. pi —
ймовірність, яку модель дала позитивному класу для цього обʼєкта.
n — скільки всього обʼєктів, Σ означає «склади по всіх
обʼєктах», а ⅟n перетворює суму на середнє,
щоб число не залежало від розміру вибірки. Мінус спереду стоїть, бо логарифм числа,
меншого за одиницю, відʼємний, а штраф зручніше мати додатним.
Формула виглядає громіздко, але це два випадки, склеєні множниками. Коли
y = 1, множник (1 − y) обертається на нуль і другий доданок
зникає — лишається −ln(p). Коли y = 0, зникає перший, і
лишається −ln(1 − p). Логіка однакова: чим меншу ймовірність модель
дала правильній відповіді, тим більший штраф.
| дав правильному класу | штраф −ln(p) | як це читати |
|---|---|---|
| 0.99 | 0.01 | вгадав упевнено — майже безкоштовно |
| 0.90 | 0.11 | вгадав — дрібниця |
| 0.50 | 0.69 | чесно не знав — середня ціна |
| 0.10 | 2.30 | помилився — уже втричі дорожче за незнання |
| 0.01 | 4.61 | помилився впевнено — дорого |
| 0.001 | 6.91 | і чим упевненіше, тим дорожче, без стелі |
Останній рядок і є головна риса log-loss: впевнено помилитись коштує як завгодно
дорого. Коли p прямує до нуля, −ln(p) прямує до
нескінченності.
(1 − 0)² = 1 проти (1 − 0.5)² = 0.25 за чесне
незнання. Логарифм карає її необмежено. Саме тому модель, навчена на log-loss, стає
обережною: краще сказати «не знаю, 0.5», ніж упевнено збрехати.Але головна причина глибша. MSE поверх сигмоїди — невипукла функція параметрів: на її поверхні бувають плато й ями, у яких спуск застрягає, і немає гарантії, що знайдений мінімум глобальний. Log-loss же випукла завжди — у неї рівно один мінімум. Слово «випукла» тут те саме, що в темі про градієнтний спуск: форма чаші, дно рівно одне, і звідки не почни — прийдеш у ту саму відповідь.
Звідки береться ця невипуклість — механізм. Виною насичення сигмоїди, те саме,
що вище рятувало нас від впливу далеких точок. Уяви студента, який насправді склав
(y = 1), а модель поки що дає йому p = 0.02. Це груба помилка,
і чесна функція втрат мусила б тягнути коефіцієнти щосили. Що ж робить MSE? Її штраф
дорівнює (1 − 0.02)² = 0.96 — майже максимум, більше нікуди рости. А
швидкість, з якою цей штраф зменшується при зсуві коефіцієнтів, залежить від
крутості сигмоїди в цій точці, а вона там майже нульова. Виходить парадокс: помилка
величезна, а сигнал до виправлення — крихітний.
Цей парадокс і згинає поверхню. Рухаючись від «дуже неправильно» до «правильно»,
поверхня MSE спершу майже пласка (штраф уперся в стелю 1), потім різко падає посередині,
потім знову вирівнюється (штраф уперся в підлогу 0). Форма виходить не як чаша, а як
сходинка — а сходинка опукла лише знизу: у верхньої її частини кривина
протилежна, і саме там хорда провалюється під криву. Межу видно точно: для правильної
мітки y = 1 квадратична втрата (σ(z) − 1)² увігнута скрізь, де
σ(z) менша за 1/3, тобто скрізь, де модель дає правильній
відповіді менше за третину. Log-loss стелі не має, і саме тому в неї сходинки не
виходить: чим гірша помилка, тим стрімкіше росте штраф, і стінки чаші лише крутішають.
Перевірити випуклість можна прямо очима. Функція випукла, коли для будь-яких двох точок відрізок між ними (хорда) лежить не нижче за саму функцію. Якщо знайдеться хоч один напрямок, де крива вилазить над хордою, функція невипукла.
Тест хорди: log-loss проти MSE
Ліворуч — карта втрат за параметрами. Праворуч — профіль уздовж хорди; суцільна лінія — функція, пунктир — хорда.
Повзунок має 180 положень — по одному на кожен градус, і цього досить, щоб перебрати всі напрямки на площині. Якщо пройти їх усі поспіль, вийде така картина: MSE вилазить над своєю хордою у 169 напрямках зі 180, причому в 158 із них помітно (більш ніж на 3% висоти графіка), а найгірше порушення — 17.3% при 96°. Чисті напрямки теж є, і їх легко знайти: єдина смуга від 150° до 158°, де порушення рівно нульове (на табло воно показується нулем аж до 159°, бо там уже 0.01%). Log-loss не порушує умову в жодному з 180 напрямків, і це не щастя вибірки: для log-loss випуклість доведена аналітично, для будь-яких даних і будь-якої кількості ознак.
Різниця між «майже завжди» і «завжди» тут вирішальна. Опуклість — не статистична властивість, а гарантія: досить одного порушення, щоб її не стало, і разом із нею зникає обіцянка, що знайдений спуском мінімум — глобальний.
ПравдоподібністьЗвідки взялася ця формула
Log-loss не витягнули з капелюха — вона випливає з методу максимальної правдоподібності (maximum likelihood estimation, MLE). Логіка така: серед усіх наборів параметрів обираємо той, за якого спостережені дані найімовірніші.
Спершу — сама ідея, без жодної формули. Уяви дві монети: чесну й криву, що падає орлом у девʼяти випадках із десяти. Тобі показують результат десяти кидків: девʼять орлів і одна решка. Якою монетою кидали? Ти майже напевно скажеш «кривою» — і зробиш це саме за принципом правдоподібності: обираєш ту гіпотезу, за якої побачене виглядає найзвичайніше. Чесна монета теж могла дати девʼять орлів, просто це малоймовірно.
Логістична регресія робить рівно те саме, тільки гіпотез у неї не дві, а нескінченно
багато — по одній на кожен набір коефіцієнтів. Питання те саме: за яких
β та картина складань і провалів, яку ми справді бачили, найімовірніша?
Слово правдоподібність (likelihood) саме це й означає: ймовірність
побачити наявні дані, порахована за конкретної гіпотези. Далі — чотири кроки, які
перетворюють це речення на формулу.
Модель каже, що студент складе з імовірністю pᵢ. Тоді ймовірність
побачити те, що ми справді побачили, записується одним виразом:
Читається так: якщо студент склав, беремо ту ймовірність, яку модель дала
складанню; якщо не склав — ту, яку вона дала провалу. Показник степеня тут працює
вимикачем, бо будь-яке число в нульовому степені дорівнює одиниці. Перевір:
при y = 1 вираз стає
p1·(1 − p)0 = p · 1 = p,
при y = 0 — p0·(1 − p)1 = 1 − p.
Один запис замість «якщо-інакше».
Спостереження вважаємо незалежними — доля одного студента не впливає на долю
іншого, — а ймовірності незалежних подій перемножуються. Так само, як імовірність
двічі підряд викинути шістку дорівнює 1/6 · 1/6:
Значок Π — велика грецька «пі»; він означає «перемнож по всіх
обʼєктах», так само як Σ означає «склади». А ℒ(β) —
це і є правдоподібність: одне число, яке каже, наскільки добре набір коефіцієнтів
β пояснює всю нашу вибірку. Що воно більше, то краще.
Добуток сотень чисел, менших за одиницю, миттєво провалюється в машинний нуль:
навіть 300 множників по 0.9 дають число близько 10−14,
а 700 — уже менше, ніж комп’ютер здатен відрізнити від нуля. Логарифм перетворює
добуток на суму (це та сама властивість ln(a·b) = ln a + ln b) і
розвʼязує проблему. При цьому місце максимуму не зсувається: логарифм
монотонний — більшому числу відповідає більший логарифм, — тож
набір β, за якого ℒ найбільша, і набір, за якого
найбільший ln ℒ, — це той самий набір:
Оптимізатори за традицією мінімізують. Ставимо мінус, ділимо на n —
і отримуємо рівно ту log-loss, що була вище:
Отже, мінімізація log-loss і максимізація правдоподібності — одна й та сама дія з різними
знаками. Ділення на n потрібне лише для зручності: воно робить втрату
середньою на обʼєкт, тож число не залежить від розміру вибірки, а місце мінімуму від
сталого множника не змінюється.
Прокрутімо це на трьох студентах, щоб побачити механізм у числах. Хай перший склав
(y = 1), другий склав, третій ні. Гіпотеза A дає їм імовірності складання
0.9, 0.8 і 0.2; гіпотеза B — 0.6, 0.6 і 0.6. Правдоподібність A:
0.9 · 0.8 · (1 − 0.2) = 0.576. Правдоподібність B:
0.6 · 0.6 · (1 − 0.6) = 0.144. Перша гіпотеза пояснює побачене вчетверо
краще, тому MLE обере її. Ті самі числа через log-loss: для A
−(ln 0.9 + ln 0.8 + ln 0.8) / 3 = 0.184, для B
−(ln 0.6 + ln 0.6 + ln 0.4) / 3 = 0.646. Менша втрата — у тієї самої
гіпотези A. Два записи, одне рішення.
У лінійній регресії працює той самий принцип: якщо припустити, що шум навколо прямої нормальний, MLE дає точнісінько метод найменших квадратів. Тобто і MSE, і log-loss — не два різні смаки, а одна ідея «обери найправдоподібніше», застосована до двох різних припущень про дані.
ГрадієнтЯк це насправді рахують
Прирівняти похідну до нуля й розвʼязати, як у лінійній регресії, тут не вийде: рівняння трансцендентне — у ньому невідоме сидить і всередині експоненти, і поза нею, — і замкненого розвʼязку воно не має. Не «ніхто не додумався», а не існує запису через звичні операції. Доводиться йти ітераціями, тим самим градієнтним спуском — і тут на нас чекає найкрасивіший факт теми.
Нагадаємо позначення: градієнт ∇L (значок читається
«набла») — це просто список усіх часткових похідних одразу, по одній на кожен параметр.
Він каже, у який бік втрата зростає найшвидше, а спуск іде проти нього.
Візьмемо похідну log-loss по одному коефіцієнту βj.
Ланцюг тут із трьох ланок: коефіцієнт впливає на логіт, логіт — на ймовірність,
ймовірність — на втрату. Отже, перемножуємо три похідні.
Беремо внесок одного обʼєкта, −[y ln p + (1 − y) ln(1 − p)]. Похідна
ln — це 1/аргумент, і для другого доданку зʼявляється
мінус, бо всередині стоїть 1 − p:
Останню рівність легко перевірити: зведи два дроби до спільного знаменника
p(1 − p), і в чисельнику лишиться
−y(1 − p) + (1 − y)p = p − y.
Це та сама властивість сигмоїди з розділу 04:
Логіт — це β0 + β1x1 + …,
тобто по βj він росте зі швидкістю
xj:
Перемножуємо три ланки — і громіздкий знаменник
p(1 − p) з першої ланки скорочується з таким самим множником
із другої:
Усе, що лишилось, — помилка, помножена на ознаку. Жодних експонент, жодних логарифмів.
Збираємо по всіх обʼєктах і по всіх коефіцієнтах одразу — і виходить один рядок:
Тут X — матриця ознак: рядок на обʼєкт, стовпчик на ознаку.
XT (читається «ікс транспоноване») — та сама
матриця, покладена набік: її рядки стали стовпчиками. Множення саме на транспоновану
й означає «пройди по всіх обʼєктах і для кожної ознаки склади добутки помилки на
значення цієї ознаки» — рівно те, що ми щойно вивели для одного
βj. Вираз σ(Xβ) − y — вектор помилок:
скільки модель дала мінус скільки було насправді.
Порівняй із градієнтом лінійної регресії:
∇L = (2/n)·Xᵀ(Xβ − y). Різниця лише в сталому множнику й у тому, що прогноз
пропущено крізь сигмоїду. Структура ідентична: матриця ознак, транспонована,
помножена на вектор помилок. Це не збіг: обидві моделі належать до
узагальнених лінійних моделей (generalized linear models) — сімейства,
де прогноз завжди будується як лінійна комбінація ознак, пропущена крізь одну фіксовану
функцію. Для всього сімейства градієнт має цю форму. Далі — звичайний градієнтний
спуск:
Символ := означає «стало новим значенням», а η («ета») — та
сама швидкість навчання, що й у попередній темі: додатне число, яке ми обираємо самі й
яке задає довжину кроку.
Градієнтний спуск на log-loss
Ліворуч — карта log-loss за параметрами (світле = менше). Праворуч — падіння помилки за ітераціями.
scikit-learn за
замовчуванням бере lbfgs — квазіньютонів метод, який наближає й другу похідну
і тому збігається за десятки ітерацій замість тисяч. Для великих вибірок — стохастичні
варіанти. Ідея скрізь та сама: порахуй градієнт, зроби крок.ДисбалансКоли поріг 0.5 стає катастрофою
Уяви задачу з рідкісним позитивним класом: шахрайські транзакції, відмова обладнання, рідкісна хвороба. Позитивів 2%. Модель чесно вивчить, що апріорі подія малоймовірна, і майже ніколи не видаватиме ймовірність вище 0.5. Формально вона права — практично на порозі 0.5 вона мовчить. А accuracy при цьому виглядатиме чудово: тривіальний класифікатор «завжди негативний» дає 98% правильних відповідей, не роблячи нічого. Тому accuracy на незбалансованих даних — беззмістовна метрика: вона вимірює не якість моделі, а рідкість класу.
Дисбаланс тягне поріг униз
Повзунок змінює частку позитивного класу. Модель перенавчається щоразу; гістограми показують, куди зʼїхали ймовірності.
class_weight='balanced': у формулі втрати помилки на рідкому
класі домножують на більший ваговий коефіцієнт, і межа повертається до 0.5. Або змінити
склад вибірки — викинути частину прикладів частого класу (undersampling) чи
дописати синтетичних представників рідкого (SMOTE). Але метрику треба міняти
обовʼязково: замість accuracy —
precision, recall і F1 або
площа під кривою. Найінформативніша тут
PR-AUC — площа під кривою precision-recall: на відміну від accuracy вона взагалі не
враховує величезну купу правильно вгаданих негативів і тому не «покращується» від самої
лише рідкості класу.ІнтерпретаціяКоефіцієнти й відношення шансів
У лінійній регресії коефіцієнт читався просто: «плюс одиниця ознаки — плюс β до
прогнозу». Тут так не можна, бо β живе на шкалі логіта. Але правило є — просто замість
додавання буде множення. Запишемо шанси для x і x + 1 та
поділимо одні на одні:
Величина x скоротилася. Отже, відношення не залежить від того,
з якої точки ми стартували.
Це і є відношення шансів (odds ratio): збільшення ознаки на одиницю
множить шанси позитивного результату на e^β₁. Якщо β₁ = 0.36, то
e^0.36 ≈ 1.43 — кожна додаткова година підвищує шанси скласти приблизно на
43%. Відʼємний β₁ дає множник менший за одиницю, нульовий — рівно 1.
А ось і пастка: множник на шанси сталий, а зміна імовірності — ні. Той самий коефіцієнт дає велику зміну посередині кривої і майже нульову на хвостах.
Сталий множник шансів
Угорі — ймовірність на шести кроках ознаки. Унизу — ті самі шанси й множник між сусідніми стовпчиками.
Багато класівSoftmax і one-vs-rest
Досі класів було два. Якщо їх K, є два стандартні шляхи.
One-vs-Rest (OvR)
Навчити K окремих бінарних моделей: перша відрізняє клас 1 від усіх решти,
друга — клас 2 від решти, і так далі. На прогнозі запускають усі K і беруть
клас із найбільшою ймовірністю. Мінус: моделі навчаються незалежно, тому їхні
«ймовірності» не узгоджені й не дають у сумі одиницю.
Softmax (мультиноміальна регресія)
Чесніший варіант: одна модель, яка одразу рахує K логітів і нормує їх:
Розберемо запис. zk — логіт
k-го класу, тобто своя лінійна комбінація ознак зі своїм набором
коефіцієнтів. Чисельник підносить e до цього логіта, знаменник складає такі
самі величини по всіх класах. Експонента робить усі числа додатними (у якому
степені не піднось e, відʼємним воно не буде), а ділення на суму дає
гарантію, що всі K імовірностей у сумі дадуть рівно одиницю.
При K = 2 softmax алгебраїчно зводиться до сигмоїди — і це можна побачити
за один рядок. Поділимо чисельник і знаменник на
ez2:
Тобто для двох класів значення має лише різниця логітів, і сигмоїда від цієї різниці — та сама формула, яку ми вивели в розділі 04. Softmax — її пряме узагальнення, а не окремий винахід.
Втрата теж узагальнюється, до категорійної крос-ентропії
−Σ yk ln pk: мітка
y тут — вектор із одиницею навпроти правильного класу й нулями в решті
позицій, тому із суми виживає єдиний доданок — мінус логарифм імовірності, яку модель
дала правильному класу. Те саме, що й у бінарному випадку. Саме ця пара —
softmax і крос-ентропія — стоїть на виході майже будь-якої класифікаційної
нейромережі.
РегуляризаціяЧому тут вона обовʼязкова
Тут регуляризація потрібна навіть
частіше, ніж у лінійній регресії, і причина специфічна. Якщо класи лінійно роздільні — існує пряма, що ідеально їх
розділяє, — правдоподібність не має максимуму всередині простору параметрів. Модель може
нескінченно збільшувати β₁, роблячи сигмоїду дедалі крутішою, а log-loss
дедалі ближчою до нуля, ніколи його не досягаючи. Оптимізатор розжене коефіцієнти до
нескінченності або впреться в ліміт ітерацій.
Варто побачити, чому саме нескінченність. Візьми будь-яку пряму, що ідеально
розділяє класи, і помнож усі її коефіцієнти на 10. Межа лишиться на тому самому місці —
адже вона задана рівнянням z = 0, а помножене на 10 рівняння має ті самі
корені, — але логіти всіх точок зростуть удесятеро, і сигмоїда видасть кожній із них
ще впевненішу відповідь. Log-loss від цього трохи впаде. Помнож на 100 — впаде ще.
Мінімуму немає, бо покращувати можна вічно, ніколи не дійшовши до нуля.
Штраф зупиняє цю втечу, бо робить надто великі ваги невигідними:
C у scikit-learn. Там задають не
λ, а обернену величину C = 1/λ. Тобто маленьке C
означає сильну регуляризацію. І ще: LogisticRegression застосовує
L2-штраф за замовчуванням, з C = 1. Якщо ти цього не знаєш,
можеш довго дивуватися, чому коефіцієнти не збігаються з розрахованими вручну.Розберемо символи штрафу. λ («лямбда») — сила регуляризації, додатне
число, яке обираєш ти: нуль означає «штрафу немає», велике значення — «ваги мають бути
дуже маленькими». Σ βj2 —
сума квадратів усіх коефіцієнтів (штраф L2), а Σ |βj| —
сума їхніх модулів (штраф L1). Обидва ростуть разом із вагами, тому оптимізатор більше не
може розганяти коефіцієнти безкарно: за кожну одиницю ваги він тепер платить.
І ще: штраф залежить від масштабу ваг, а ваги — від масштабу ознак. Ознака в тисячах отримає крихітну вагу й фактично уникне штрафу, ознака в десятих — навпаки. Тому перед регуляризованою логістичною регресією ознаки стандартизують завжди.
ПідсумокЩо варто винести
Логістична регресія лишається робочим інструментом там, де рішення треба пояснювати: кредитний скоринг, медична діагностика, страхування. Причина не в точності — бустинг зазвичай точніший, — а в тому, що кожен її коефіцієнт можна показати регулятору й пояснити словами.
| ідея | формула | чому важливо |
|---|---|---|
| логіт | ln(p/(1−p)) = z | справжнє означення моделі: лінійність на шкалі логіта |
| сигмоїда | p = 1/(1+e−z) | обернена до логіта, повертає в [0, 1] |
| межа | z = 0 | завжди пласка: пряма, площина, гіперплощина |
| log-loss | −Σ[y·ln p + (1−y)·ln(1−p)] | випукла; безмежно карає впевнену помилку |
| градієнт | ⅟n·XT(σ(Xβ) − y) | та сама форма, що й у лінійної регресії |
| eβ | відношення шансів | єдиний коректний спосіб прочитати коефіцієнт |
| поріг | p ≥ t | не частина моделі — важіль під ціну помилки |
І найголовніше: модель і рішення — різні речі. Модель дає впевненість, рішення ухвалює той, хто знає ціну помилки. Плутанина між ними коштує дорожче за будь-яку неточність алгоритму.
Куди це веде далі. Ми весь час говорили, що модель віддає ймовірність, — але чи справді число 0.7 означає, що з таких обʼєктів справджується сім із десяти? Для логістичної регресії, навченої на log-loss, це зазвичай близько до правди, а для багатьох інших моделей — ні, і тоді ймовірності доводиться виправляти окремим кроком. Про це й про систематичний вибір порога — тема 21. А наступна тема бере задачу класифікації з протилежного боку: замість того щоб підбирати межу, вона взагалі не навчається, а щоразу питає найближчих сусідів.