У кожній задачі цього курсу поруч із даними лежала колонка з відповіддю. Ціна квартири, оцінка «шахрайське / чесне», сорт іриса — хтось її колись проставив, і саме тому ми могли сказати, що модель помилилась. Приберемо цю колонку. Дані лишились, питання лишилось, а звіритись більше немає з чим.
Це не поламана задача — це інша задача, і вона зветься навчанням без учителя (unsupervised learning). Замість «передбач відповідь» тут питають: яка структура є в цих даних сама по собі. Найпростіша форма такого питання — кластеризація (clustering): розкласти обʼєкти на групи так, щоб усередині групи вони були схожі між собою, а між групами — різні.
Працюватимемо на тій самій дошці оголошень про вживані телефони, що і в темі 08. Але задача інша. Там ми знали, які оголошення шахрайські, і шукали в даних сліди цієї відповіді. Тепер питання таке: які сегменти ринку існують на цій дошці обʼєктивно, за самою будовою даних, якщо ніхто нам нічого не розмічав?
ПостановкаЗадача без правильної відповіді
Почнімо з того, що саме зникає разом із колонкою відповідей — бо зникає більше, ніж здається.
Зникає метрика в тому сенсі, до якого ти звик. F1, RMSE, ROC-AUC — усі вони рахують те саме: наскільки прогноз близький до правильної відповіді. Немає відповіді — немає й числа. Метрики для кластеризації існують (одну з них, силует, ми розберемо в розділі 6), але вони міряють форму розбиття: наскільки групи щільні й наскільки далеко одна від одної. Це не те саме, що «правильно».
Зникає поділ на навчальну й тестову частини. Ми ділили дані, щоб чесно поміряти якість на тому, чого модель не бачила (тема 03). Міряти тут нічого — кластеризацію будують одразу на всьому, що є.
Зникає єдина правильна відповідь. Ось найнезручніше. Ті самі оголошення можна розкласти на два сегменти й на пʼять, за ціною й за роком — і всі ці розбиття будуть однаково законними. Питання «а яке з них справжнє?» просто не має сенсу, бо справжнього немає. Є розбиття, корисні для конкретної задачі, і є марні.
Тоді навіщо вона взагалі? Через чотири речі, і кожна з них траплятиметься тобі частіше, ніж здається.
| навіщо | що саме роблять | приклад на нашій дошці |
|---|---|---|
| Сегментація | розкласти обʼєкти на групи, з якими далі працюють по-різному | дешеві старі телефони, свіжі дорогі, міцна середина — для кожного сегмента своя порада продавцеві |
| Стиснення | замінити обʼєкт номером його групи або координатами центра | замість двох чисел на оголошення — один номер сегмента; так стискають кольори в зображеннях і сигнали в звуці |
| Розвідка | побачити будову даних до того, як ставити гіпотези | чи є на дошці окрема група «майже нових дорогих» — чи це просто хвіст однієї великої хмари |
| Підготовка | розбити велику задачу на кілька менших або заповнити пропуски по групі | пропущену ціну заповнити медіаною свого сегмента, а не всієї таблиці (тема 09) |
Спільне в усіх чотирьох одне: результат оцінюють за тим, чи став кориснішим наступний крок, а не за збігом із розміткою.
Наші дані на цю тему такі. Беремо з дошки 1 100 оголошень, у яких є ціна (у решти вона пропущена, а кластеризація на відстанях без числа працювати не вміє), і рівно дві ознаки: ціну й рік випуску. Двох досить, щоб усе бачити на площині — а все, що буде сказано далі, справджується так само й для двадцяти ознак: у формулі відстані просто додається більше доданків, і жодне міркування від цього не міняється.
Ціну беремо не в гривнях, а як логарифм ціни. Причина стара й знайома з теми 10: різниця між 1 000 і 2 000 грн для покупця така сама, як між 10 000 і 20 000, а в гривнях це 1 000 проти 10 000. Логарифм робить ці дві відстані однаковими. Далі обидві ознаки приводимо до спільної шкали — z-оцінки: віднімаємо середнє, ділимо на стандартне відхилення. Чому це не порада, а обовʼязок, розберемо в розділі 7, і там буде видно, у що виливається пропуск цього кроку.
ІдеяІдея 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. Порівняй це з градієнтним спуском із теми 13: там модель дрібними кроками підкручувала свої числа в потрібний бік, і довжину кожного кроку треба було ще й правильно відміряти, інакше навчання або повзло, або розліталось. Тут немає ні кроків, ні їхньої довжини — і в цьому окрема краса методу.
РукамиТри ітерації руками
Найкращий спосіб повірити в цей алгоритм — прокрутити його на числах, які можна перевірити на калькуляторі. Візьмімо з дошки десять оголошень навмання — відкинувши лише кілька найдорожчих викидів, щоб числа лишались читабельними, — і два центри.
Обидві ознаки вже переведені в z-оцінки й округлені до одного знака, щоб арифметика
лишалась читабельною. Нагадаю, як читати z: нуль — це середнє по всій дошці,
−1 — на одне стандартне відхилення нижче, +1.5 — на півтора
вище. Для ціни «нуль» — це приблизно 4 075 грн, для року — 2020-й.
Стартові центри поставимо в два реальні оголошення — A3 і A9. Вибір поганий: обидва з 2017 року, тобто обидва центри стоять на самому дні картинки. Це навмисно — так добре видно, як вони звідти виповзають.
Далі в таблиці буде багато чисел, тож порахуймо два з них разом — решта рахується рівно так само, і після цих двох прикладів ти зможеш перевірити будь-яку клітинку на калькуляторі.
Приклад 1 · відстань. Оголошення A1 має z = (−0.5, 1.1), центр K1 стоїть у (−2.5, −1.5). Різниця по першій ознаці: −0.5 − (−2.5) = 2.0. Різниця по другій: 1.1 − (−1.5) = 2.6. Квадрати: 4.00 і 6.76, сума — 10.76. Це і є перше число першого рядка таблиці. До K2 (0.4, −1.5) різниці дорівнюють 0.9 і 2.6, квадрати — 0.81 і 6.76, сума — 7.57. Сім менше за десять, отже A1 іде до K2.
Приклад 2 · новий центр. Після першої ітерації до K1 потрапили лише два оголошення: A3 (−2.5, −1.5) і A10 (−2.0, −0.6). Середнє по першій ознаці: (−2.5 − 2.0) ÷ 2 = −2.25. По другій: (−1.5 − 0.6) ÷ 2 = −1.05. Ось і центр K1 для другої ітерації — саме він стоїть у другому стовпці нижнього блоку таблиці.
Два правила, більше нічого. Уся таблиця нижче — це вони, повторені по черзі ще двічі.
Три ітерації, усі числа
Для кожного оголошення — квадрат відстані до першого й до другого центра. Менший із двох виділено: саме туди точка й іде.
| ітерація 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 оголошеннях і з трьома центрами. Тисяча сто точок руками не порахуєш, зате видно те, чого не видно в таблиці, — як межі між групами переповзають картинкою.
Ітерації наочно
Тисяча сто оголошень, три центри, поставлені в три випадкові оголошення. Тисни «крок» і дивись, як точки перефарбовуються, центри переїжджають, а інерція спадає.
ІнерціяЩо саме мінімізується
Ми жодного разу не сказали алгоритму, чого домагатись. А він домагається — і цілком конкретної величини. Вона зветься інерцією (inertia), і це сума квадратів відстаней від кожної точки до центра її власного кластера:
Словами: візьми кожне оголошення, зміряй відстань до центра його групи, піднеси до
квадрата, склади все. Символ xi — координати
i-го оголошення, c — координати центра тієї групи, у яку воно потрапило,
подвійні риски — довжина вектора між ними, тобто відстань. Що менша інерція, то
щільніше точки тиснуться до своїх центрів.
Чому саме квадрат, а не сама відстань? Дві причини. Перша практична: квадрат позбавляє кореня, і все стає простішим. Друга змістовна: середнє арифметичне — рівно та точка, яка мінімізує суму квадратів відстаней. Не сума відстаней, а сума їхніх квадратів. Тобто крок «постав центр у середнє» — не інтуїція, а точний розвʼязок задачі мінімізації. Ось він у два рядки, для однієї ознаки:
Шукаємо точку c, для якої сума квадратів відстаней до заданих чисел
x1…xn найменша.
Це парабола, вітками вгору: спершу спадає, потім зростає, і десь між тим має дно. У дна дотична горизонтальна — тобто похідна (швидкість, з якою функція міняється; ми користувались нею в темі 13) там дорівнює нулю. Прирівняймо її до нуля.
Ділимо на −2 і розкриваємо: сума всіх x мінус n·c
дорівнює нулю. Отже:
Тобто середнє арифметичне. Для двох ознак те саме рахується окремо по кожній — вони в цій сумі не переплітаються.
n · (c − m)² + S, де m — середнє наших
чисел, n — скільки їх, а S — сума квадратів їхніх відхилень
від m. У другому доданку c не бере участі взагалі: хоч куди
став центр, S не зрушить. Отже зменшувати можна лише перший доданок, а
квадрат ніколи не буває відʼємним і дорівнює нулю рівно тоді, коли c = m.
Перевір на трьох числах 1, 2 і 6. Середнє — 3, сума квадратів відхилень від
нього — 4 + 1 + 9 = 14. Постав центр не в 3, а в 4: (1−4)² + (2−4)² + (6−4)² =
9 + 4 + 4 = 17, тобто на 3 більше. І справді, n · (c − m)² = 3 · (4 − 3)² =
3. Зсув центра завжди коштує рівно стільки.Куди поставити центр
Чотири оголошення групи «старі й дешеві» з розділу 3 — і сума квадратів відстаней до них як функція того, куди поставлено центр.
Тепер видно, чому алгоритм узагалі сходиться. Кожен із двох кроків не збільшує інерцію:
- Крок «припиши до найближчого». Центри не рухаються, а кожна точка або лишається там, де була, або переходить туди, де відстань менша. Внесок кожної точки в суму не зростає — отже, і вся сума не зростає.
- Крок «перерахуй центри». Приналежність не міняється, а кожен центр стає в точку, яка мінімізує суму квадратів усередині своєї групи. Це щойно виведено. Знову: не більше, ніж було.
Різних розбиттів на k груп скінченна кількість, інерція не зростає, а те саме розбиття двічі підряд означає зупинку. Тому алгоритм завжди закінчується за скінченне число кроків. На нашій десятці вистачило трьох ітерацій, на 1 100 оголошеннях — одинадцяти. І там, і там наступний прохід уже нічого не міняє й лише підтверджує зупинку.
І остання властивість інерції — та, через яку розділ 6 узагалі існує: з ростом k вона завжди спадає. Не «зазвичай спадає», а завжди, і ось чому. Візьми будь-яке розбиття на k груп і додай (k + 1)-й центр рівно в одну з точок — у будь-яку, аби вона не була центром уже. Ця точка тепер лежить на власному центрі, і її внесок у суму став нулем. Жодна інша точка при цьому не програла: кожна або лишилась при своєму старому центрі, або знайшла новий ближчим — а ближчий центр означає менший доданок, ніяк не більший. Сума зменшилась. Так само можна додати ще один центр, і ще; при k, рівному кількості оголошень, кожна точка стає власним центром, усі відстані нульові, і інерція дорівнює рівно нулю.
Звідси висновок, який визначить увесь розділ 6: питання «яке k дає найменшу інерцію» безглузде. Відповідь на нього завжди одна й та сама — найбільше можливе k, — і користі з неї нуль. Порівнювати за інерцією можна лише розбиття з однаковим k — саме так у наступному розділі ми відрізнимо вдалий старт від невдалого. А обирати саме k доведеться чимось іншим.
СтартРізний старт — різна відповідь
Локальний мінімум — не теоретичне застереження. Це те, з чим ти зіткнешся на першому ж запуску, і виглядає воно так: та сама функція, ті самі дані, два запуски — дві різні відповіді.
Ось чотири запуски k-means на наших 1 100 оголошеннях, k = 3. Різниця між ними тільки в тому, у які три оголошення поставлено початкові центри.
Чотири старти, чотири відповіді
Перемикай стартову розкладку. Порожні кружечки — де центри стояли спочатку, ромби — куди приїхали. Дивись на інерцію внизу праворуч.
Найкращий із чотирьох стартів дає інерцію 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: без нього два
запуски того самого коду дадуть різні кластери, і ти згаєш годину, шукаючи неіснуючу
помилку у власних даних.Скільки групСкільки брати кластерів
Найчастіше питання про 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.
Силует однієї точки
Десять оголошень із розділу 3, фінальне розбиття. Бірюзові відрізки — відстані до своїх, рожеві — до чужих.
0.205 — майже нуль, і це чесно описує становище A9: телефон дорогий, як у «свіжих», а рік як у «старих». Алгоритм мусив кудись його віднести й відніс, але впевненості в цьому рішенні немає ніякої.
Щоб оцінити ціле розбиття, силует усереднюють по всіх точках, і найкращим вважають те k, при якому середнє найбільше. Так радять усі підручники. Подивись, що з цієї поради виходить на реальних даних.
Вибір k
Тягни повзунок. Ліворуч — саме розбиття, знизу — крива інерції (лікоть) і крива силуету. Вони показують на різні числа.
Отже, лікоть каже 4, силует каже 2, і жоден із них не бреше. Так буває частіше, ніж навпаки — і з цього треба зробити правильний висновок, а не шукати третю метрику як арбітра.
Ось що дають ці три сегменти при k = 3 (нагадаю: центр — вигадана «типова» точка групи, а не конкретне оголошення; на фігурах ті самі центри округлені до десятків гривень, щоб підписи були коротші):
| сегмент | оголошень | центр | як це читається |
|---|---|---|---|
| Дешеві старі | 355 | 1 478 грн · 2018.9 | телефони, які дослужують останній рік; ціна нижча за дві тисячі |
| Міцна середина | 264 | 5 795 грн · 2018.6 | той самий вік, але дорожчі моделі — колишній верхній сегмент, що подешевшав |
| Свіжі дорогі | 481 | 7 098 грн · 2022.7 | усе, що молодше за 2021 рік, від бюджетних до найдорожчих |
Назви придумали ми; алгоритм видав тільки номери. І зверни увагу на асиметрію: старі телефони він поділив надвоє за ціною, а свіжі лишив однією групою. Серед старих розкид цін більший — за пʼять років дешеві й дорогі моделі розійшлись, а свіжі ще тримаються купи.
МасштабМасштаб ознак обовʼязковий
Ми двічі мимохідь сказали «приводимо ознаки до z-оцінок». Настав час показати, що буває, якщо цього не зробити, — бо це найпоширеніша й найтихіша помилка в кластеризації.
k-means не знає, що таке гривня й що таке рік. Він знає тільки числа, з яких рахує відстань. Подивись на розкид наших двох колонок у їхніх власних одиницях:
Різниця у 3 765 разів. У формулі відстані обидві різниці підносяться до квадрата й додаються — отже, доданок від ціни у мільйони разів більший за доданок від року. Ознака «рік» присутня у формулі й не впливає ні на що.
Одні й ті самі дані, два масштаби
Ліворуч — k-means на сирих гривнях і роках. Праворуч — на тих самих даних, приведених до z-оцінок. Колір = кластер.
Зверни увагу на ліву картинку уважніше. Річ не тільки в тому, що рік проігноровано.
Сама ціна поділена так, що користі з цього нуль: 956 оголошень в одній купі, 8 — в
окремому кластері. Причина в тому, що кілька дуже дорогих оголошень (колекційні
Gamma X і одруки із зайвим нулем, знайдені ще в
темі 08) відтягли на себе цілий центр.
fit_transform на всій таблиці — правильно.Логарифм ціни при цьому не заміна масштабуванню, а окремий крок: він зменшує хвіст, щоб кілька оголошень по 80–95 тисяч не перетягнули на себе центр, а z-оцінка потім зрівнює шкали. Потрібні обидва.
МежіЧого k-means не вміє
У самій будові методу заховане припущення, яке ніде не написане, але діє завжди. Кожна точка йде до найближчого центра — отже, межа між двома кластерами завжди пряма (у трьох вимірах — площина). Кластер, який отримує k-means, — це опукла область навколо свого центра, приблизно кругла. Опукла означає ось що: візьми будь-які дві точки цієї області й проведи між ними відрізок — він увесь лежить усередині. Кільце, підкова чи літера S опуклими не бувають, і жодним k-means їх не зібрати.
Звідси й обмеження: k-means добре знаходить кулясті групи приблизно однакового розміру. Коли групи в даних влаштовані інакше, він усе одно щось поверне — і це «щось» буде очевидно неправильним для людського ока.
Три випадки, де відповідь очевидно неправильна
У кожному наборі людина бачить групи одразу. Кольори — те, що знайшов k-means при k = 2.
Найкорисніше в цій схемі — середній випадок. Дві групи, які людина розрізняє миттєво,
для k-means не відрізняються взагалі, бо їхні центри в одній точці. Жодне k, жоден
n_init і жоден random_state цього не полагодять: тут не
пощастило з методом, а не з налаштуваннями.
Є ще три речі, про які варто знати заздалегідь.
- Викиди тягнуть центри. Центр — це середнє, а середнє чутливе до одного дикого значення (тема 08). Ми це щойно бачили: вісім оголошень із 1 100 забрали собі цілий кластер.
- Порожній кластер. Якщо до центра не потрапила жодна точка, середнє рахувати нема з чого. Бібліотеки лагодять це самі, але сам факт означає, що k завелике.
- Кожен обʼєкт потрапляє рівно в один кластер, завжди. Точок «між групами» або «ні з ким» не буває: навіть найдивніше оголошення отримає номер сегмента. Методи, які вміють казати «це шум», влаштовані інакше.
ПеревіркаЧи означають кластери щось
Тепер найчесніша частина теми. У нашій таблиці все-таки є колонка
шахрайське — та сама розмітка, з якою ми розбирали дошку ще в
темі 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.
Ось найважливіший висновок усієї теми, і він не технічний. Кластеризація знаходить те, що є в геометрії даних, а не те, що тобі цікаво. Вона знайшла цінові сегменти — вони там справді є, і ними можна користуватись. Вона не знайшла шахраїв — їх у цій геометрії немає.
Тому знайдені кластери завжди перевіряють двома питаннями. Перше: чи можу я описати кожну групу словами так, щоб людина з предметної області кивнула? «Дешеві старі телефони» — так. «Кластер номер два» — ні. Друге: чи стійкі вони? І це не заклик, а вимірювання: прибери десять відсотків рядків навмання, перезапусти кластеризацію на решті — і звір нове розбиття зі старим на спільних рядках тим самим скоригованим індексом Ренда. Повтори кілька разів, щоразу викидаючи іншу десятину. Якщо індекс щоразу близький до одиниці, розбиття описує дані. Якщо він стрибає, воно описує конкретний запуск, і показувати його менеджерові як «сегменти ринку» не можна.
ДаліЩо далі
k-means потребує від тебе трьох речей, і всі три ти тепер знаєш: задати k, привести ознаки до спільної шкали й перевірити, що результат не залежить від щасливого старту. Він дає кулясті групи приблизно однакового розміру, і коли групи в даних не такі — мовчки дає неправильну відповідь.
Обидва його обмеження мають прямі відповіді, і саме з них починається наступна тема.
- Ієрархічна кластеризація (агломеративна) не вимагає задавати k наперед. Кожен обʼєкт спочатку сам собі кластер, далі найближчі пари зливаються, аж поки не лишиться один. Виходить дерево злиттів, яке ріжуть на будь-якій висоті — і видно, скільки груп дає кожен поріг, а не доводиться гадати наперед.
- DBSCAN взагалі не рахує центрів. Він шукає місця, де точки лежать щільно, і нарощує кластер від точки до точки — тому знаходить витягнуті смуги й кільця, з якими k-means не впорався. І вміє те, чого k-means не вміє принципово: сказати про окрему точку «це шум».
А закриває блок пошук аномалій — задача «знайди дивне» без жодного прикладу дивного. З кластеризацією її легко сплутати, і різницю там доведеться проводити окремо.
І ще одна пара, яка добре працює разом. Ознак у нас тут було дві — рівно щоб усе малювалось на площині. Коли їх двадцять, кластери нікуди не діваються, а от подивитись на них уже не можна. Тоді в діло йде метод головних компонент із теми 11: стиснути двадцять ознак у дві, намалювати — і аж тоді дивитись, чи схожі знайдені групи на групи.