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

Питання навпаки

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

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

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

01 / РозворотПитання навпаки

Візьмемо архів дошки — оголошення, про кожне з яких уже відомо, чим воно закінчилось, — і порахуємо, як часто в тексті приманки трапляється слово «передоплата». Нехай вийшло 75%. А тепер спитаємо те, що насправді потрібно модератору: прийшло нове оголошення зі словом «передоплата» — яка ймовірність, що воно шахрайське?

Це інше питання, і відповідь у нього інша. Перше рахує частку слова серед шахраїв, друге — частку шахраїв серед тих, хто написав слово.

Вертикальна риска читається як «за умови»: зліва стоїть подія, ймовірність якої нас цікавить, справа — те, що ми вже знаємо. Місцями їх переставити не можна.

Побутовий приклад того самого. Усі, хто виграв у лотерею, купували квиток: P(квиток | виграш) = 1. З цього ніяк не випливає, що всі, хто купив квиток, виграли — P(виграш | квиток) становить мільйонні частки. Однакові слова, протилежні за розміром відповіді.

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

02 / ТеоремаСто оголошень, чотири клітинки

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

Схема 1 · Сто оголошень і слово «передоплата»

Кожен квадратик — одне оголошення з архіву. Ті самі сто квадратиків читаються двома різними способами, і числа виходять різні.

Верхній рядок — 27 оголошень зі словом, ліва колонка — 28 шахрайських, у перетині 21. Одне й те саме число 21 ділиться на два різні знаменники — звідси й дві різні відповіді.

Тепер обидва питання з розділу 1 стають арифметикою, яку видно очима.

крок 1 · що ми вміли рахувати

Скільки шахрайських оголошень пишуть «передоплата»? Дивимось лише на ліву колонку: усього шахрайських 28, слово є у 21 з них.

P(слово | шахрайство) = 21 / 28 = 0.75
крок 2 · що нам потрібно

Прийшло оголошення зі словом. Дивимось лише на верхній рядок: таких оголошень усього 27, шахрайських серед них 21.

P(шахрайство | слово) = 21 / 27 = 0.78
крок 3 · що ми щойно зробили

Чисельник в обох дробах один і той самий — 21 оголошення в перетині. Змінився знаменник: спершу ділили на «усі шахрайські», потім на «усі зі словом». Перевернути питання означає рівно одне: поміняти групу, всередині якої рахуєш частку.

Ось і все, що робить теорема Баєса. Тепер запишемо ту саму дію формулою. Замість «21» напишемо, звідки воно взялось: із 28 шахрайських слово мають 75%, тобто 28 × 0.75. А замість «27» — частку оголошень зі словом від усієї сотні.

P(шахрайство | слово) = P(слово | шахрайство) · P(шахрайство)
P(слово)

Три позначення в правій частині, і кожне вже зустрічалось у нашій таблиці:

символяк зветьсящо це в нашій таблицічисло
P(шахрайство)апріорна ймовірністьчастка шахрайських серед усіх ста оголошень — те, що ми думали до прочитання тексту28 / 100 = 0.28
P(слово | шахрайство)правдоподібністьяк часто слово трапляється в шахрайських оголошеннях21 / 28 = 0.75
P(слово)ймовірність свідченняяк часто слово трапляється взагалі, у будь-якому оголошенні27 / 100 = 0.27
P(шахрайство | слово)апостеріорна ймовірністьчого ми хочемо: частка шахрайських серед оголошень зі словомшукане

Слова «апріорна» й «апостеріорна» означають просто «до» й «після»: до того, як ми побачили текст, і після. Підставляємо:

P(шахрайство | слово) = 0.75 · 0.28 / 0.27 = 0.21 / 0.27 = 0.78

Те саме число 0.78, що ми отримали, просто порахувавши квадратики. Формула лише записала ту саму дію так, щоб її можна було виконати без намальованої сітки. І тепер видно, що вона робить: бере початкове уявлення P(шахрайство) = 0.28 й оновлює його новим фактом до 0.78.

Знаменник можна не рахувати окремо. Той самий вираз працює й для протилежної гіпотези: P(чесне | слово) = P(слово | чесне) · P(чесне) / P(слово). Знаменник у них однаковий, тож для порівняння двох варіантів його можна викинути — достатньо порівняти чисельники. Саме так модель і рахуватиме далі, а P(слово) з'явиться лише в кінці, коли треба перетворити два числа у відсотки.

03 / АпріорнаЧому вирішує те, що було до

Тепер найважливіший розділ теми. У формулі є множник P(шахрайство) — частка шахраїв на дошці до будь-яких свідчень. Здається, це дрібниця поруч із «надійністю ознаки». Насправді часто саме він і вирішує відповідь.

Уяви іншу категорію тієї самої дошки — продаж ноутбуків, де шахраїв менше: не 28, а 10 зі ста. І нехай ознака дуже пристойна: вона спрацьовує на 8 із 10 шахраїв і помиляється лише на 2 із 10 чесних. Порахуємо на сотні оголошень.

крок 1 · розкладаємо сотню

Шахрайських 10, чесних 90.

крок 2 · на кому спрацює ознака

Серед 10 шахраїв — на 80%, тобто на 8. Серед 90 чесних — на 20%, тобто на 18.

спрацювань усього: 8 + 18 = 26
крок 3 · що означає спрацювання
P(шахрайство | ознака) = 8 / 26 = 0.31

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

Причина не в тому, що ознака погана, а в тому, що чесних більше. Ознака помиляється рідко — лише на кожному п'ятому чесному, — але чесних дев'яносто, і 20% від дев'яноста більше, ніж 80% від десяти. Рідкісний клас програє арифметично: невеликий відсоток помилок на великій групі дає більше хибних спрацювань, ніж уся мала група разом узята.

Ефект тим сильніший, чим рідкісніша знахідка. Якби шахраїв було 20 на тисячу оголошень, а ознака була аж на 95% надійною, спрацювань було б 19 справжніх плюс 49 хибних — тобто лише 19 / 68 = 28%. Ознака стала надійнішою, а впевненість — навіть нижчою, бо клас став рідкіснішим.

Інтерактив 1 · Теорема Баєса на сотні оголошень

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

спрацювань
з них справжніх
хибних тривог
P(шахр | ознака)
Прожени лівий край. При 2 шахраях зі ста навіть надійність 95% дає лише 29% — більшість спрацювань хибні. Надійність тут означає одразу дві речі: на такій частці шахраїв ознака спрацьовує і на стільки ж відсотків чесних спрацьовує помилково. Кількості округлені до цілих оголошень, тож сітка й числа завжди показують одне й те саме.
Практичний висновок. Коли модель каже «ймовірність шахрайства 90%», це число вже містить у собі апріорну частку шахраїв із тих даних, на яких модель училась. Перенеси її на дошку, де шахраїв удесятеро менше, — і те саме спрацювання означатиме зовсім інше. Тут же лежить корінь проблем із рідкісними класами: та сама арифметика в темі Precision і Recall записана як точність передбачення позитивного класу.

04 / НаївністьЧому «наївний»

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

словоу шахрайських (28)у чесних (72)куди тягне
терміново199до шахрайства
передоплата216до шахрайства
дешево1611до шахрайства
новий828до чесності
торг733до чесності
гарантія326до чесності
чек031до чесності

Тепер треба об'єднати свідчення кількох слів. І тут з'являється припущення, від якого метод отримав своє ім'я. Модель рахує ймовірність цілого тексту як добуток ймовірностей окремих слів:

P(текст | шахрайство) = P(терміново | шахр) · P(передоплата | шахр) · …

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

Схема 2 · Незалежність, якої немає

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

Слова ходять парою. «Терміново» є в 19 із 28 шахрайських оголошень, «передоплата» — у 21. Якби вони траплялись незалежно, обидва разом мали б стояти приблизно в 14 оголошеннях; насправді їх 17. Хто пише «терміново», той майже завжди дописує й «передоплата».

Наслідок такий. Побачивши обидва слова, модель множить два свідчення так, ніби це дві незалежні новини. Насправді друга майже не додає інформації до першої: вона й так була очікувана. Модель рахує одне свідчення двічі й виходить самовпевненішою, ніж має право бути. Її ймовірності зсуваються до країв: там, де чесна оцінка сказала б «десь 80%», наївний Баєс легко видасть 0.99.

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

Наївний Баєс — добрий класифікатор і поганий вимірювач ймовірності. Його predict варто брати всерйоз, його predict_proba — ні. Якщо ймовірність потрібна саме як число (щоб рахувати очікувані збитки), її доводиться калібрувати окремо — CalibratedClassifierCV у scikit-learn. У логістичної регресії такої біди немає: вона вчиться саме на ймовірностях.

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

05 / ОбчисленняЯк рахується вирок

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

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

оцінка(клас) = P(клас) · P(слово1 | клас) · P(слово2 | клас) · … · P(словоn | клас)

Ймовірність слова в класі — це його частка серед усіх слів словника, порахованих у текстах класу. У шахрайських оголошеннях сім наших слів трапились разом 74 рази, у чесних — 144. Це і будуть знаменники.

крок 1 · апріорні ймовірності
P(шахрайство) = 28 / 100 = 0.28      P(чесне) = 72 / 100 = 0.72

Стартова позиція: якби текст був порожній, ми б відповіли «чесне».

крок 2 · ймовірності слів у кожному класі
P(терміново | шахр) = 19/74 = 0.2568    P(терміново | чесн) = 9/144 = 0.0625
P(новий | шахр) = 8/74 = 0.1081    P(новий | чесн) = 28/144 = 0.1944
P(передоплата | шахр) = 21/74 = 0.2838    P(передоплата | чесн) = 6/144 = 0.0417
крок 3 · два добутки
оцінка(шахр) = 0.28 · 0.2568 · 0.1081 · 0.2838 = 0.002206
оцінка(чесн) = 0.72 · 0.0625 · 0.1944 · 0.0417 = 0.000365
крок 4 · вирок і його ймовірність

Перше число більше за друге у 6.05 раза, отже вирок — шахрайство. Щоб перевести це у відсотки, ділимо на суму обох (це і є пропущений знаменник P(текст)):

P(шахрайство | текст) = 0.002206 / (0.002206 + 0.000365) = 0.86

Подивись на роботу окремих слів. «Терміново» подіяло як множник 0.2568 / 0.0625 = 4.1 на користь шахрайства, «передоплата» — як 6.8. А «новий» тягнув у протилежний бік із множником 0.1081 / 0.1944 = 0.56, майже вдвічі гасячи підозру. Разом із апріорним співвідношенням 0.28 / 0.72 = 0.39 це й дало підсумкові 6.05.

Інтерактив 2 · Що важить кожне слово

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

оцінка шахр
оцінка чесн
у скільки разів
P(шахрайство)
Смужка кожного рядка показує, куди й наскільки сильно тягне слово: праворуч — до шахрайства, ліворуч — до чесності. Довжина пропорційна логарифму відношення двох ймовірностей, тому смужки просто складаються, а добуток множників стає сумою довжин. Верхній рядок — апріорне співвідношення: вимкни всі слова, і залишиться саме воно, 28% проти 72%.

Слова додаються незалежно одне від одного, і порядок їх не цікавить: наївний Баєс бачить не текст, а мішок слів (bag of words) — які слова є і скільки разів. «Гарантія без передоплати» і «передоплата без гарантії» для нього те саме оголошення.

06 / Дві деталіНуль і ще один нуль

Метод, як ми його описали, у чистому вигляді не працює. Дві деталі, обидві про нулі, обидві обов'язкові.

Деталь перша: слово, якого не було

У таблиці розділу 4 слово «чек» у шахрайських оголошеннях трапилось нуль разів — приманки не пропонують чек. Порахуємо оголошення «Терміново, лише передоплата, дешево, є чек», де три перших слова — сильні сигнали шахрайства:

P(чек | шахр) = 0 / 74 = 0  ⟹  оцінка(шахр) = 0.28 · 0.2568 · 0.2838 · 0.2162 · 0 = 0

Добуток обнулився. Скільки б інших слів не кричало «шахрайство», один множник-нуль з'їдає їх усі, і модель із абсолютною впевненістю каже «чесне». Слово, якого просто не виявилось у навчальній вибірці, накладає вето на всі інші свідчення.

Лікування — згладжування Лапласа (Laplace smoothing, воно ж add-one smoothing). До кожного лічильника додаємо однакове маленьке число α, а до знаменника — α, помножене на розмір словника, щоб сума ймовірностей лишилась одиницею:

P(слово | клас) = кількість(слово, клас) + α
усього слів у класі + α · розмір словника

Словник має 7 слів, тож при α = 1 знаменник шахрайського класу стає 74 + 7 = 81, а чесного — 144 + 7 = 151. Ймовірність «чека» в шахраїв уже не нуль, а 1/81 = 0.0123. Мало, але не смертельно.

Змістовно α означає ось що: ми вдаємо, що перед підрахунком кожне слово словника вже один раз трапилось у кожному класі. Це страховка від твердження «такого не буває ніколи», зробленого на підставі скінченної вибірки: того, чого ти не бачив, ти не бачив — це ще не доказ неможливості. α — гіперпараметр, у scikit-learn це аргумент alpha, за замовчуванням 1.0.

Інтерактив 3 · Згладжування Лапласа

Оголошення «Терміново, лише передоплата, дешево, є чек». Три слова кричать «шахрайство», четверте не траплялось у шахраїв жодного разу. Посунь α до нуля.

P(чек | шахр)
оцінка шахр
оцінка чесн
P(шахрайство)
Крива праворуч — підсумкова ймовірність шахрайства залежно від α. На нулі вона падає рівно в нуль: одне незнайоме слово перекреслює три інші. При α = 1 виходить 0.57 — слабке «швидше шахрайство». Завелике α теж шкодить: воно підтягує всі ймовірності одну до одної й стирає різницю між класами.

Деталь друга: добуток провалюється в нуль сам

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

Нехай у тексті 300 слів і кожне має ймовірність близько 0.01. Добуток дорівнює 0.01300 — число з трьомастами нулями після коми. А найменше додатне число, яке вміщається у тип float64, — приблизно 5·10−324. Добуток провалюється в машинний нуль на 162-му слові, і далі обидва класи дають рівно 0.0. Порівнювати нічого.

Схема 3 · Чому добуток замінюють сумою

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

Ліворуч добуток падає, впирається в межу float64 і на 162-му слові стає точним нулем — після цього обидва класи невідрізнимі. Праворуч та сама величина в логарифмах спадає рівною прямою: після 300 слів це всього лише −1382.

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

log(a · b) = log a + log b  ⟹  log оцінка(клас) = log P(клас) + Σ log P(слово | клас)

Замість тисячі множень крихітних чисел — тисяча додавань чисел порядку одиниць. Порівняння при цьому не псується: логарифм зростає, тож більшому добутку відповідає більший логарифм. А що вирок ми ухвалюємо саме порівнянням, нам більше нічого й не треба. Саме тому всередині scikit-learn усі обчислення йдуть у логарифмах, а назовні є метод predict_log_proba.

Щоб із логарифмів повернутись у відсотки, від обох чисел віднімають більше з них, беруть експоненту й нормують. Різниця логарифмів мала, експонента її не переповнює — і ймовірності виходять коректними. Прийом зветься log-sum-exp, і в практиці ми зробимо його руками.

07 / РізновидиТри Баєси на одній дошці

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

Схема 4 · Три різновиди й де кожен доречний

Один метод, три способи оцінити P(ознака | клас). Приклади — з нашої дошки оголошень.

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

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

класвідносна цінавік акаунта, днів
чесні0.905 ± 0.343220 ± 94
шахрайські0.724 ± 0.28888 ± 77

Вісім чисел плюс дві апріорні ймовірності — і це вся модель. Навчальна таблиця на 360 рядків після цього не потрібна, тоді як kNN мусив тримати всі 360 рядків у пам'яті й перебирати їх на кожен запит.

Але за це доводиться платити. На відкладених 240 оголошеннях гаусів Баєс дає точність 0.871, а kNN із дев'ятьма сусідами — 0.917 (тривіальна відповідь «усі чесні» дає 0.733). Причину видно з таблиці вище: шахрайство на нашій дошці двох ґатунків — дешеві приманки й вузький «преміум»-згусток біля ринкової ціни. Це два горби по осі ціни, а гаусів Баєс має право намалювати в класі лише один: він розтягує єдиний дзвін між обома згустками й неминуче мажe. kNN, який нічого не припускає про форму, обводить обидві області окремо.

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

08 / МежіКоли він доречний

Тепер, коли метод розібраний до гвинтика, можна сказати, де його місце.

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

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

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

Слабкі місця, і всі вони випливають із наївності:

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

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

ідеясутьчому важливо
розворотP(A|B) не дорівнює P(B|A)рахуємо одне, а потрібне інше
теорема Баєсамножимо на апріорну, ділимо на ймовірність свідченнячесний спосіб перевернути питання
апріорначастка класу до будь-яких свідченьпри рідкісному класі більшість спрацювань хибні
наївністьознаки вважаються незалежнимиприпущення хибне, метод усе одно працює
вирокпорівняння двох добутківважливий порядок, а не самі числа
Лапласдодати α до кожного лічильникабез цього одне слово накладає вето
логарифмидобуток стає сумоюбез цього довгий текст дає машинний нуль
різновидичастоти, дзвони або прапорціобирається за типом ознаки

Тут закінчується блок про класичні моделі. Ти вже маєш кілька різних відповідей на одну задачу — логістичну регресію, kNN, наївного Баєса, попереду дерева рішень — і жодна з них не «найкраща». Тому наступний блок про інше: як зрозуміти, якій із них вірити. Перше питання там — перенавчання: чому модель, яка ідеально відповідає на навчальні дані, буває нікчемною на нових. Ти вже бачив це двічі: kNN при k = 1 запам'ятовував кожну випадковість архіву, а наївний Баєс без згладжування робив абсолютний висновок з одного невидимого слова. Далі це розкладається на зміщення й дисперсію — тема Bias-Variance, — а чесно міряти обидва навчить крос-валідація.

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

Далі в практиці. У practice.ipynb ти збереш той самий архів зі ста оголошень, порахуєш усі ймовірності руками на NumPy й переконаєшся, що MultinomialNB дає ті самі числа. Потім вимкнеш згладжування, перейдеш на логарифми — і порівняєш GaussianNB із kNN на числових ознаках.

Далі в темі

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