ML: Вступ до машинного навчання
Вступ
Методи машинного навчання є підмножиною алгоритмів штучного інтелекту.
У свою чергу, нейронні мережі та глибоке навчання - це окремий випадок машинного навчання.
Цей документ є вступним і описує основні поняття машинного навчання та типи
задач, що розв'язуються за його допомогою.
Об'єкти та їхні ознаки
Нехай є множина однотипних об'єктів:
пляшки з вином, відвідувачі в лікарні або позиції на шаховій дошці (це три різні множини).
Кожен об'єкт множини характеризується набором (вектором) ознак:
$\mathbf{x}= \{x_0,x_1,...,x_{n-1}\}$.
Ознаки можуть бути:
- числові (вага, зріст, яскравість пікселя)
- бінарні (жінка/чоловік, живий/мертвий)
- впорядковані нечислові (маленький/великий/величезний)
- якісні нечислові (червоний/синій/зелений)
Задачі машинного навчання
Об'єкти даної множини іноді можна розбити на класи (людина: {здорова, хвора}, вино: {італійське, французьке, грузинське}). Крім того, з кожним об'єктом можна пов'язати деяке число y (ступінь переваги білих у шаховій позиції; якість вина за усередненою думкою експертів тощо). Відповідно, часто розв'язуються дві задачі: класифікація - до якого з класів належить об'єкт та регресія - яке число або набір чисел відповідає об'єкту. Приклади:
- 1) 3 ознаки: x={температура, гемоглобін, холестерин}; 2 класи: {0: здоровий, 1: хворий};
- 2) w*h ознак: x={яскравості пікселів картинки розміром w на h}; 10 класів: {0-9: цифра на картинці}.
- 3) 8*8*13 ознак: x={коди шахових фігур}; регресія: перевага білих над чорними =[-1...1].
Для успішного розв'язання задач класифікації або регресії, ознаки, що характеризують об'єкт, повинні бути значущими, а вектор ознак - повним (достатнім для класифікації об'єктів або визначення регресійної величини y).
Окрім класифікації та регресії можливі й інші задачі. Так, при ранжуванні потрібно впорядкувати за деяким критерієм множину об'єктів (наприклад, документів, отриманих за пошуковим запитом). Останнім часом важливу роль відіграють генеративні задачі: за впорядкованою послідовністю об'єктів із даної множини згенерувати іншу послідовність з об'єктів цієї ж або іншої множини. Прикладами є: системи машинного перекладу, текстове анотування зображень або генерація фейкових відео.
Навчання з учителем
Систему, що розв'язує задачу класифікації або регресії, представимо у вигляді чорної скриньки.
У неї є n входів, на які подаються значення ознак
$\mathbf{x} = \{x_0,...,x_{n-1}\}$
та $m$ виходів $\mathbf{y} = \{y_0,...,y_{m-1}\}$.
У задачі класифікації $m$ дорівнює числу класів, а в задачі регресії -
числу залежних величин, пов'язаних з кожним об'єктом.
Модель можна вважати багатовимірною функцією або алгоритмом $\mathbf{y}=f(\mathbf{x},\,\boldsymbol{\omega})$,
яка за даним $\mathbf{x}$ видає значення $\mathbf{y}$.
Вектор $\boldsymbol{\omega}$ - це параметри моделі.
Машинне навчання передбачає наявність навчальної множини об'єктів $\mathcal{T}$. Її надає "учитель" (зазвичай людина). На цій множині система навчається (налаштовує модель = оптимізує параметри $\boldsymbol{\omega}$). Правильно навчена система повинна видавати коректні результати на виході не тільки на навчальній, а й на тестовій множині об'єктів $\mathcal{V}$, які не використовувалися під час навчання: $\mathcal{T}\cap \mathcal{V}=\varnothing$.
Для машинного навчання типові дві проблеми: недонавчання (under-fitting)
та перенавчання (over-fitting).
Недонавчання виникає, коли модель занадто проста і не здатна виразити природу навчальних даних.
Наприклад, у такій моделі може бути недостатня кількість "налаштовуваних" параметрів.
Перенавчання - це протилежна ситуація: у моделі забагато параметрів, і вона прагне
"запам'ятати" всі навчальні об'єкти, включно з неминучим шумом чи помилками.
У цьому випадку модель не здатна до узагальнення чи екстраполяції і дуже погано працює
на тестових даних.
Праворуч зображено задачу класифікації двох класів (кола та квадрати)
у двовимірному просторі ознак. Пунктирна лінія є гладкою розділяючою поверхнею,
яка відділяє об'єкти одного класу від об'єктів другого. Три об'єкти ця поверхня відносить до неправильних
класів. Цю ситуацію "виправляє" хвиляста лінія. Однак, якщо ці три об'єкти є випадковими
викидами, хвиляста лінія - приклад типового перенавчання.
Середньоквадратична помилка
Розглянемо $N$ об'єктів, що характеризуються $n$-вимірними векторами ознак. Їх можна подати у вигляді матриці $x_{i\alpha}$, де перший індекс $i=0...N-1$ - це номер об'єкта, а другий індекс $\alpha=0...n-1$ - номер його ознаки. Нехай для кожного ($i$-того) прикладу $\hat{\mathbf{x}}_i=\{\hat{x}_{i0},...,\hat{x}_{i,n-1}\}$ з навчальної множини відомі "справжні" значення виходів моделі (наприклад, у задачі регресії). Будемо позначати їх капелюшком: $\hat{\mathbf{y}}_i=\{\hat{y}_{i0},...,\hat{y}_{i,m-1}\}$. Чим ближче $\mathbf{y}=f(\hat{\mathbf{x}},\,\boldsymbol{\omega})$ до справжніх значень $\hat{\mathbf{y}}$, тим краще працює модель.
Середньоквадратичною помилкою (MSE, mean squared error) називається середнє квадратів відхилень передбачень $y_{i\alpha}$ моделі від справжніх значень $\hat{y}_{i\alpha}$ для кожного прикладу ($i$) та кожного виходу ($\alpha$):
$$ L = \langle(\mathbf{y}-\hat{\mathbf{y}})^2 \rangle ~=~ \frac{1}{N\cdot m}\sum^{N-1}_{i=0}~\sum^{m-1}_{\alpha=0} ~~(y_{i\alpha}-\hat{y}_{i\alpha})^2. $$ Оскільки модель $\mathbf{y} = f(\hat{\mathbf{x}}, \boldsymbol{\omega})$ та навчальна множина $\{\hat{\mathbf{x}},\hat{\mathbf{y}}\}$ задані, помилка залежить лише від параметрів моделі $L=L(\boldsymbol{\omega})$. У процесі машинного навчання ці параметри підбираються так, щоб помилка досягла свого мінімального значення: $\bar{\boldsymbol{\omega}} = \text{argmin} \,L(\boldsymbol{\omega})$.
Суттєвою перевагою MSE є те, що вона диференційовна за виходами моделі $\mathbf{y}$ і, отже, диференційовна за її параметрами (якщо диференційовна функція $f$): $$ \frac{\partial L}{\partial \boldsymbol{\omega}} ~=~ \sum_{i,\alpha} \frac{\partial L}{\partial y_{i\alpha}} \frac{\partial y_{i\alpha}}{\partial \boldsymbol{\omega}} ~=~ \frac{2}{N\cdot m}\sum_{i,\alpha} ~~(y_{i\alpha}-\hat{y}_{i\alpha})\,\frac{\partial f_{i\alpha}(\hat{\mathbf{x}}_i,\,\boldsymbol{\omega})}{\partial \boldsymbol{\omega}}. $$ Ця властивість середньоквадратичної помилки дозволяє використовувати потужний оптимізаційний метод градієнтного спуску для підбору параметрів моделі.
Бінарна класифікація
У задачі бінарної класифікації об'єкт з ознаками $\mathbf{x}$
потрібно віднести до одного з двох класів: $c\in \{0,1\}$.
Будемо вважати, що у моделі є єдиний вихід $y$
зі значеннями, що лежать у діапазоні [0...1].
Тоді правило класифікації записується таким чином: $c = [y > 0.5]$.
Квадратні дужки навколо логічної умови [condition] означають число 0,
якщо умова хибна, та 1, якщо істинна.
Таким чином, якщо вихід моделі менший або дорівнює 0.5, ми вважаємо, що це клас $c=0$,
у протилежному випадку - це клас $c=1$.
☝ Масштабування виходу моделі до інтервалу $[0...1]$ завжди можна здійснити за допомогою сигмоїдної функції:
$$
y = \sigma(x) = \frac{1}{1+e^{-x}},~~~~~~~~~~~\frac{dy}{dx} = y\cdot(1-y).
$$
При великих $x$ сигмоїда швидко прямує до одиниці, при великих за модулем від'ємних - до нуля і $\sigma(0)=1/2$.
Альтернативно можна використовувати гіперболічний тангенс: $y=(1+\tanh(x))/2$ з такими самими властивостями.
Як помилку моделі (яку мінімізують) можна взяти середньоквадратичну помилку MSE, вважаючи, що в навчальній множині для першого класу $\hat{y}_i = 0$, а для другого: $\hat{y}_i = 1$: $$ L = \frac{1}{N}\sum_{i} (y_i - \hat{y}_i)^2 ~=~ \frac{1}{N}\sum_{i} \left\{ \begin{array}{cl} y^2_i, & \hat{y}_i =0\\ (1-y_i)^2, & \hat{y}_i = 1 \end{array} \right\}. $$ Чим ближче вихід моделі до нуля або одиниці, тим вона більш "впевнена", а при $y\sim 0.5$ модель "не знає", до якого класу потрібно віднести об'єкт.
Оскільки вихід $y$ моделі $f(\mathbf{x},\,\boldsymbol{\omega})$ лежить в інтервалі [0...1], його можна інтерпретувати як умовну "ймовірність" $y=p(c=1|\mathbf{x})$ належності об'єкта $\mathbf{x}$ до класу $c=1$. Відповідно, $1-y = p(c=0|\mathbf{x})$ - це ймовірність належності до класу $c=0$. Якщо $\hat{y}=1$, то потрібно максимізувати ймовірність $y$, а якщо $\hat{y}=0$, то максимізувати ймовірність $1-y$. Максимум ймовірності відповідає мінімуму її логарифма з від'ємним знаком. У результаті ми отримуємо таку альтернативу MSE: $$ L = -\frac{1}{N}\sum_{i} \Bigr[ \hat{y}_i \,\log y_i + (1-\hat{y}_i)\,\log(1-y_i) \Bigr] ~=~ -\frac{1}{N}\sum_{i} \left\{ \begin{array}{cl} \log (1-y_i), & \hat{y}_i =0\\ \log y_i, & \hat{y}_i = 1 \end{array} \right\}, $$ яку називають бінарною крос-ентропією (BCE, binary cross entropy). Наведемо графіки $L(y)$ для MSE та BSE при $\hat{y}=0$ і $\hat{y}=1$:
BСE крутіше підходить до цільового значення $y=\hat{y}$, ніж MSE і лінійна в околі цільового значення. Саме це зумовлює більшу популярність використання BCE у задачі бінарної класифікації.
Акуратність моделі
Введені вище помилки зручні при пошуку оптимальних параметрів (наприклад, градієнтним методом). Тим не менше, для практичних цілей, необхідні додаткові оцінки якості моделі, які простіше інтерпретувати. Особливо це стосується задач класифікації. Для бінарної класифікації найпростішою та найприроднішою є міра акуратності моделі, що дорівнює частці правильно передбачених нею класів: $$ A =\frac{\text{correct}}{\text{total}} = \frac{1}{N}\sum_i \bigr[ [y_i > 0.5 ] = \hat{y}_i \bigr] $$ Якщо $A=1$, це означає, що модель правильно відносить усі об'єкти до їхніх класів. При $A=0.5$ - вона працює не краще за генератор випадкових чисел.
Наведемо приклад обчислення помилок та акуратності моделі за допомогою бібліотеки NumPy:
import numpy as np # підключення бібліотеки numpy
y = np.array([0.1, 0.8, 0.6, 0.2]) # вихід для 4-х прикладів
c = np.array([0, 1, 0, 0]) # їхні справжні класи
mse = np.mean( (y-c)**2 ) # середньоквадратична помилка
bce = np.mean( -c*np.log(y)-(1-c)*np.log(1-y) ) # бінарна крос-ентропія
acc = np.mean( (y > 0.5) == c ) # акуратність моделі
print(f'mse:{mse:0.2f}, bce:{bce:0.2f}, acc:{acc:0.2f}') # mse:0.11, bce:0.37, acc:0.75
У масиві "y" знаходяться результати виходу моделі для чотирьох прикладів,
а в масиві "с", відповідні їм "справжні" класи (бінарна класифікація).
У найгіршому випадку, коли модель сумнівається завжди (на виході для будь-якого $\mathbf{x}$ вийде 0.5), помилки дорівнюють: mse=0.25 та bce=0.69, тобто bce більше за mse, але обидві дорівнюють нулю в точці мінімуму (див. малюнок вище).
Позитивний і негативний клас
Критерій акуратності має сенс, коли число об'єктів кожного класу приблизно однакове. Однак часто об'єктів одного типу більше, ніж другого. Модель, яка завжди передбачає більш частотний клас, матиме непогану акуратність (що дорівнює частоті цього класу), але фактично вона нічому не навчена.
У медичній діагностиці використовуються терміни позитивний (positive)
та негативний (negative).
Результати тестів (аналізів) негативні, якщо
патологію (хворобу) не виявлено, а якщо виявлено - позитивні.
Відповідно, для випадково обраної людини ймовірність негативних результатів суттєво
вища, ніж позитивних. Тому в бінарній класифікації при помітному перекосі
у частотності класів, більш імовірний клас прийнято називати негативним, а менш імовірний - позитивним.
Намалюємо множину об'єктів. Ліворуч від вертикальної пунктирної лінії знаходяться об'єкти негативного класу, а праворуч - позитивного. Жирна хвиляста лінія розділяє негативні та позитивні класи з "точки зору" моделі. При цьому вона робить помилки двох видів:
- хибне спрацювання (FP, false positive) - об'єкти негативного класу
приймаються за позитивні
(здорових вважають хворими), нижче жовтий колір; - пропуск (FP, false negative) - об'єкти позитивного класу
приймаються за негативні об'єкти
(не виявляють хворого) - нижче зелений колір.
Використовуючи ці визначення, введемо дві міри якості роботи моделі, формули для яких наведено на малюнку. Precision (точність) дорівнює частці правильних передбачень позитивного класу до загальної кількості виданих моделлю позитивних класів. Recall (повнота) - аналогічна частка, але віднесена до справжнього числа позитивних прикладів у даних. Ці дві міри не так чутливі до перекосу у частотності класів, як акуратність (TN+TP)/N, де N = TN+TP + FN+FP - загальне число прикладів.
Нижче в навчальній множині з 100 об'єктів знаходиться 92 приклади першого класу (негативного) та 8 другого (позитивного). Модель дуже погано розпізнає позитивний клас (1 раз правильно та 7 неправильно), хоча акуратність достатньо висока. Проблему відображають точність і повнота:
$$ \begin{array}{|c|c|} \mathbf{N} & \mathbf{P}\\ \hline \hline \mathbf{TN} & \mathbf{FN} \\ \hline \mathbf{FP} & \mathbf{TP} \\ \hline \end{array} ~=~ \begin{array}{|r|r|} \mathbf{N} & \mathbf{P}\\ \hline 90 & ~7 \\ \hline 2 & 1 \\ \hline \end{array}~~~~~~~~~~~~ \text{Accuracy} = 0.910,~~~~~~~\text{Precision} = 0.333,~~~~~~~~~\text{Recal} = 0.125 $$Іноді для вимірювання акуратності потрібне одне число. У цьому випадку можна виконати геометричне усереднення, яке називається F1-мірою:
$$ F_1 = \frac{2}{\displaystyle\frac{1}{\text{Precision}} + \frac{1}{\text{Recall}}} = \frac{\mathbf{TP}}{\mathbf{TP}+ (\mathbf{FP}+\mathbf{FN})/2} $$Різні помилки, залежно від задачі, можуть мати різну ціну. Наприклад, пропуск хворого FN небезпечніший, ніж неправильний діагноз FP для здорової людини. Тому, наприклад, Precision можна обчислити для позитивного та негативного класів і скласти з вагами, пропорційними вартості помилки.
Множинна класифікація
Розглянемо тепер задачу класифікації з числом класів $C > 2$. У цьому випадку кількість виходів моделі повинна дорівнювати числу класів. Нехай значення кожного $c$-того виходу, як і раніше, знаходяться в діапазоні [0...1] і інтерпретуються як ступінь впевненості в тому, що об'єкт належить до $c$-того класу.
Класи можуть перетинатися або не перетинатися. У першому випадку об'єкт з ознаками $\mathbf{x}$ може належати не одному, а декільком класам. Наприклад для $C=3$ може бути правильним вихід моделі $\hat{\mathbf{y}}=\{0,1,1\}$ (другий і третій клас, але не перший). Для класів, що не перетинаються, будь-який об'єкт завжди належить лише одному класу. У цьому випадку також існує дві можливості: сувора та нечітка класифікації. При суворій класифікації $\hat{\mathbf{y}}$ містить одну одиницю на $c$-тому виході, а на інших виходах - нулі (об'єкт точно належить до класу $c$). При нечіткій класифікації об'єкт належить до єдиного класу, але з певною ймовірністю. У цьому випадку всі виходи $\hat{\mathbf{y}}$ можуть бути відмінними від нуля, але їхня сума повинна дорівнювати одиниці.
Класифікацію з великим числом ознак можна звести до бінарної класифікації. Для цього потрібно взяти $C$ моделей, кожна з яких відрізняє "свій" клас від усіх інших класів (які вона не розрізняє). При тестуванні обирають найбільш "впевнену" модель і вважають, що об'єкт належить до її класу.
Для класів, що не перетинаються, завжди можна віднормувати значення виходів моделі таким чином, щоб їхня сума (для даного входу) дорівнювала одиниці. Тоді на виході отримується розподіл ймовірностей належності до того чи іншого класу.☝ Якщо виходи моделі інтерпретуються як ймовірності, то їхні значення повинні лежати в інтервалі $[0...1]$, а сума дорівнювати одиниці. Цього можна досягти, поставивши на виході моделі функцію softmax: $$ p_i = \text{sm}(\mathbf{y}) = \frac{e^{y_i}}{\sum_k e^{y_k}},~~~~~~~~~~~~~~~~~~~~~p_i > 0,~~~~~~\sum_k p_k = 1. $$ Зауважимо, що софтмакс $\mathbf{p}=\text{sm}(\mathbf{y})$ неоднозначна функція. Якщо до кожної компоненти вектора $\mathbf{y}$ додати одне й те саме число, то результат функції не зміниться: $\text{sm}(\mathbf{y}+a) = \text{sm}(\mathbf{y})$.
y = [1, 3, 5, -3] # значення на виходах моделі p = np.exp(y) p /= p.sum() # [0.016 0.117 0.867 0. ]
Помилка за крос-ентропією
Нехай класи не перетинаються і відомо, що $i$-й приклад навчальної множини належить до класу $c=c(i)$.
Виходи моделі вважаємо ймовірностями класів (їхня сума дорівнює одиниці).
При суворій класифікації робота моделі тим краща, чим більші в середньому ці ймовірності.
Тому, як функцію втрат (яку необхідно мінімізувати)
можна взяти середнє від логарифма ймовірності на виході $y_{i,с(i)}$ зі зворотним знаком:
$$
L = -\frac{1}{N}\sum^{N-1}_{i=0} ~ \ln y_{i,c(i)}.
$$
Цю помилку називають крос-ентропією (CE, сross-entropy).
Цю ж формулу можна застосовувати в бінарній класифікації, зробивши у моделі два виходи.
Для $C$ класів, якщо модель випадково і рівноймовірно ($y_\alpha\sim 1/C$) видає довільний клас, то $L=\log C$ або $\exp(L)$ дорівнює числу класів. Якщо ж модель працює безпомилково, то $L=0$.
У випадку нечіткої класифікації з класами, що не перетинаються, можна задавати розподіл ймовірності $\hat{y}_{i\alpha}$ того, що $i$-й приклад належить до класу $\alpha$. Тоді функція втрат дорівнюватиме: $$ L = -\frac{1}{N}\sum^{N-1}_{i=0}~\sum^{C-1}_{\alpha=0} ~~\hat{y}_{i\alpha}\, \ln y_{i\alpha}. $$ Така крос-ентропія двох розподілів ймовірностей $\hat{\mathbf{y}}_{\alpha}$ і $\mathbf{y}_{\alpha}$ досягає мінімуму, коли ці ймовірності збігаються. У окремому випадку, коли для $i$-го прикладу $\hat{y}_{i\alpha}=\{0,...,0,1,0,...0\}$, де $1$ стоїть на позиції $c(i)$, якщо приклад належить до класу під номером $c(i)$, ми повертаємося до попереднього випадку.
Для задач з класами, що перетинаються, зазвичай, використовують MSE, оскільки в цьому випадку сума виходів не дорівнює одиниці. Тому максимізація лише ймовірностей "правильних класів" не гарантує мінімізації виходів для "неправильних класів" (у MSE, на відміну від CE, присутні всі класи).
Критерії акуратності в загальному випадку
Коли класів більше двох, можна, як і раніше, використовувати акуратність, що дорівнює відношенню правильних класифікацій до загального числа прикладів. Але це буде достатньо грубою метрикою. Більш детальною мірою якості є матриця помилок (confusion matrix):
Діагональні елементи $N_{\alpha\alpha}$ - це число вірних передбачень моделі. Нижче наведено приклад $N_{\alpha\beta}$ для трьох класів. Реальне число об'єктів кожного класу дорівнює 11, 14, 12. Найкраще модель передбачає перший клас (перший стовпчик - лише одна помилка), найгірше - третій (останній стовпчик): $$ N_{\alpha\beta} ~=~ \overbrace{ \begin{array}{|c|c|c|} \hline 10 & 0 & 0 \\ \hline 1 & 11 & 4 \\ \hline 0 & 3 & 8 \\ \hline \end{array} }^{\displaystyle\text{actual}} \left. \phantom{ \begin{array}{c} \\ \\ \\ \end{array} } \right\}\text{predicted} $$
Сума по стовпцях дорівнює числу прикладів даного класу $N_\alpha$ (по рядках - їх число за передбаченнями моделі): $$ N_\beta = \sum_{\alpha} N_{\alpha\beta} ~-~\text{число прикладів класу $\beta$},~~~~~~~~~~~~~~N = \sum_{\alpha,\beta} N_{\alpha\beta} ~-~\text{всього прикладів}. $$ Ступінь "однаковості" частот $n_\alpha=N_\alpha/N$ прикладів різних класів характеризує відносна ентропія $H$, що лежить в інтервалі [0...1]. Чим вона ближча до одиниці, тим краще збалансовані приклади за $C$ класами: $$ H = -\sum_{\alpha} n_\alpha\,\log n_\alpha/\log C $$
За аналогією з бінарною класифікацією можна ввести метрики точності (precision) та повноти (recall, вона ж акуратність) для кожного класу $\alpha$: $$ P_\alpha = \frac{N_{\alpha\alpha}}{\sum_\beta N_{\alpha\beta}},~~~~~~~~~~~R_\alpha=\frac{N_{\alpha\alpha}}{N_\alpha} $$ та їх середні значення по всіх класах: $$ \text{Precision} = \frac{1}{C}\sum^{C-1}_{\alpha=0} P_\alpha,~~~~~~~~~~~~~ \text{Recall} = \frac{1}{C}\sum^{C-1}_{\alpha=0} R_\alpha,~~~~~~~~~~~~ \text{Accuracy} = \frac{\sum_\alpha N_{\alpha\alpha}}{N} $$ Наведемо приклад обчислення різних метрик за допомогою Numpy:
cm = np.array([[100, 5, 0], # матриця помилок
[ 9, 50, 5],
[ 0, 0, 1]])
N = cm.sum() # 170 число прикладів
n = cm.sum(axis=0)/N # [0.641 0.324 0.035] частоти класів
H = -(n*np.log(n)).sum()/np.log(cm.shape[0]) # 0.699 ентропія/log(C)
A = np.trace(cm)/N # 0.888 акуратність
P = (np.diag(cm)/cm.sum(axis=1)).mean() # 0.911 точність
R = (np.diag(cm)/cm.sum(axis=0)).mean() # 0.664 повнота
Можлива ситуація, коли один клас дуже погано передбачається: $R_{\alpha}\sim 0$ і губиться серед вірних передбачень інших класів. У цьому випадку можна обчислити відносну ентропію нормованих повнот по всіх класах, яка характеризує ступінь "однаковості" цих повнот (акуратностей кожного класу): $$ \text{HR} = -\sum_\alpha r_\alpha \log\,r_\alpha/\log C,~~~~~~~~~~~~~~~~~~~r_\alpha=\frac{ R_\alpha }{\sum_\beta R_\beta}. $$
Так, для прикладу вище:r = np.diag(cm)/cm.sum(axis=0) r = r/r.sum() HR = -(r*np.log(r)).sum()/np.log(cm.shape[0]) # 0.773
У будь-якому випадку, найбільш детальна інформація про якість роботи моделі знаходиться в матриці помилок.
Метод K-найближчих сусідів
Не всі моделі є диференційовними функціями своїх параметрів.
Розглянемо, наприклад, метод K-найближчих сусідів, в якому
замість навчання, запам'ятовується вся тренувальна вибірка (вона виступає в ролі "параметрів"
моделі).
При класифікації даного об'єкта $\mathbf{x}$
вивчають його безпосереднє оточення в навчальній вибірці і на його основі роблять
висновок про належність прикладу до того чи іншого класу, наприклад,
обирають клас найближчого сусіда.
Зрозуміло, що якість методу суттєво залежить від правильного вибору
функції відстані $d(\mathbf{x},\mathbf{x}')$ між двома точками в просторі ознак.
За наявності шуму краще взяти не одного, а K найближчих сусідів $d(\mathbf{x},\mathbf{x}_1)\le d(\mathbf{x},\mathbf{x}_2)\le...\le d(\mathbf{x},\mathbf{x}_K)$ і використовувати клас, що зустрічається найчастіше (голосування). Інший різновид методу полягає у використанні сусідів, що потрапили всередину сфери радіуса R. Число K або радіус R є гіперпараметрами методу.
Підбір гіперпараметрів можна проводити методом LOO (leave-one-out). Для цього метод сусідів застосовується по черзі до кожного об'єкта навчальної вибірки (поточний об'єкт у складі своїх сусідів, звичайно, не враховується). Обирається те значення гіперпараметра, для якого акуратність розпізнавання класу найбільша.
Тренування, тестування та валідація
Як уже згадувалося, підбір параметрів моделі необхідно проводити на тренувальних даних (мінімізуючи функцію помилки), а перевіряти акуратність роботи на тестових даних. У загальному випадку дані розбивають на три множини: тренувальну (train), валідаційну (validation) та тестову (test):
На валідаційній множині відбувається перевірка даної моделі на перенавченість. Якщо для тренувальних даних помилка падає, критерії акуратності зростають, а на валідаційних даних - все навпаки, то необхідно зменшувати число параметрів або змінювати модель. Тестові дані в цих ітераціях з підбору моделі та її тренування не беруть участі. Вони слугують для оцінки якості роботи фінальної моделі.
Валідаційні дані можуть також слугувати для підбору гіперпараметрів моделі. Існує кілька способів розділення даних на тренувальну та валідаційну множини. При простому розбитті вихідні об'єкти випадково перемішуються і деяка їхня частка (наприклад 25%) оголошується валідацією.
Більш загальним способом є крос-валідація (cross-validation). Дані для навчання розбиваються на q приблизно однакових блоків. Спочатку як валідація обирається перший блок, а решта використовуються для тренування. Потім валідацією виступає другий блок і т.д.
Цю процедуру можна повторити t-разів, випадково перемішуючи дані, що називається методом (t x q) - fold cross-validation. Акуратність моделі усереднюється по всіх блоках і повторах. Метод leave-one-out є окремим випадком, коли t=1, q=N-1, де N - число прикладів.
Конструювання ознак
Якщо ознаки, що характеризують об'єкт, обрані правильно, задача машинного навчання стає тривіальною. Наведемо класичний приклад. Нижче в двовимірному просторі ознак потрібно класифікувати два класи (квадрати та кола). На лівому малюнку ознаки є декартовими координатами $\{x_0,x_1\}$, а поверхнею, що розділяє класи, слугує коло:
Свого часу великі зусилля були спрямовані на пошук різних способів конструювання хороших ознак у об'єктів. Зараз вважається, що це не обов'язково робити, і глибокі нейронні мережі в процесі навчання "самі" формують на своєму останньому шарі найбільш ефективний опис об'єктів.
Незважаючи на очевидні успіхи цього підходу,
підготовка хороших ознак навчанню моделі не шкодить.
Зокрема, зазвичай варто хоча б нормалізувати
вхідні дані.
Для цього за кожною ознакою обчислюється її середнє $\bar{x}_\alpha$ по всіх прикладах
та дисперсія $\sigma^2_\alpha$ і переходять до нових ознак:
$$
x_{i\alpha} \mapsto \frac{x_{i\alpha}- \bar{x}_\alpha}{\sigma_\alpha},~~~~~~~~~~~~~~~~\bar{x}_\alpha=\frac{1}{N}\sum^{N-1}_{i=0} x_{i\alpha},~~~~~~~~
\sigma^2_\alpha =\frac{1}{N-1}\sum^{N-1}_{i=0}(x_{i\alpha}-\bar{x}_\alpha)^2.
$$
Таким чином нормалізовані ознаки матимуть однаковий масштаб, що може спростити навчання.
На завершення нагадаємо стару притчу:
Одного разу Джед і Нед захотіли розрізняти своїх коней. Джед зробив на вусі коня подряпину. Але кінь Неда подряпав об колючку те саме вухо. Тоді Нед причепив блакитний бант на хвіст свого коня, але кінь Джеда його зжер. Фермери довго розмірковували і обрали ознаку, яку не так легко змінити. Вони ретельно виміряли зріст коней, і виявилося, що чорна кобила Джеда на один сантиметр вища за білого жеребця Неда.