Test Run - Probit Classification Using C#
Пробіт-класифікація (probability unit, probit) - це метод машинного навчання (machine learning, ML), який можна використовувати для прогнозування в ситуаціях, де залежна змінна, значення якої потрібно передбачити, є бінарною, тобто вона може приймати одне із двох можливих значень. Пробіт-класифікацію також називають пробіт-регресією та пробіт-моделюванням.
Пробіта-класифікація дуже схожа на класифікацію методом логістичної регресії (logistic regression, LR). Ці два методи застосовуються до тих самих типів завдань і дають подібні результати. Вибір одного з цих двох методів зазвичай залежить від дисципліни, де ви працюєте. Пробитий часто застосовують в економіці та фінансах, а LR частіше використовують в інших галузях.
Щоб отримати уявлення про те, що таке пробіта-класифікація, погляньте на демонстраційну програму на мал. 1 .

У демонстрації пробіт-класифікація використовується для створення моделі, яка передбачає, чи помре пацієнт у лікарні, виходячи з його віку, статі та результатів дослідження нирок. Дані повністю штучні. Перший елемент вихідних даних виглядає так:
Вихідні дані (raw data) складаються з 30 елементів. Підлога кодується як –1 (чоловік) та +1 (жінка). Прогнозоване значення Died знаходиться в останньому стовпці і кодується як 0 = false (пацієнт виживе) та 1 = true. Таким чином, перший елемент даних визначає 48-річну жінку з оцінкою стану нирок 4.40, яка виживе. Демонстраційна програма починає з нормалізації віку та даних стану нирок, щоб усі значення мали приблизно однаковий порядок величин. Перший елемент даних після нормалізаціїстає таким:
Нормалізовані значення менше 0.0 (тут: вік та оцінка стану нирок) знаходяться нижче середніх, а значення більше 0.0 - вище середніх.
Потім вихідні дані випадковим чином поділяються на навчальний набір з 24 елементами для створення моделі та на перевірочний набір з шістьма елементами для оцінки точності моделі при застосуванні нових даних з невідомими результатами.
Далі демонстраційна програма створює пробіт-модель. «За лаштунками» навчання здійснюється за методом симплексної оптимізації (simplex optimization) з максимальною кількістю ітерацій, що дорівнює 100. Після навчання відображаються вагові значення, які визначають модель, - < -4.26, 2.30, -1.29, 3.45.
Перше вагове значення (-4.26) є універсальною константою і не застосовується до жодної конкретної передбачуваної змінної (predictor variable). Друге вагове значення (2.30) застосовується до віку, третє (-1.29) - до підлоги, а четверте (3.45) - до оцінки стану нирок. Позитивні вагові значення, наприклад пов'язані з віком та оцінкою стану нирок, означають, що вищі значення предиктора вказують: залежна змінна Died буде ближче до true.
Демонстраційна програма обчислює точність моделі на навчальному наборі з 24 елементів (100% правильних результатів) та на перевірочному наборі (83,33%, або п'ять правильних результатів та один помилковий). Більше старше з цих двох значень є точністю перевірки (test accuracy). Це груба оцінка загальної точності пробіт-моделі.
У цій статті передбачається, що ви вмієте програмувати хоча б на середньому рівні і маєте 'азове уявлення про ML-класифікацію, але нічого не знаєте про пробіт-класифікацію. Демонстраційна програма написана на C#, але у вас немаємає виникнути особливих проблем, якщо ви захочете виконати рефакторинг коду під інші .NET-мови. Демонстраційна програма надто довга, щоб її можна було представити у статті у всій її повноті, але ви можете знайти повний вихідний код у супутньому цій статті пакеті коду. Вся обробка звичайних помилок видалена, щоб не ускладнювати сприйняття основних ідей.
Розуміння пробіт-класифікації
Простим способом передбачити смерть через такі показники, як вік, стать та стан нирок, була б лінійна комбінація:
де b0, b1, b2, b3 — вагові значення, які потрібно якось визначити, щоб обчислені на навчальному наборі вихідні значення відповідали відомим значенням залежної змінної. Логістична регресія розширює цю ідею за допомогою складнішої функції прогнозування:
Математика тут дуже складна, але функція прогнозування, звана логістичної сигмоїдальної функції (logistic sigmoid function), до нашої зручності завжди повертає значення між 0.0 і 1.0, що можна інтерпретувати як ймовірність (probability). Пробіт-класифікація використовує іншу функцію прогнозування:
Функція Phi(z) називається стандартною нормальною кумулятивною функцією щільності розподілу ймовірностей (standard normal cumulative density function) (зазвичай використовують абревіатуру CDF), і вона завжди повертає значення між 0.0 та 1.0. CDF дуже складна, тому що простого рівняння для неї немає. CDF для значення z - це область під знаменитою кривою розподілу Гауса (bell-shaped curve function) (гаусової функції) від негативної нескінченності до z.
Звучить набагато складніше, ніж є насправді. Подивіться графік нарис. 2. Він показує логістичну сигмоїдальну функцію та функцію CDF,точки яких відкладено на графіку поруч. Важливо, що з будь-якого значення z, хоча нижчележачі функції зовсім різні, обидві функції повертають значення між 0.0 і 1.0, яке можна інтерпретувати як можливість.

| Standard normal CDF | Стандартна нормальна CDF |
| Cumulative Density(z) | Кумулятивна густина (z) |
| CDF | CDF |
| Log sigmoid | Логістична сигмоїда |
Отже, з погляду розробника, перше завдання — написати функцію, яка обчислює CDF значення z. Простого рівняння для обчислення CDF немає, але є десятки апроксимацій, що екзотично виглядають. Один із найпоширеніших способів апроксимації функції CDF — розрахунок функції erf (скорочення від Error Function), використовуючи рівняння під назвою «A&S 7.1.26», та застосування erf для визначення CDF. Код функції CDF представлений нарис. 3.
Мал. 3. Функція CDF на C#
Підведемо підсумок. Пробіт-класифікація використовує функцію CDF для розрахунку вихідного значення. Функція CDF також називається phi. CDF - це область під кривою розподілу Гауса, і простого рівняння для неї немає. Поширений спосіб апроксимації CDF - застосування формули A&S 7.1.26 для отримання erf і подальшого використання erf для отримання CDF.
Маючи функцію CDF, легко обчислити пробитий-висновок для набору вхідних значень та набору вагових значень:
Друге завдання при написанні коду для пробіт-класифікації - визначення значень для ваги, щоб при передачі навчальних даних обчислені вихідні значення близько відповідали відомим вихідним значенням.На це завдання можна подивитися й інакше: його мета — звести до мінімуму помилку між обчисленими та відомими вихідними значеннями. Це називають навчанням моделі за допомогою числової оптимізації.
Простого способу навчити більшість ML-класифікаторів, у тому числі пробитих-класифікаторів, немає. Існує приблизно десяток основних методів, які ви можете використовувати, і кожен метод має десятки варіацій. До поширених методів навчання відносяться простий градієнтний спуск (simple gradient descent), зворотне поширення (back-propagation), алгоритм Ньютона-Рафсона, оптимізація рою частинок, еволюційна оптимізація (evolutionary optimization) та L-BFGS. Демонстраційна програма використовує один із найстаріших та найпростіших методів навчання – симплексну оптимізацію (simplex optimization).
Розуміння симплексної оптимізації
Грубо кажучи, симплекс це трикутник. Ідея симплексної оптимізації полягає в тому, щоб почати з трьома можливими рішеннями (звідси й назва симплекс). Одне з рішень буде «найкращим» (що має найменшу помилку), інше – «найгіршим» (найбільша помилка), а третє – «іншим». Потім алгоритм симплексної оптимізації створює три нові потенційні рішення: «розширене» (expanded), «відбите» (reflected) та «стиснуте» (contracted). Кожне з них порівнюється з поточним найгіршим рішенням, і, якщо будь-який з нових кандидатів виявляється кращим (з меншою помилкою), він замінює найгірше рішення.
Симплексна оптимізація показана на рис. 4 . У найпростішому випадку, де рішення складається з двох значень, наприклад (1.23, 4.56), рішення можна розглядати як точку на площині (x, y). У лівій частині рис. 4 видно, що три нових рішення-кандидата генеруються з рішень «краще», «гірше» та «інше».

| other | інше |
| worst | найгірше |
| contracted | стиснене |
| centroid | центроїд |
| reflected | відображене |
| expanded | розширене |
| best | найкраще |
| Три candidates to replace worst | Три кандидати на заміну найгіршого рішення |
| other' | інше' |
| worst' | найгірше' |
| Shrinking | Скорочення |
Спочатку обчислюється центроїд. Центроїд - це середнє кращого та іншого рішення. У двох вимірах це точка посередині між точками кращого та іншого розв'язків. Потім проводиться уявна лінія, яка починається з точки гіршого рішення та проходить через центроїд. Стиснутий кандидат знаходиться між точками найгіршого рішення та центроїду. Відбитий кандидат розташовується на уявній лінії за центроїдом, а розширений - за точкою відбитого рішення.
На кожній ітерації симплексної оптимізації, якщо один із кандидатів (розширений, відбитий чи стислий) краще, ніж поточне найгірше рішення, останнє замінюється цим кандидатом. Якщо жоден із трьох згенерованих кандидатів не кращий за гірше рішення, поточне гірше та інше рішення зміщуються у напрямку до кращого рішення десь між своїми поточними позиціями та позицією кращого рішення, як показано у правій частинірис. 4.
Після кожної ітерації формується новий віртуальний трикутник «кращий-другий-гірший», який дедалі ближче до оптимального рішення. Якщо робити знімок кожного трикутника при послідовному підході, зсув трикутників нагадує рух загостреної краплі.по площині у стилі одноклітинної амеби. Тому симплексна оптимізація іноді називається оптимізацією методом амеби (amoeba method optimization).
Існує багато варіацій симплексної оптимізації, які відрізняються в тому, наскільки далекі стиснене, відбите і розширене рішення-кандидати від поточного центроїду, і в порядку, в якому перевіряються рішення-кандидати, щоб дізнатися, чи краще вони поточного найгіршого рішення. Найпоширеніша форма симплексної оптимізації – алгоритм Нелдера-Міда (Nelder-Mead algorithm). Демонстраційна програма використовує простішу варіацію, яка не має конкретної назви.
У разі пробіт-класифікації кожне потенційне рішення є набором вагових значень. У псевдокоді на рис. 5 показана варіація симплексної оптимізації, що застосовується в демонстраційній програмі.
Мал. 5. Псевдокод для симплексної оптимізації, що використовується демонстраційною програмою