У кожній задачі цього курсу поруч із даними лежала колонка з відповіддю. Ціна квартири, оцінка «шахрайське / чесне», сорт іриса — хтось її колись проставив, і саме тому ми могли сказати, що модель помилилась. Приберемо цю колонку. Дані лишились, питання лишилось, а звіритись більше немає з чим.
Це не поламана задача — це інша задача, і вона зветься навчанням без учителя (unsupervised learning). Замість «передбач відповідь» тут питають: яка структура є в цих даних сама по собі. Найпростіша форма такого питання — кластеризація (clustering): розкласти обʼєкти на групи так, щоб усередині групи вони були схожі між собою, а між групами — різні.
Працюватимемо на тій самій дошці оголошень про вживані телефони, що і в темі 08. Але задача інша. Там ми знали, які оголошення шахрайські, і шукали в даних сліди цієї відповіді. Тепер питання таке: які сегменти ринку існують на цій дошці об'єктивно, за самою будовою даних, якщо ніхто нам нічого не розмічав?
01 / ПостановкаЗадача без правильної відповіді
Почнімо з того, що саме зникає разом із колонкою відповідей — бо зникає більше, ніж здається.
Зникає метрика в тому сенсі, до якого ти звик. F1, RMSE, ROC-AUC — усі вони рахують те саме: наскільки прогноз близький до правильної відповіді. Немає відповіді — немає й числа. Метрики для кластеризації існують (одну з них, силует, ми розберемо в розділі 6), але вони міряють форму розбиття: наскільки групи щільні й наскільки далеко одна від одної. Це не те саме, що «правильно».
Зникає поділ на навчальну й тестову частини. Ми ділили дані, щоб чесно поміряти якість на тому, чого модель не бачила (тема 03). Міряти тут нічого — кластеризацію будують одразу на всьому, що є.
Зникає єдина правильна відповідь. Ось найнезручніше. Ті самі оголошення можна розкласти на два сегменти й на пʼять, за ціною й за роком — і всі ці розбиття будуть однаково законними. Питання «а яке з них справжнє?» просто не має сенсу, бо справжнього немає. Є розбиття, корисні для конкретної задачі, і є марні.
Тоді навіщо вона взагалі? Через чотири речі, і кожна з них траплятиметься тобі частіше, ніж здається.
| навіщо | що саме роблять | приклад на нашій дошці |
|---|---|---|
| Сегментація | розкласти обʼєкти на групи, з якими далі працюють по-різному | дешеві старі телефони, свіжі дорогі, міцна середина — для кожного сегмента своя порада продавцеві |
| Стиснення | замінити обʼєкт номером його групи або координатами центра | замість двох чисел на оголошення — один номер сегмента; так стискають кольори в зображеннях і сигнали в звуці |
| Розвідка | побачити будову даних до того, як ставити гіпотези | чи є на дошці окрема група «майже нових дорогих» — чи це просто хвіст однієї великої хмари |
| Підготовка | розбити велику задачу на кілька менших або заповнити пропуски по групі | пропущену ціну заповнити медіаною свого сегмента, а не всієї таблиці (тема 09) |
Спільне в усіх чотирьох одне: результат оцінюють за тим, чи став кориснішим наступний крок, а не за збігом із розміткою.
Наші дані на цю тему такі. Беремо з дошки 1 100 оголошень, у яких є ціна (у решти вона пропущена, а кластеризація на відстанях без числа працювати не вміє), і рівно дві ознаки: ціну й рік випуску. Двох досить, щоб усе бачити на площині; у практиці додамо третю й подивимось, що зміниться.
Ціну беремо не в гривнях, а як логарифм ціни. Причина стара й знайома з теми 10: різниця між 1 000 і 2 000 грн для покупця така сама, як між 10 000 і 20 000, а в гривнях це 1 000 проти 10 000. Логарифм робить ці дві відстані однаковими. Далі обидві ознаки приводимо до спільної шкали — z-оцінки: віднімаємо середнє, ділимо на стандартне відхилення. Чому це не порада, а обовʼязок, розберемо в розділі 7, і там буде видно, у що виливається пропуск цього кроку.
02 / ІдеяІдея k-середніх
Метод k-середніх (k-means) описується одним абзацом, і це майже вся теорія.
Розберемо три слова, бо кожне щось приховує.
«Найближчий» — за звичайною евклідовою відстанню (euclidean distance). Це та сама відстань, яку на аркуші паперу дає теорема Піфагора. Дві ознаки — два катети: різниця по ціні й різниця по році. Відстань між точками — гіпотенуза: піднеси кожну різницю до квадрата, склади й візьми корінь. Скажімо, від точки (0.4; −0.3) до точки (1.0; 0.5) різниці дорівнюють 0.6 і 0.8, квадрати — 0.36 і 0.64, сума — 1.00, корінь — 1.00. Ознак більше двох — правило не міняється: квадрат різниці по кожній, усе додати, взяти корінь.
Корінь при цьому можна навіть не рахувати. Щоб зʼясувати, який центр ближчий, досить порівняти суми квадратів: більшій сумі завжди відповідає більший корінь, і порядок «ближче — далі» від цього не змінюється.
«Середина групи» — це середнє арифметичне координат усіх її точок, окремо по кожній ознаці. Звідси й назва: k середніх. Ця точка зветься центроїдом (centroid) і зазвичай не збігається з жодним реальним оголошенням — це вигадана «типова» точка групи.
«k» — кількість груп, і її задаєш ти. Алгоритм її не шукає й не може знайти: скільки попросиш, стільки й нарисує. Це найважливіше обмеження методу, і розділ 6 цілком про нього.
Формально алгоритм (його звуть алгоритмом Ллойда) — це чотири рядки:
Усе. Ніякої оптимізації з підбором швидкості навчання, жодних похідних: два прості кроки по черзі — і вони самі сходяться. Чому саме сходяться, побачимо в розділі 4. Більшість моделей, до яких ми дійдемо далі в курсі, навчаються зовсім інакше — дрібними кроками підкручують свої числа в потрібний бік, і кожен такий крок треба ще й правильно відміряти. Тут цього немає взагалі, і в цьому окрема краса методу.
03 / РукамиТри ітерації руками
Найкращий спосіб повірити в цей алгоритм — прокрутити його на числах, які можна перевірити на калькуляторі. Візьмімо з дошки десять оголошень навмання — відкинувши лише кілька найдорожчих викидів, щоб числа лишались читабельними, — і два центри.
Обидві ознаки вже переведені в z-оцінки й округлені до одного знака, щоб арифметика
лишалась читабельною. Нагадаю, як читати z: нуль — це середнє по всій дошці,
−1 — на одне стандартне відхилення нижче, +1.5 — на півтора
вище. Для ціни «нуль» — це приблизно 4 075 грн, для року — 2020-й.
Стартові центри поставимо в два реальні оголошення — A3 і A9. Вибір поганий: обидва з 2017 року, тобто обидва центри стоять на самому дні картинки. Це навмисно — так добре видно, як вони звідти виповзають.
Таблиця 1 · Три ітерації, усі числа
Для кожного оголошення — квадрат відстані до першого й до другого центра. Менший із двох виділено: саме туди точка й іде.
| ітерація 1 | ітерація 2 | ітерація 3 | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| оголошення | z | d² до K1 | d² до K2 | → | d² до K1 | d² до K2 | → | d² до K1 | d² до K2 | → |
| A1 | −0.5, 1.1 | 10.76 | 7.57 | K2 | 7.69 | 1.06 | K2 | 6.47 | 1.31 | K2 |
| A2 | −1.0, −1.1 | 2.41 | 2.12 | K2 | 1.57 | 5.09 | K1 | 0.70 | 6.65 | K1 |
| A3 | −2.5, −1.5 | 0.00 | 8.41 | K1 | 0.27 | 13.18 | K1 | 0.63 | 15.55 | K1 |
| A4 | 0.1, 1.5 | 15.76 | 9.09 | K2 | 12.03 | 0.83 | K2 | 10.33 | 0.64 | K2 |
| A5 | 0.6, 1.5 | 18.61 | 9.04 | K2 | 14.63 | 0.75 | K2 | 12.51 | 0.36 | K2 |
| A6 | 1.1, 0.7 | 17.80 | 5.33 | K2 | 14.29 | 0.46 | K2 | 11.73 | 0.26 | K2 |
| A7 | 1.0, 1.5 | 21.25 | 9.36 | K2 | 17.07 | 1.05 | K2 | 14.62 | 0.50 | K2 |
| A8 | 1.7, 1.5 | 26.64 | 10.69 | K2 | 22.11 | 2.35 | K2 | 19.07 | 1.51 | K2 |
| A9 | 0.4, −1.5 | 8.41 | 0.00 | K2 | 7.23 | 4.62 | K2 | 5.18 | 5.81 | K1 |
| A10 | −2.0, −0.6 | 1.06 | 6.57 | K1 | 0.27 | 7.44 | K1 | 0.25 | 9.16 | K1 |
| центр K1 | −2.500, −1.500 | −2.250, −1.050 | −1.833, −1.067 | |||||||
| центр K2 | 0.400, −1.500 | 0.425, 0.650 | 0.629, 0.900 | |||||||
| інерція | 54.26 | 13.22 | 11.33 | |||||||
Простеж очима три речі.
Перша: центри виповзають з дна. K1 пройшов шлях (−2.5, −1.5) → (−2.25, −1.05) → (−1.833, −1.067) → (−1.275, −1.175), K2 — (0.4, −1.5) → (0.425, 0.65) → (0.629, 0.9) → (0.667, 1.3). Ніхто їх не тягнув: кожен просто щоразу ставав середнім своїх точок.
Друга: приналежність міняється, і не один раз. На першій ітерації A2 пішло до K2, на другій повернулось до K1. A9 три ітерації трималось за K2 і перебігло до K1 аж на третій — там різниця була мізерна, 5.18 проти 5.81. Оголошення на межі перекидаються туди-сюди довше за всіх, і ми ще повернемось до A9 в розділі 6.
Третя: сума квадратів падає весь час — 54.26, 13.22, 11.33, 9.07. Вона й є те, що метод мінімізує, і зараз розберемось чому саме вона.
А тепер те саме, але на всіх 1 100 оголошеннях і з трьома центрами. Тисяча сто точок руками не порахуєш, зате видно те, чого не видно в таблиці, — як межі між групами переповзають картинкою.
Інтерактив 1 · Ітерації наочно
Тисяча сто оголошень, три центри, поставлені в три випадкові оголошення. Тисни «крок» і дивись, як точки перефарбовуються, центри переїжджають, а інерція спадає.
04 / ІнерціяЩо саме мінімізується
Ми жодного разу не сказали алгоритму, чого домагатись. А він домагається — і цілком конкретної величини. Вона зветься інерцією (inertia), і це сума квадратів відстаней від кожної точки до центра її власного кластера:
Словами: візьми кожне оголошення, зміряй відстань до центра його групи, піднеси до
квадрата, склади все. Символ xi — координати
i-го оголошення, c — координати центра тієї групи, у яку воно потрапило,
подвійні риски — довжина вектора між ними, тобто відстань. Що менша інерція, то
щільніше точки тиснуться до своїх центрів.
Чому саме квадрат, а не сама відстань? Дві причини. Перша практична: квадрат позбавляє кореня, і все стає простішим. Друга змістовна: середнє арифметичне — рівно та точка, яка мінімізує суму квадратів відстаней. Не сума відстаней, а сума їхніх квадратів. Тобто крок «постав центр у середнє» — не інтуїція, а точний розвʼязок задачі мінімізації. Ось він у два рядки, для однієї ознаки:
Шукаємо точку c, для якої сума квадратів відстаней до заданих чисел
x1…xn найменша.
Це парабола, вітками вгору: мінімум там, де похідна дорівнює нулю.
Ділимо на −2 і розкриваємо: сума всіх x мінус n·c
дорівнює нулю. Отже:
Тобто середнє арифметичне. Для двох ознак те саме рахується окремо по кожній — вони в цій сумі не переплітаються.
Тепер видно, чому алгоритм узагалі сходиться. Кожен із двох кроків не збільшує інерцію:
- Крок «припиши до найближчого». Центри не рухаються, а кожна точка або лишається там, де була, або переходить туди, де відстань менша. Внесок кожної точки в суму не зростає — отже, і вся сума не зростає.
- Крок «перерахуй центри». Приналежність не міняється, а кожен центр стає в точку, яка мінімізує суму квадратів усередині своєї групи. Це щойно виведено. Знову: не більше, ніж було.
Різних розбиттів на k груп скінченна кількість, інерція не зростає, а те саме розбиття двічі підряд означає зупинку. Тому алгоритм завжди закінчується за скінченне число кроків. На нашій десятці це сталось за чотири ітерації, на 1 100 оголошеннях — за одинадцять (дванадцятий прохід уже нічого не міняє й лише підтверджує зупинку).
Ще одна властивість інерції, про яку варто памʼятати заздалегідь: вона завжди спадає, коли ростить k. Більше центрів — коротші відстані. При k, рівному кількості точок, кожна точка стає власним центром і інерція дорівнює нулю. Тому питання «яке k дає найменшу інерцію» безглузде, і в розділі 6 доведеться шукати інший підхід.
05 / СтартРізний старт — різна відповідь
Локальний мінімум — не теоретичне застереження. Це те, з чим ти зіткнешся на першому ж запуску, і виглядає воно так: та сама функція, ті самі дані, два запуски — дві різні відповіді.
Ось чотири запуски k-means на наших 1 100 оголошеннях, k = 3. Різниця між ними тільки в тому, у які три оголошення поставлено початкові центри.
Інтерактив 2 · Чотири старти, чотири відповіді
Перемикай стартову розкладку. Порожні кружечки — де центри стояли спочатку, ромби — куди приїхали. Дивись на інерцію внизу праворуч.
Найкращий із чотирьох стартів дає інерцію 803.43, найгірший — 880.78. Це на 9.6 % більше, і різниця не косметична: у поганому розбитті одна група збирає дешеві телефони всіх років підряд, а «свіжі» й «старі» розлазяться по двох інших групах. Сегменти виходять інші, і бізнес-висновок із них теж інший.
Проти цього є два прийоми, і в scikit-learn обидва увімкнені за
замовчуванням — саме тому новачок про проблему може так і не дізнатись.
k-means++ — розумний старт
Кидати центри повністю навмання погано тим, що два з них легко можуть упасти в ту саму щільну хмару, а віддалену групу не помітить ніхто. k-means++ ставить центри так, щоб вони одразу розійшлися:
Тобто далекі від усіх обраних центрів точки мають найбільший шанс стати наступним
центром. Випадковість лишається, але тепер вона зміщена в бік розкиданих стартів. У
scikit-learn це параметр init="k-means++", і він стоїть за
замовчуванням.
n_init — просто спробувати кілька разів
Другий прийом прямолінійніший: запустити алгоритм кілька разів із різних
стартів і лишити той результат, у якого інерція найменша. Це параметр
n_init. Порівнювати запуски між собою можна саме тому, що інерцію рахують
без жодних міток.
n_init="auto", і з k-means++ це один запуск. Поставити
n_init=10 коштує майже нічого й помітно зменшує ризик випадково зупинитись
у поганому мінімумі. І обовʼязково фіксуй random_state: без нього два
запуски того самого коду дадуть різні кластери, і ти згаєш годину, шукаючи неіснуючу
помилку у власних даних.06 / Скільки групСкільки брати кластерів
Найчастіше питання про k-means і найчесніша відповідь на нього: універсального способу немає. Є два інструменти, які звужують вибір, і жоден із них не звужує його до однієї цифри.
Метод ліктя
Побудуємо інерцію для k від 1 до 10. Вона спадає завжди — це ми вже знаємо. Але спадає нерівномірно: спочатку кожен новий кластер приносить величезну користь, а потім уже майже ніякої. Точка, де крива з обриву переходить у пологий схил, і зветься ліктем.
Ось падіння інерції на наших даних, крок за кроком:
Де тут лікоть? Найбільший обвал — на другому кластері, але це нікому не цікаво: розбиття на дві групи буває корисним завжди. Далі два кроки поспіль дають схожу користь (266 і 230), а потім користь одразу падає більш ніж удвічі (93). Тобто лікоть десь на четвірці — але «десь», бо між 3, 4 і 5 крива згинається плавно, і три різні люди покажуть пальцем у три різні точки.
Це не вада наших даних. Різкий лікоть буває тоді, коли в даних справді є кілька відокремлених грудок — а в реальних таблицях вони частіше зливаються в одну хмару зі згущеннями. Метод ліктя чесно показує саме це.
Силует
Другий інструмент дивиться не на суму відстаней, а на кожну точку окремо й питає:
чи вона взагалі в тій групі, у якій має бути? Величина зветься
силуетом (silhouette). Для точки i беруть дві середні:
- a — середня відстань від
iдо решти точок її власного кластера. Наскільки їй тісно серед своїх. - b — середня відстань від
iдо всіх точок найближчого чужого кластера. Наскільки далеко до сусідів.
Ділення на більше з двох тримає результат у межах від −1 до +1, і читається він так:
- s ≈ +1 — свої поруч, чужі далеко. Точка сидить у своїй групі впевнено.
- s ≈ 0 — до своїх і до чужих однаково. Точка на межі, її приналежність вирішується випадковістю.
- s < 0 — до чужих ближче, ніж до своїх. Точка сидить не в тій групі: за відстанями їй місце в сусідній.
Порахуймо силует руками для оголошення A9 — того самого
Gamma X Ultra 2017 року за 5 830 грн, яке дві ітерації вагалось між
групами. У фінальному розбитті десятки воно опинилось у групі «старі й дешеві» разом із
A2, A3 і A10.
Схема 1 · Силует однієї точки
Десять оголошень із розділу 3, фінальне розбиття. Бірюзові відрізки — відстані до своїх, рожеві — до чужих.
0.205 — майже нуль, і це чесно описує становище A9: телефон дорогий, як у «свіжих», а рік як у «старих». Алгоритм мусив кудись його віднести й відніс, але впевненості в цьому рішенні немає ніякої.
Щоб оцінити ціле розбиття, силует усереднюють по всіх точках, і найкращим вважають те k, при якому середнє найбільше. Так радять усі підручники. Подивись, що з цієї поради виходить на реальних даних.
Інтерактив 3 · Вибір k
Тягни повзунок. Ліворуч — саме розбиття, знизу — крива інерції (лікоть) і крива силуету. Вони показують на різні числа.
Отже, лікоть каже 4, силует каже 2, і жоден із них не бреше. Так буває частіше, ніж навпаки — і з цього треба зробити правильний висновок, а не шукати третю метрику як арбітра.
Ось що дають ці три сегменти при k = 3 (нагадаю: центр — вигадана «типова» точка групи, а не конкретне оголошення):
| сегмент | оголошень | центр | як це читається |
|---|---|---|---|
| Дешеві старі | 355 | 1 478 грн · 2018.9 | телефони, які дослужують останній рік; ціна нижча за дві тисячі |
| Міцна середина | 264 | 5 795 грн · 2018.6 | той самий вік, але дорожчі моделі — колишній верхній сегмент, що подешевшав |
| Свіжі дорогі | 481 | 7 098 грн · 2022.7 | усе, що молодше за 2021 рік, від бюджетних до найдорожчих |
Назви придумали ми; алгоритм видав тільки номери. І зверни увагу на асиметрію: старі телефони він поділив надвоє за ціною, а свіжі лишив однією групою. Серед старих розкид цін більший — за пʼять років дешеві й дорогі моделі розійшлись, а свіжі ще тримаються купи.
07 / МасштабМасштаб ознак обовʼязковий
Ми двічі мимохідь сказали «приводимо ознаки до z-оцінок». Настав час показати, що буває, якщо цього не зробити, — бо це найпоширеніша й найтихіша помилка в кластеризації.
k-means не знає, що таке гривня й що таке рік. Він знає тільки числа, з яких рахує відстань. Подивись на розкид наших двох колонок у їхніх власних одиницях:
Різниця у 3 765 разів. У формулі відстані обидві різниці підносяться до квадрата й додаються — отже, доданок від ціни у мільйони разів більший за доданок від року. Ознака «рік» присутня у формулі й не впливає ні на що.
Схема 2 · Одні й ті самі дані, два масштаби
Ліворуч — k-means на сирих гривнях і роках. Праворуч — на тих самих даних, приведених до z-оцінок. Колір = кластер.
Зверни увагу на ліву картинку уважніше. Річ не тільки в тому, що рік проігноровано.
Сама ціна поділена так, що користі з цього нуль: 956 оголошень в одній купі, 8 — в
окремому кластері. Причина в тому, що кілька дуже дорогих оголошень (колекційні
Gamma X і одруки із зайвим нулем, знайдені ще в
темі 08) відтягли на себе цілий центр.
fit_transform на всій таблиці — правильно.Логарифм ціни при цьому не заміна масштабуванню, а окремий крок: він зменшує хвіст, щоб кілька оголошень по 80–95 тисяч не перетягнули на себе центр, а z-оцінка потім зрівнює шкали. Потрібні обидва.
08 / МежіЧого k-means не вміє
У самій будові методу заховане припущення, яке ніде не написане, але діє завжди. Кожна точка йде до найближчого центра — отже, межа між двома кластерами завжди пряма (у трьох вимірах — площина). Кластер, який отримує k-means, — це опукла область навколо свого центра, приблизно кругла.
Звідси й обмеження: k-means добре знаходить кулясті групи приблизно однакового розміру. Коли групи в даних влаштовані інакше, він усе одно щось поверне — і це «щось» буде очевидно неправильним для людського ока.
Схема 3 · Три випадки, де відповідь очевидно неправильна
У кожному наборі людина бачить групи одразу. Кольори — те, що знайшов k-means при k = 2.
Найкорисніше в цій схемі — середній випадок. Дві групи, які людина розрізняє миттєво,
для k-means не відрізняються взагалі, бо їхні центри в одній точці. Жодне k, жоден
n_init і жоден random_state цього не полагодять: тут не
пощастило з методом, а не з налаштуваннями.
Є ще три речі, про які варто знати заздалегідь.
- Викиди тягнуть центри. Центр — це середнє, а середнє чутливе до одного дикого значення (тема 08). Ми це щойно бачили: вісім оголошень із 1 100 забрали собі цілий кластер.
- Порожній кластер. Якщо до центра не потрапила жодна точка, середнє рахувати нема з чого. Бібліотеки лагодять це самі, але сам факт означає, що k завелике.
- Кожен обʼєкт потрапляє рівно в один кластер, завжди. Точок «між групами» або «ні з ким» не буває: навіть найдивніше оголошення отримає номер сегмента. Методи, які вміють казати «це шум», влаштовані інакше.
09 / ПеревіркаЧи означають кластери щось
Тепер найчесніша частина теми. У нашій таблиці все-таки є колонка
шахрайське — та сама розмітка, з якою ми розбирали дошку ще в
темі 08. Алгоритм її не бачив: він працював
лише з ціною й роком. Подивімось, чи має знайдене розбиття хоч якийсь стосунок
до неї. По дошці загалом шахрайських оголошень 12.6 % — 139 із 1 100.
| сегмент | усього | чесних | шахрайських | частка |
|---|---|---|---|---|
| Дешеві старі | 355 | 282 | 73 | 20.6 % |
| Міцна середина | 264 | 246 | 18 | 6.8 % |
| Свіжі дорогі | 481 | 433 | 48 | 10.0 % |
Сигнал є — і він слабкий. У найдешевшому сегменті шахрайських утричі більше, ніж у «міцній середині». Але жоден із трьох кластерів не є «кластером шахраїв»: навіть у найгіршому з них чотири оголошення з пʼяти чесні.
Спокуса тут очевидна: оголосити перший сегмент детектором шахрайства. Порахуймо, що з цього вийде, тими самими метриками, що й у темі 05. Якщо вважати «дешеві старі» прогнозом «шахрайське»:
Другий рядок — це орієнтир, без якого перший нічого не означає. Уяви, що ми не кластеризували нічого, а просто ткнули пальцем у 355 оголошень навмання — стільки ж, скільки в найдешевшому сегменті. Шахрайських серед них виявиться приблизно стільки ж, скільки й по всій дошці, тобто 12.6 %. Ось і вся точність випадкового тику.
Наш сегмент дає 20.6 %. Це справді краще за жеребкування, але не в рази: кластер знає щось про шахрайство, і знає мало. Практичний бік ще сумніший — «детектор» упіймав половину шахраїв, але з кожних пʼяти піднятих тривог чотири хибні. Модератор, якому дати такий список, чотири рази з пʼяти читатиме чесне оголошення.
Є ще один орієнтир, з яким ми зустрілись у темі 05: модель, яка каже «усі оголошення чесні». Вона не піднімає жодної тривоги, тож помиляється рідше за наш сегмент — 12.6 % помилок проти 32 % — і при цьому не знаходить нікого взагалі. Recall у неї нуль. Саме тому «частка правильних відповідей» тут ні про що не говорить, а precision і recall — говорять.
Є й одне число, яке підсумовує все відразу. Скоригований індекс Ренда
(adjusted Rand index) міряє, наскільки два розбиття тих самих обʼєктів схожі: 1 — повний
збіг, 0 — збіг рівно такий, який дало б випадкове перемішування. Між нашими кластерами й
колонкою шахрайське він дорівнює 0.007.
Ось найважливіший висновок усієї теми, і він не технічний. Кластеризація знаходить те, що є в геометрії даних, а не те, що тобі цікаво. Вона знайшла цінові сегменти — вони там справді є, і ними можна користуватись. Вона не знайшла шахраїв — їх у цій геометрії немає.
Тому знайдені кластери завжди перевіряють двома питаннями. Перше: чи можу я описати кожну групу словами так, щоб людина з предметної області кивнула? «Дешеві старі телефони» — так. «Кластер номер два» — ні. Друге: чи стійкі вони? Прибери десять відсотків рядків навмання, перезапусти — і подивись, чи лишилось розбиття тим самим. Кластери, які розсипаються від такої перевірки, описують не дані, а конкретний запуск.
10 / ДаліЩо далі
k-means потребує від тебе трьох речей, і всі три ти тепер знаєш: задати k, привести ознаки до спільної шкали й перевірити, що результат не залежить від щасливого старту. Він дає кулясті групи приблизно однакового розміру, і коли групи в даних не такі — мовчки дає неправильну відповідь.
Обидва його обмеження мають прямі відповіді, і саме з них починається наступна тема.
- Ієрархічна кластеризація (агломеративна) не вимагає задавати k наперед. Кожен обʼєкт спочатку сам собі кластер, далі найближчі пари зливаються, аж поки не лишиться один. Виходить дерево злиттів, яке ріжуть на будь-якій висоті — і видно, скільки груп дає кожен поріг, а не доводиться гадати наперед.
- DBSCAN взагалі не рахує центрів. Він шукає місця, де точки лежать щільно, і нарощує кластер від точки до точки — тому знаходить витягнуті смуги й кільця, з якими k-means не впорався. І вміє те, чого k-means не вміє принципово: сказати про окрему точку «це шум».
Далі в блоці — ще два повороти: метод головних компонент, який стискає багато ознак у дві-три так, щоб дані можна було просто намалювати, і пошук аномалій — задача «знайди дивне» без жодного прикладу дивного.
practice.ipynb ми напишемо
k-means з нуля десятком рядків і подивимось, як падає інерція; звіримо свої числа з
KMeans зі scikit-learn; проженемо кілька випадкових стартів і
побачимо розкид; побудуємо криву ліктя й силует для k від 2 до 10; порівняємо розбиття до
й після масштабування; і наприкінці зіставимо кластери з колонкою
шахрайське, якої алгоритм не бачив.Далі в темі
Теорію прочитано. Тепер закріпи її на практиці.