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

Пошук аномалій

Знайти те, що не схоже на решту, — і чесно зізнатися, що «не схоже» й «те, що я шукаю» дуже часто виявляються різними речами.

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

Приклад той самий, що й у двох попередніх темах, — дошка оголошень про вживані телефони з теми 08. Ті самі 1 100 оголошень із відомою ціною й ті самі сім числових ознак: ціна, типова ціна для цієї моделі й року, оцінка з каталогу, рік випуску, памʼять, стан у балах від 1 до 4 і вік акаунта продавця. У таблиці є ще колонка шахрайське — але жоден метод цієї теми її не побачить. Ми дістанемо її аж наприкінці, щоб перевірити, чи знайшли те, що хотіли. Спойлер: не зовсім, і це головне, що варто винести з теми.

01 / ОзначенняСлово без означення

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

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

Схема 1 · Три задачі, які називають одним словом

Однакова технічна операція — «знайти несхожі рядки». Різна мета, різний наступний крок і різна ціна того, що ти помилився.

Той самий рядок може належати до будь-якої з трьох колонок — і від цього залежить, що з ним робити. Ціна 83 500 ₴ за телефон у стані «добре» — майже напевно зайвий нуль, тобто перша колонка. Ціна 95 000 ₴ за запакований флагман 2017 року — друга: рідкісне, але справжнє. Ціна 15 160 ₴ за Beta 12, яка скрізь іде по 4 310 ₴, — третя. Розрізняє їх не метод, а людина, що дивиться на рядок цілком.

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

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

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

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

02 / ПостановкаЧому це не класифікація

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

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

Аномалії різнорідні. Класифікатор навчається на тому, що спільного між обʼєктами класу. Але в аномалій спільного немає за означенням: кожна не схожа на решту по-своєму. Одне шахрайське оголошення занижує ціну вдесятеро, друге завищує втричі, третє копіює чужий текст. Модель, навчена на перших двох видах, третій не впізнає. Нормальні ж оголошення, навпаки, схожі між собою — і саме тому в цій темі модель описує норму, а аномалією називає все, що в цей опис не вписалось.

Класи вкрай незбалансовані. На нашій дошці шахрайських оголошень 139 із 1 100, тобто 12.6 %. Це вже багато для такої задачі: на справжніх майданчиках частка йде на десяті відсотка. І тут спрацьовує пастка з теми 05: модель, яка каже «усе чесне» і не робить взагалі нічого, отримує на наших даних 87.4 % accuracy, а на реальній дошці з одним відсотком шахрайства — 99 %. Число виглядає чудово й не означає нічого. Тому в цій темі accuracy не згадується більше жодного разу: працюємо з precision і recall.

03 / Одна колонкаДе ламається погляд на одну колонку

У темі 08 ми вже позначали викиди — і робили це так, як робить людина з очима: брали одну колонку, малювали розподіл і дивились, що відірвалось від решти. Правило міжквартильного розмаху й z-оцінка звідти нікуди не діваються, це й досі перше, що варто зробити. Різниця в тому, що там ми шукали підозрілі числа в колонці, а тут — підозрілі рядки в таблиці. Це різні речі, і зараз буде видно наскільки.

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

z-оцінка, |z| більше за 3 51 оголошення із них шахрайських 6 розмах, 1.5·IQR 156 оголошень із них шахрайських 26

Тепер порівняй ці числа з часткою шахрайських оголошень на дошці — 12.6 %. Правило z-оцінки дало 6 із 51, тобто 11.8 %: тицьнути пальцем навмання було б не гірше. Правило розмаху дало 26 зі 156, тобто 16.7 %: трохи краще за випадковість, але не так, щоб радіти. І це не тому, що правила погані. Просто обидва відповідають на питання «чи велике це число», а шахрайське оголошення видає не величина, а поєднання.

Оголошення, у якому кожна колонка в нормі

Ось рядок 328 із нашої таблиці. Beta 12, 2021 рік, стан «добре», 64 гігабайти, акаунт створено 93 дні тому, ціна 15 160 грн. Порахуємо z-оцінку кожної з семи ознак:

ціна 15 160 грн z = +1.00 памʼять 64 ГБ z = −0.85 типова ціна 4 310 грн z = −0.29 стан 2 бали z = −0.37 оцінка каталогу 6 616 грн z = −0.13 вік акаунта 93 дні z = −0.77 рік 2021 z = +0.23

Жодна ознака не виходить навіть за одне стандартне відхилення від середнього. Жодна не перетинає межу міжквартильного розмаху — ціна 15 160 грн лежить під верхньою межею 16 061 грн, і решта колонок навіть близько не підходять до своїх меж. За будь-яким одновимірним правилом це найзвичайніше оголошення на дошці.

А тепер прочитай рядок цілком. Beta 12 у стані «добре» — модель, яка на цій самій дошці того самого року йде по 4 310 грн, — виставлена за 15 160. Це втричі з половиною дорожче за типову ціну; оголошень із таким перевищенням на дошці лише 2.4 %. Ознака, що видає цей рядок, — не «ціна» і не «типова ціна», а їхнє співвідношення, і жодна колонка окремо його не містить.

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

Інтерактив 1 · Нормальна окремо, аномальна разом

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

z ціни+1.59
z типової−0.24
відстань до хмари10.1
поріг (99 %)4.4
«Відстань до хмари» — це відстань Махаланобіса. Звичайна відстань до центру не годиться: хмара витягнута вздовж діагоналі, тож відхилитись уздовж неї можна далеко й лишитись звичайним, а впоперек — зовсім ні. Махаланобіс міряє відстань у «своїх» одиницях хмари: скільки типових розкидів саме в цьому напрямку. Поріг у комірці — та відстань, яку перевищують рівно 1 % оголошень хмари.

Постав повзунки в 15.2 і 4.3 — це і є наш рядок 328. Обидві осі кажуть «норма», а спільна відстань перевищує поріг більш ніж удвічі. Постав обидва в 20 — ціна висока, типова висока, але одне одному відповідає, і відстань падає до звичайної. Ось у цьому різниця між «велике число» і «неможливе поєднання», і заради неї існує решта теми.

04 / СусідиЛокальна щільність: LOF

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

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

LOF (local outlier factor, локальний фактор викиду) лагодить це одним поворотом думки. Питання не в тому, наскільки далеко сусіди, а в тому, наскільки далі, ніж у самих сусідів. Точка аномальна, якщо навколо неї значно просторіше, ніж навколо тих, хто поруч. У щільному районі порожнеча помітна, у розрідженому вона — норма.

Схема 2 · Локальна щільність проти глобальної

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

У точки А та в точки S середні відстані до сусідів майже однакові — 2.37 і 2.00. Будь-яке глобальне правило «далеко до сусідів» або позначить обидві, або жодну. Локальне ділить цю відстань на таку саму відстань у сусідів — і числа розходяться в чотири з половиною рази.

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

Крок 1 · відстань до сусідів

Три найближчі до А точки лежать на краю щільної групи, на відстанях 2.121, 2.500 і 2.500. Середнє:

avg(А) = (2.121 + 2.500 + 2.500) / 3 = 2.374
Крок 2 · те саме для кожного сусіда

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

avg(сусід 1) = (0.500 + 0.500 + 0.707) / 3 = 0.569 avg(сусід 2) = (0.500 + 0.500 + 0.500) / 3 = 0.500 avg(сусід 3) = (0.500 + 0.500 + 0.500) / 3 = 0.500 середнє по сусідах = (0.569 + 0.500 + 0.500) / 3 = 0.523
Крок 3 · відношення

Оцінка LOF — це відношення першого числа до другого. Одиниця означає «навколо мене так само просторо, як навколо моїх сусідів», тобто повна норма:

LOF(А) = 2.374 / 0.523 = 4.54

Навколо точки А вчетверо просторіше, ніж навколо її сусідів. Це аномалія.

Крок 4 · контрольна точка

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

LOF(S) = 2.000 / 2.000 = 1.00

Абсолютна відстань та сама, вирок протилежний. Ось для чого в назві слово «локальний».

Дрібний шрифт. Справжній LOF замість простої відстані бере відстань досяжності: якщо точка ближча до сусіда, ніж радіус його власного k-го сусіда, відстань штучно збільшують до цього радіуса. Це згладжування, щоб оцінка не стрибала від однієї щільно розташованої пари. Ідея відношення від цього не змінюється: scikit-learn дає для наших точок 3.87 і 0.78 замість 4.54 і 1.00, а порядок і висновок ті самі.

Головний важіль тут — k, кількість сусідів. Замалий (2-3) — і будь-яка пара точок, що випадково стала поруч, оголосить себе окремою щільною групою, а решту світу — аномалією. Завеликий — і «локальний» перестає бути локальним: сусідство розпливається на пів хмари. Типова робоча величина — кілька десятків; ми беремо 20. І тут діє те саме правило без винятків, що й у темі 11: перед LOF обовʼязкове масштабування. LOF рахує відстані, а відстань складається з різниць по всіх колонках — тож без спільної шкали вік акаунта, що йде сотнями днів, перекриє стан, який іде балами від 1 до 4, повністю.

05 / РозрізиIsolation Forest

Найкрасивіша ідея теми починається з питання, яке спершу здається не про те. Скільки випадкових розрізів треба, щоб відрізати точку від усіх інших?

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

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

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

Інтерактив 2 · Скільки розрізів треба, щоб відрізати точку

Ті самі 114 оголошень двічі. Ліворуч ціль — точка, що стоїть осторонь; праворуч — точка з самої гущі. Тисни «розріз» і рахуй.

розрізів · аномалія0
розрізів · гуща0
сер. за 300 спроб3.5
сер. за 300 спроб11.0
Праві дві комірки — середня глибина за 300 незалежних прогонів, порахована прямо тут при завантаженні сторінки. Один прогін нічого не доводить: буває, що й точку з гущі відітне другий розріз. Саме тому метод зветься лісом — оцінка береться як середнє по сотні дерев.

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

IsolationForest будує 100 дерев (у нас 200), кожне на випадковій підвибірці, для кожної точки усереднює глибину ізоляції й перетворює її на число від 0 до 1. Ділити доводиться на очікувану глибину для випадкової точки, бо в дерева з 256 обʼєктів і в дерева з 10 000 «нормальна» глибина різна.

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

Де він ламається. Кожен розріз — це умова про одну колонку: «ціна менша за 5 000» або «рік не пізніший за 2019». На картинці це означає лінію, строго перпендикулярну до однієї з осей; похилих розрізів метод не робить узагалі. Тому аномалію, що лежить усередині діапазону кожної ознаки, але поза хмарою, метод бачить погано: щоб відрізати точку в дірці посеред даних, потрібно кілька розрізів з обох боків, і глибина виходить звичайною. Це рівно наш рядок 328 — і саме тому IsolationForest поставив його аж на 568-ме місце з 1 100.

06 / ВідновленняПомилка відновлення

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

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

Беремо три компоненти з семи — це 71.1 % розкиду — і міряємо, наскільки схибило відновлення. Ось що виходить на стандартизованих ознаках:

медіана помилки відновлення 1.10 найбільша помилка 6.98 Gamma X 2017, стан «нове», 512 ГБ, 95 000 ₴

Перші пʼять рядків за помилкою відновлення — це три колекційні Gamma X і два оголошення із зайвим нулем у ціні. Метод спрацював бездоганно й знайшов рівно те, чого ми не просили: найдивніші рядки таблиці, а не найшахрайськіші. До цього ми ще повернемось.

Кількість компонент тут — головний важіль, і працює він у зрозумілий бік. Лишиш одну компоненту — «нормою» вважатиметься лише найголовніша вісь, і половина чесних оголошень відновиться погано. Лишиш усі сім — відновлення стане точним для всіх, помилка занулиться й метод перестане розрізняти будь-що. Робоче правило: стільки компонент, скільки треба на 70-90 % розкиду.

07 / ПорівнянняТри методи поруч

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

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

Таблиця 1 · Що припускає метод і коли він ламається

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

методщо припускаєколи ламаєтьсякатегорійні ознаки
z-оцінкаодна колонка; розподіл приблизно симетричний і без важкого хвостаскошені дані; будь-яка аномалія, що видно лише в поєднанні колонокне працює — потрібне число
Міжквартильний розмаходна колонка; форма розподілу будь-якатам само: бачить лише величину числа, а не рядокне працює
Відстань Махаланобісаусі дані — одна витягнута еліптична хмаракілька груп; нелінійні звʼязки; самі аномалії псують оцінку хмаритільки після кодування числами
LOFвідстань має сенс; щільність можна порівнювати з локальноювисока розмірність; чутливий до k та до масштабуванняone-hot розтягує простір і розмиває відстані
Isolation Forestаномалії рідкісні й відділені хоча б за однією віссюаномалія в «дірці» посеред хмари; багато зайвих ознакпрацює з числами; порядкове кодування терпить
Помилка відновлення (PCA)основна структура даних лінійнанелінійні звʼязки; вимагає стандартизації та вибору кількості компоненттільки після кодування числами
Масштабування потрібне всім, крім двох. Одновимірні правила працюють у межах однієї колонки, тож їм байдуже. IsolationForest ріже кожну вісь окремо, і будь-яке монотонне перетворення однієї ознаки нічого в ньому не міняє. Махаланобіс, LOF та PCA міряють відстані між ознаками разом — без StandardScaler вони міряють одиниці вимірювання, а не дані.

Практичне питання: чи згодні методи між собою? Візьмімо в кожного топ-50 найаномальніших оголошень і подивімось на перетини.

Isolation Forest і LOF 21 спільних із 50 Isolation Forest і відновлення 19 спільних із 50 LOF і відновлення 30 спільних із 50 усі три разом 19 спільних із 50

Перекриття є, але воно далеко не повне. У Isolation Forest 29 рядків із 50 не знайшов жоден інший метод; у LOF таких 18, у помилки відновлення — 20. Це не привід шукати найкращий метод — це підказка запускати кілька. Оголошення, яке потрапило в топ усіх трьох, дивне напевно; оголошення, яке знайшов лише один, варто подивитись окремо — і, можливо, дізнатись про свої дані щось нове.

08 / ПорігПоріг — це рішення

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

Спокуса — попросити компʼютер провести її самому. У IsolationForest навіть є параметр contamination, куди пишуть очікувану частку аномалій. Варто розуміти, що він робить: він не визначає поріг, а виконує вже прийняте тобою рішення. Ставиш 0.05 — метод відріже рівно 5 % найгірших, скільки б справжніх аномалій там не було. Число ти приніс ззовні.

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

Інтерактив 3 · Поріг і його ціна

Оцінки LOF по всіх 1 100 оголошеннях дошки. Повзунок задає частку, яку ми позначаємо аномальною й віддаємо на перевірку. Числа справжні: колонку «шахрайське» видно тільки нам, а не методу.

на перевірку33
справжніх знахідок17
точність51.5 %
повнота12.2 %
Обидві криві падають і ростуть одночасно — це та сама пара, що в темі 05. Розширюючи список на перевірку, ти неминуче знаходиш більше шахраїв і неминуче витрачаєш більше часу даремно. Правильного положення повзунка не існує: воно є лише в кожної конкретної задачі з її цінами.

Прогони повзунок від краю до краю — картина повчальна. На 1 % список складається з 11 оголошень, шахрайських серед них 3. На 3 % — 33 оголошення й 17 знахідок, найкраща точність за всю шкалу. На 10 % на перевірку йде 110 рядків, з яких справжніх 31: модератор витрачає втричі більше часу, щоб знайти вдвічі більше. На 30 % позначено вже кожне третє оголошення на дошці, знайдено 59 шахраїв зі 139, і слово «аномалія» остаточно знецінилось.

09 / ОцінкаЯк оцінювати без міток

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

Розмітити невелику вибірку. Береш дві-три сотні рядків, дивишся на них очима або віддаєш експерту, отримуєш маленький, але справжній тест. Дорого й повільно, зате далі можна рахувати звичайні precision і recall.

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

Порахувати precision@k. Найпоширеніша метрика цієї задачі, і вона буквально описує роботу модератора: серед перших k рядків списку — скільки виявились справжніми? Її головна перевага в тому, що для неї не треба розмічати всю таблицю: досить перевірити ті самі k рядків, які ти й так збирався дивитись.

Чого тут майже ніколи не буває. ROC-AUC із теми 06 для пошуку аномалій рахують рідко, і не через складність. При частці аномалій у відсоток чи менше площа під ROC-кривою майже не реагує на те, що коїться на початку списку — а саме початок списку і є вся задача. Дивитись треба на precision@k або на площу під PR-кривою.

10 / ЧесністьАномалія — не те, що ти шукаєш

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

Таблиця 2 · Топ-20 кожного методу проти колонки «шахрайське»

1 100 оголошень, 139 із них шахрайські — 12.6 %. Саме з цим числом і треба порівнювати кожен рядок.

методшахрайських у топ-20precision@20 краще за випадковістьщо саме в топі
LOF945.0 %у 3.6 разаперші шість — колекційні й одруки
Помилка відновлення210.0 %гіршеколекційні, одруки, дорогі флагмани
Isolation Forest15.0 %гіршемайже суцільно Gamma X Ultra 2024
Правило 1.5·IQR16.7 %у 1.3 раза156 позначених, 26 шахраїв
Правило |z| більше 311.8 %гірше51 позначене, 6 шахраїв
Три методи з пʼяти спрацювали гірше за випадковий вибір — не тому, що вони погані, а тому, що шукали не те. Найаномальніші рядки цієї дошки — це найдорожчі телефони, а найдорожчі телефони на ній чесні.

Найпоказовіше не в цифрах, а в перетині. У топ-20 усіх трьох багатовимірних методів одночасно потрапили рівно чотири оголошення. Це ті самі чотири колекційні Gamma X 2017 року в стані «нове» з 512 гігабайтами, за 82-95 тисяч гривень, яких ми вже бачили в темі 08. Три незалежні методи, побудовані на трьох різних ідеях, одностайно назвали найдивнішими рядками таблиці чотири абсолютно чесні оголошення.

І вони мають рацію. Ці рядки справді ні на що не схожі: семирічний флагман, запакований, із максимальною памʼяттю, за ціну нового. У даних вони — найяскравіша аномалія. У задачі — ринок колекціонерів.

Дзеркальний випадок — наш рядок 328. Beta 12 за 15 160 грн при типовій ціні 4 310 — шахрайське оголошення, у якому жодна ознака не виходить за одне стандартне відхилення. LOF поставив його на 14-те місце з 1 100 і виявився єдиним, хто його побачив; помилка відновлення дала 278-ме, Isolation Forest — 568-ме. А акуратно складене шахрайське оголошення — з правдоподібною ціною, звичайним роком і нормальною памʼяттю — не потрапить у жоден список узагалі, і жоден із цих методів у цьому не винен.

Головне речення теми. Пошук аномалій відповідає на питання «що тут не схоже на решту», а не на питання «де тут шахрайство». Ці множини перетинаються, але не збігаються, і розмір перетину — властивість твоїх даних, а не якість методу. Якщо precision@20 вийшов низьким — це не провал детектора. Це відповідь: у цих даних дивне й шкідливе — різні речі, і для другого потрібні мітки, ознаки на кшталт ціна поділити на типову (тема 10) або звичайний класифікатор.

Де ж тоді пошук аномалій справді потрібен? Там, де «дивне» і є ціллю. Контроль якості даних перед навчанням: перш ніж будувати модель, знайди рядки, яких не мало бути. Моніторинг обладнання: датчик, показання якого перестали бути схожими на власне минуле. Перша розвідка незнайомої таблиці: топ-20 найаномальніших рядків розповідає про дані більше, ніж двадцять гістограм. І — як фільтр перед розміткою: якщо перевірити можна лише сотню рядків, розумно взяти не випадкову сотню, а найдивнішу.

11 / ДаліЩо далі

Підсумок теми в пʼятьох рядках. Аномалія — це не властивість рядка, а результат рішення, як міряти схожість. Одновимірні правила бачать великі числа, а не дивні рядки. LOF порівнює щільність навколо точки зі щільністю навколо її сусідів, Isolation Forest рахує глибину випадкової ізоляції, помилка відновлення міряє, наскільки погано рядок вписався в головну структуру даних. Усі троє дають оцінку, а не відповідь; поріг — це рішення про ціну помилки. І жоден із них не обіцяв шукати саме те, що потрібно тобі.

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

Далі в практиці. У practice.ipynb ми беремо ту саму дошку й проходимо весь шлях: одновимірні правила й скільки вони ловлять; пошук оголошення, нормального за кожною ознакою окремо; три методи поруч у спільній таблиці з оцінками; узгодженість між ними; топ-20 кожного проти колонки шахрайське й чесний висновок про те, що збіглося, а що ні.

Далі в темі

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