Крива, що вирішує

Логістична регресія не прогнозує клас. Вона прогнозує впевненість — а рішення ухвалюєш ти. Розібратися, де закінчується модель і починається твій вибір, важливіше за саму формулу.

Уяви, що ти ведеш курс і хочеш заздалегідь розуміти, хто з групи ризикує не скласти іспит. Єдине, що ти знаєш про кожного студента — скільки годин він реально готувався. Мітка на виході не число, а факт: склав або не склав. Одиниця або нуль.

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

ПостановкаКоли відповідь — «так» або «ні»

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

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

P(y = 1 | x) = σ(z),   де   z = β0 + β1x1 + … + βpxp

Розберемо запис по символах, бо далі вони працюватимуть на кожній сторінці. 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

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

пряма ŷ(0 год)—
пряма ŷ(30 год)—
межа прямої—
межа сигмоїди—
Що читати: рожева пряма — метод найменших квадратів, бірюзова крива — логістична регресія. Вертикальні пунктири — межі, де кожна модель перемикається з «не складе» на «складе». Логістична межа стоїть як укопана: сигмоїда майже не реагує на точки, у класифікації яких вона й так упевнена.
Головне з цього інтерактиву. Проблема не в тому, що пряма «негарна», а в тому, що вона витрачає гнучкість на дотягування до далеких точок замість точної межі. Сигмоїда для далеких точок насичена — її похідна там близька до нуля, і вони перестають впливати на розвʼязок.

ШансиІмовірність, шанси, логіт

Щоб зрозуміти, звідки береться сигмоїда, зайдемо не з формули, а з логіки. Проблема проста й груба: лінійний предиктор z уміє видавати будь-яке число — і −40, і +1200, — а ймовірність зобовʼязана лежати між 0 і 1. Два діапазони не збігаються, і їх треба якось поєднати.

Найпростіше, що спадає на думку, — просто обрізати: усе, що менше нуля, вважати нулем, усе, що більше одиниці, — одиницею. Так робити не можна, і причина не в красі. Обрізана функція плоска на обох кінцях: для студента, якому модель дала «−3», і для того, кому дала «−40», результат однаковий — нуль. Модель більше не бачить різниці між «майже не склав» і «не мав жодного шансу», а разом із різницею зникає й підказка, куди рухати коефіцієнти. Потрібне перетворення, яке стискає нескінченність у відрізок без плоских ділянок: щоб кожній парі різних z відповідали різні ймовірності.

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

крок 1 · імовірність — від 0 до 1

Це те, що ми хочемо отримати, але діапазон надто тісний: лінійний предиктор у нього не влізе.

p ∈ [0, 1]
крок 2 · шанси — від 0 до нескінченності

Шанси (odds) — це відношення ймовірності події до ймовірності її відсутності. Мова азартних ігор: «шанси три до одного».

odds = p / (1 − p)

Якщо 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 до одиниці, то більші шанси, і межі немає. Але нижня межа лишилась: шанси не бувають відʼємними, бо це відношення двох додатних чисел. Найменше, до чого вони можуть підійти, — нуль.

крок 3 · логіт — від −∞ до +∞

Лишилось прибрати нижню межу — і це вміє робити логарифм. Логарифм шансів називають логітом:

logit(p) = ln( p / (1 − 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.010.0101−4.595майже напевно ні
0.100.1111−2.197один шанс із девʼяти
0.250.3333−1.099один до трьох
0.501.00000.000рівні шанси
0.753.0000+1.099три до одного
0.909.0000+2.197девʼять до одного
0.9999.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 — той самий модуль, протилежний знак. Шкала логіта симетрична відносно нуля, і нуль на ній означає «не знаю».

Три лінійки, одна точка

Одна й та сама впевненість, записана трьома способами. Повзунок рухає точку по нижній лінійці — дві верхні йдуть за нею.

імовірність—
шанси—
Що видно: перехід від імовірності до логіта — це не нова величина, а та сама, переписана в іншій шкалі. Ближче до країв відрізка [0, 1] лінійка логіта розтягується нескінченно: різниця між 0.99 і 0.999 на шкалі ймовірності майже непомітна, а на шкалі логіта це цілих 2.3 одиниці. Саме тому модель будують на логіті: там є місце для лінійної формули.

Це і є справжнє означення логістичної регресії — вона лінійна не за ймовірністю, а за логітом:

ln( p / (1 − p) ) = β0 + β1x1 + … + βpxp = z

СигмоїдаРозвʼязуємо тотожність назад

Модель записана в термінах логіта, але прогнозувати треба ймовірність. Ми маємо рівність ln( p / (1 − p) ) = z, у якій відоме z, а шукане — p. Отже, треба розвʼязати її назад, щоб p лишилось саме зліва. Це чотири рядки шкільної алгебри, і в кінці саме собою зʼявиться сигмоїда.

крок 1 · знімаємо логарифм

Логарифм і піднесення e до степеня — дії, що взаємно скасовуються: якщо ln(a) = z, то a = ez. Тут у ролі a стоять шанси:

p / (1 − p) = ez
крок 2 · множимо обидві частини на (1 − p)

Позбуваємось дробу — і одразу розкриваємо дужки праворуч:

p = ez·(1 − p) = ez − p·ez
крок 3 · збираємо всі p ліворуч

Доданок p·ez переносимо наліво й виносимо p за дужки:

p + p·ez = ez  ⟹  p(1 + ez) = ez  ⟹  p = ez / (1 + ez)
крок 4 · причісуємо запис

Формула вже готова, але її прийнято писати інакше. Поділимо чисельник і знаменник на ez — від цього дріб не зміниться. Зверху лишиться одиниця, а знизу 1 / ez, що те саме, що e−z:

p = ez / (1 + ez) = 1 / (1 + e−z) = σ(z)

Обидва записи однакові — перевір на z = 0: e0 = 1, зліва 1 / (1 + 1) = 0.5, справа теж 1 / (1 + 1) = 0.5.

Отже, сигмоїда не обрана «бо схожа на сходинку» — вона обернена до логіта. Ми домовились, що лінійною є логарифмічна шкала шансів, і сигмоїда просто повертає нас назад в ймовірності.

Три властивості сигмоїди варто памʼятати напамʼять:

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

Тепер подивись, що роблять із кривою два її параметри. β₁ керує крутістю переходу, β₀ — його положенням.

Що роблять β₀ і β₁

Крапки внизу — ті, хто не склав; угорі — ті, хто склав. Пунктир — межа рішення при порозі 0.5.

межа, год—
точність—
log-loss—
мінімум—
Спробуй: постав β₁ = 0 — крива стає горизонтальною, модель видає ту саму ймовірність усім і межі не існує взагалі. Постав β₁ відʼємним — крива перевертається, і модель починає стверджувати, що більше готуватися шкідливо.

МежаДе модель міняє думку

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

β0 + β1x1 + … + βpxp = 0

А це — рівняння прямої, площини або гіперплощини, залежно від кількості ознак. Гіперплощина — це просто слово для «площини» у просторі, де вимірів більше за три: з двома ознаками межа є прямою на площині, з трьома — площиною в обʼємі, а з десятьма ознаками уявити її вже не можна, зате рівняння лишається тим самим. Для однієї ознаки межа вироджується в точку 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 справді доречні

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

Зменшуючи поріг, ти ловиш більше справжніх позитивів і водночас набираєш більше хибних тривог; збільшуючи — навпаки. Цю торгівлю описують двома знайомими метриками:

precision = TP / (TP + FP)      recall = TP / (TP + FN)

Розшифруємо літери, бо далі вони трапляться ще не раз. 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 студентів, гістограми прогнозованих імовірностей.

accuracy—
F1—
precision—
recall—
Крайні випадки варто побачити самому: зсунь поріг у самий низ — модель оголошує позитивними геть усіх, recall стає 1.00, а precision падає до частки позитивних у вибірці. Зсунь у самий верх — precision дорівнює 1.00, бо модель ризикує лише там, де абсолютно впевнена, зате recall майже нульовий.
Як обирають поріг у житті. Не за accuracy. Спершу формулюють вимогу — «ловити щонайменше 80% шахрайських транзакцій» або «не більше 5% хибних тривог» — а потім беруть найбільший поріг, який її задовольняє. Різниця з accuracy принципова: accuracy змішує обидві помилки в одне число, ніби вони коштують однаково, — а вони однаково не коштують майже ніколи.

ВтратаLog-loss і чому не MSE

Тепер про навчання. Потрібна функція, яка вимірює, наскільки погані наші ймовірності. Природна ідея — узяти звичний MSE. Це працює, але погано. Правильна втрата тут — log-loss, або бінарна крос-ентропія:

L = −⅟n Σ [ yi·ln(pi) + (1 − yi)·ln(1 − pi) ]

Спершу символи. yi — справжня мітка i-го обʼєкта, нуль або одиниця. pi — ймовірність, яку модель дала позитивному класу для цього обʼєкта. n — скільки всього обʼєктів, Σ означає «склади по всіх обʼєктах», а ⅟n перетворює суму на середнє, щоб число не залежало від розміру вибірки. Мінус спереду стоїть, бо логарифм числа, меншого за одиницю, відʼємний, а штраф зручніше мати додатним.

Формула виглядає громіздко, але це два випадки, склеєні множниками. Коли y = 1, множник (1 − y) обертається на нуль і другий доданок зникає — лишається −ln(p). Коли y = 0, зникає перший, і лишається −ln(1 − p). Логіка однакова: чим меншу ймовірність модель дала правильній відповіді, тим більший штраф.

дав правильному класуштраф −ln(p)як це читати
0.990.01вгадав упевнено — майже безкоштовно
0.900.11вгадав — дрібниця
0.500.69чесно не знав — середня ціна
0.102.30помилився — уже втричі дорожче за незнання
0.014.61помилився впевнено — дорого
0.0016.91і чим упевненіше, тим дорожче, без стелі

Останній рядок і є головна риса log-loss: впевнено помилитись коштує як завгодно дорого. Коли p прямує до нуля, −ln(p) прямує до нескінченності.

Асиметрія, яка й робить log-loss корисною. Квадратична помилка карає впевнену помилку лише вчетверо сильніше за невпевнену: найбільше, що вона може взяти, — це (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

Ліворуч — карта втрат за параметрами. Праворуч — профіль уздовж хорди; суцільна лінія — функція, пунктир — хорда.

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

Повзунок має 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) саме це й означає: ймовірність побачити наявні дані, порахована за конкретної гіпотези. Далі — чотири кроки, які перетворюють це речення на формулу.

крок 1 · імовірність одного спостереження

Модель каже, що студент складе з імовірністю pᵢ. Тоді ймовірність побачити те, що ми справді побачили, записується одним виразом:

P(yi) = piyi · (1 − pi)1−yi

Читається так: якщо студент склав, беремо ту ймовірність, яку модель дала складанню; якщо не склав — ту, яку вона дала провалу. Показник степеня тут працює вимикачем, бо будь-яке число в нульовому степені дорівнює одиниці. Перевір: при y = 1 вираз стає p1·(1 − p)0 = p · 1 = p, при y = 0 — p0·(1 − p)1 = 1 − p. Один запис замість «якщо-інакше».

крок 2 · імовірність усієї вибірки

Спостереження вважаємо незалежними — доля одного студента не впливає на долю іншого, — а ймовірності незалежних подій перемножуються. Так само, як імовірність двічі підряд викинути шістку дорівнює 1/6 · 1/6:

ℒ(β) = Πi piyi (1 − pi)1−yi

Значок Π — велика грецька «пі»; він означає «перемнож по всіх обʼєктах», так само як Σ означає «склади». А ℒ(β) — це і є правдоподібність: одне число, яке каже, наскільки добре набір коефіцієнтів β пояснює всю нашу вибірку. Що воно більше, то краще.

крок 3 · логарифмуємо

Добуток сотень чисел, менших за одиницю, миттєво провалюється в машинний нуль: навіть 300 множників по 0.9 дають число близько 10−14, а 700 — уже менше, ніж комп’ютер здатен відрізнити від нуля. Логарифм перетворює добуток на суму (це та сама властивість ln(a·b) = ln a + ln b) і розвʼязує проблему. При цьому місце максимуму не зсувається: логарифм монотонний — більшому числу відповідає більший логарифм, — тож набір β, за якого ℒ найбільша, і набір, за якого найбільший ln ℒ, — це той самий набір:

ln ℒ(β) = Σ [ yi ln pi + (1 − yi) ln(1 − pi) ]
крок 4 · міняємо знак

Оптимізатори за традицією мінімізують. Ставимо мінус, ділимо на n — і отримуємо рівно ту log-loss, що була вище:

L(β) = −⅟n ln ℒ(β)

Отже, мінімізація 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. Ланцюг тут із трьох ланок: коефіцієнт впливає на логіт, логіт — на ймовірність, ймовірність — на втрату. Отже, перемножуємо три похідні.

ланка 1 · втрата по ймовірності

Беремо внесок одного обʼєкта, −[y ln p + (1 − y) ln(1 − p)]. Похідна ln — це 1/аргумент, і для другого доданку зʼявляється мінус, бо всередині стоїть 1 − p:

−y/p + (1 − y)/(1 − p) = (p − y) / [ p(1 − p) ]

Останню рівність легко перевірити: зведи два дроби до спільного знаменника p(1 − p), і в чисельнику лишиться −y(1 − p) + (1 − y)p = p − y.

ланка 2 · ймовірність по логіту

Це та сама властивість сигмоїди з розділу 04:

∂p / ∂z = σ′(z) = p(1 − p)
ланка 3 · логіт по коефіцієнту

Логіт — це β0 + β1x1 + …, тобто по βj він росте зі швидкістю xj:

∂z / ∂βj = xj
разом · головне скорочення

Перемножуємо три ланки — і громіздкий знаменник p(1 − p) з першої ланки скорочується з таким самим множником із другої:

(p − y) / [ p(1 − p) ] · p(1 − p) · xj = (p − y) · xj

Усе, що лишилось, — помилка, помножена на ознаку. Жодних експонент, жодних логарифмів.

Збираємо по всіх обʼєктах і по всіх коефіцієнтах одразу — і виходить один рядок:

∇L(β) = ⅟n · XT ( σ(Xβ) − y )

Тут X — матриця ознак: рядок на обʼєкт, стовпчик на ознаку. XT (читається «ікс транспоноване») — та сама матриця, покладена набік: її рядки стали стовпчиками. Множення саме на транспоновану й означає «пройди по всіх обʼєктах і для кожної ознаки склади добутки помилки на значення цієї ознаки» — рівно те, що ми щойно вивели для одного βj. Вираз σ(Xβ) − y — вектор помилок: скільки модель дала мінус скільки було насправді.

Порівняй із градієнтом лінійної регресії: ∇L = (2/n)·Xᵀ(Xβ − y). Різниця лише в сталому множнику й у тому, що прогноз пропущено крізь сигмоїду. Структура ідентична: матриця ознак, транспонована, помножена на вектор помилок. Це не збіг: обидві моделі належать до узагальнених лінійних моделей (generalized linear models) — сімейства, де прогноз завжди будується як лінійна комбінація ознак, пропущена крізь одну фіксовану функцію. Для всього сімейства градієнт має цю форму. Далі — звичайний градієнтний спуск:

β := β − η · ∇L(β)

Символ := означає «стало новим значенням», а η («ета») — та сама швидкість навчання, що й у попередній темі: додатне число, яке ми обираємо самі й яке задає довжину кроку.

Градієнтний спуск на log-loss

Ліворуч — карта log-loss за параметрами (світле = менше). Праворуч — падіння помилки за ітераціями.

log-loss—
мінімум—
Зверни увагу на форму карти: у log-loss немає локальних ям — поверхня єдиною чашею спадає до мінімуму. Ознаку тут стандартизовано; без цього чаша витягнулась би у вузький яр і той самий крок η уже не працював би.
Що використовують на практиці. scikit-learn за замовчуванням бере lbfgs — квазіньютонів метод, який наближає й другу похідну і тому збігається за десятки ітерацій замість тисяч. Для великих вибірок — стохастичні варіанти. Ідея скрізь та сама: порахуй градієнт, зроби крок.

ДисбалансКоли поріг 0.5 стає катастрофою

Уяви задачу з рідкісним позитивним класом: шахрайські транзакції, відмова обладнання, рідкісна хвороба. Позитивів 2%. Модель чесно вивчить, що апріорі подія малоймовірна, і майже ніколи не видаватиме ймовірність вище 0.5. Формально вона права — практично на порозі 0.5 вона мовчить. А accuracy при цьому виглядатиме чудово: тривіальний класифікатор «завжди негативний» дає 98% правильних відповідей, не роблячи нічого. Тому accuracy на незбалансованих даних — беззмістовна метрика: вона вимірює не якість моделі, а рідкість класу.

Дисбаланс тягне поріг униз

Повзунок змінює частку позитивного класу. Модель перенавчається щоразу; гістограми показують, куди зʼїхали ймовірності.

accuracy @0.5—
«завжди 0»—
recall @0.5—
поріг на 70%—
Що показує бурштинова лінія: це поріг, за якого модель ловить 70% позитивів. При збалансованих класах він вище 0.5, при сильному дисбалансі падає в район десятих і сотих. Модель не стала гіршою — просто шкала її впевненості зсунулась разом з апріорною ймовірністю.
Що з цим роблять. Зсунути поріг, як в інтерактиві — найдешевше й майже завжди достатньо: модель уже знає все, що треба, просто читаємо її вихід іншою міркою. Або class_weight='balanced': у формулі втрати помилки на рідкому класі домножують на більший ваговий коефіцієнт, і межа повертається до 0.5. Або змінити склад вибірки — викинути частину прикладів частого класу (undersampling) чи дописати синтетичних представників рідкого (SMOTE). Але метрику треба міняти обовʼязково: замість accuracy — precision, recall і F1 або площа під кривою. Найінформативніша тут PR-AUC — площа під кривою precision-recall: на відміну від accuracy вона взагалі не враховує величезну купу правильно вгаданих негативів і тому не «покращується» від самої лише рідкості класу.

ІнтерпретаціяКоефіцієнти й відношення шансів

У лінійній регресії коефіцієнт читався просто: «плюс одиниця ознаки — плюс β до прогнозу». Тут так не можна, бо β живе на шкалі логіта. Але правило є — просто замість додавання буде множення. Запишемо шанси для x і x + 1 та поділимо одні на одні:

крок 1 · шанси в двох точках
odds(x) = eβ₀ + β₁x     odds(x+1) = eβ₀ + β₁(x+1)
крок 2 · ділимо
odds(x+1) / odds(x) = eβ₁

Величина x скоротилася. Отже, відношення не залежить від того, з якої точки ми стартували.

Це і є відношення шансів (odds ratio): збільшення ознаки на одиницю множить шанси позитивного результату на e^β₁. Якщо β₁ = 0.36, то e^0.36 ≈ 1.43 — кожна додаткова година підвищує шанси скласти приблизно на 43%. Відʼємний β₁ дає множник менший за одиницю, нульовий — рівно 1.

А ось і пастка: множник на шанси сталий, а зміна імовірності — ні. Той самий коефіцієнт дає велику зміну посередині кривої і майже нульову на хвостах.

Сталий множник шансів

Угорі — ймовірність на шести кроках ознаки. Унизу — ті самі шанси й множник між сусідніми стовпчиками.

e^β₁ множник—
шанси при x=5—
Δp на 1-му кроці—
найбільший Δp—
Головне спостереження: підпис між стовпчиками ніколи не змінюється — множник однаковий на кожному кроці. А різниця висот стовпчиків імовірності гуляє. Тому фраза «ознака додає 5% імовірності» для логістичної регресії просто некоректна: правильно казати про шанси.

Багато класівSoftmax і one-vs-rest

Досі класів було два. Якщо їх K, є два стандартні шляхи.

One-vs-Rest (OvR)

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

Softmax (мультиноміальна регресія)

Чесніший варіант: одна модель, яка одразу рахує K логітів і нормує їх:

P(y = k | x) = ezk / Σj ezj

Розберемо запис. zk — логіт k-го класу, тобто своя лінійна комбінація ознак зі своїм набором коефіцієнтів. Чисельник підносить e до цього логіта, знаменник складає такі самі величини по всіх класах. Експонента робить усі числа додатними (у якому степені не піднось e, відʼємним воно не буде), а ділення на суму дає гарантію, що всі K імовірностей у сумі дадуть рівно одиницю.

При K = 2 softmax алгебраїчно зводиться до сигмоїди — і це можна побачити за один рядок. Поділимо чисельник і знаменник на ez2:

ez1 / ( ez1 + ez2 ) = 1 / ( 1 + e−(z1−z2) ) = σ(z1 − z2)

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

Втрата теж узагальнюється, до категорійної крос-ентропії −Σ yk ln pk: мітка y тут — вектор із одиницею навпроти правильного класу й нулями в решті позицій, тому із суми виживає єдиний доданок — мінус логарифм імовірності, яку модель дала правильному класу. Те саме, що й у бінарному випадку. Саме ця пара — softmax і крос-ентропія — стоїть на виході майже будь-якої класифікаційної нейромережі.

РегуляризаціяЧому тут вона обовʼязкова

Тут регуляризація потрібна навіть частіше, ніж у лінійній регресії, і причина специфічна. Якщо класи лінійно роздільні — існує пряма, що ідеально їх розділяє, — правдоподібність не має максимуму всередині простору параметрів. Модель може нескінченно збільшувати β₁, роблячи сигмоїду дедалі крутішою, а log-loss дедалі ближчою до нуля, ніколи його не досягаючи. Оптимізатор розжене коефіцієнти до нескінченності або впреться в ліміт ітерацій.

Варто побачити, чому саме нескінченність. Візьми будь-яку пряму, що ідеально розділяє класи, і помнож усі її коефіцієнти на 10. Межа лишиться на тому самому місці — адже вона задана рівнянням z = 0, а помножене на 10 рівняння має ті самі корені, — але логіти всіх точок зростуть удесятеро, і сигмоїда видасть кожній із них ще впевненішу відповідь. Log-loss від цього трохи впаде. Помнож на 100 — впаде ще. Мінімуму немає, бо покращувати можна вічно, ніколи не дійшовши до нуля.

Штраф зупиняє цю втечу, бо робить надто великі ваги невигідними:

Lreg = L(β) + λ · Σ βj2   ← L2      Lreg = L(β) + λ · Σ |βj|   ← L1
Обережно з 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. А наступна тема бере задачу класифікації з протилежного боку: замість того щоб підбирати межу, вона взагалі не навчається, а щоразу питає найближчих сусідів.