Automatic Relevance Determination або машинне навчання коли даних дуже мало

Коли мова заходить про машинне навчання, зазвичай мають на увазі великі обсяги даних — мільйони чи навіть мільярди транзакцій, з яких треба зробити складний висновок про поведінці, інтересах або поточному стані користувача, покупця або якого-небудь апарату (робота, автомобіля, дрона або верстата).
Однак у житті звичайного аналітика самої звичайної компанії багато даних зустрічається нечасто. Скоріше навіть навпаки — у вас буде мало або дуже мало даних — буквально десятки або сотні записів. Але аналіз все ж потрібно провести. Причому не який потрапило аналіз, а якісний і достовірний.
Часто ситуація ускладнюється ще і тим, що ви без праці можете нагенерить для кожного запису багато ознак (найчастіше додають поліноми, різницю з попереднім значенням і значенням за минулий рік, one-hot-encoding для категоріальних ознак тощо). Ось тільки зовсім нелегко розібратися, які з них дійсно корисні, а які тільки ускладнюють модель і збільшують помилки вашого прозноза.
Для цього ви можете скористатися методами байєсової статистики, наприклад, Automatic Relevance Determination. Це відносно новий метод, запропонований в 1992 Девідом Маку (все почалося з його докторської дисертації (PDF)). Гранично короткий, але незрозуміле виклад методу можна знайти на PDF-презентації. Ясна, але зайво багатослівне пояснення можна подивитися тут:

Якщо зовсім просто, то у ARD для кожного коефіцієнта виводиться апостеріорна оцінка дисперсії, і потім коефіцієнти з малою дисперсією обнуляються.
Подивимося, як це працює на практиці. Отже, у нас є вихідні дані — всього 30 точок (наприклад, дані про 30 магазинах). Причому у кожного магазину по 30 ознак. І ваше завдання — створити регресійну модель (наприклад, передбачити обсяг продажів за даними про розташування, формату, торгової площі, конфігурації, чисельності персоналу та іншим параметрам магазину).
Будувати звичайну лінійну регресію в таких умовах буде чистої води безумством. Давайте ще більше посилимо проблему тим, що лише 5 ознак насправді мають значення, а інші — зовсім не відносяться до справи дані.
Таким чином, нехай реальна залежність представлена формулою Y = w * X + e, e — нормальна випадкова помилка, а коефіцієнти w дорівнюють [1, 2, 3, 4, 5, 0, 0, ....,0], тобто тільки перші п'ять коефіцієнтів ненульові, а ознаки з 6-го по 30-й взагалі ніяк не впливають на реальне значення Y. Однак ми цього не знаємо. У нас є тільки дані — X і Y — а коефіцієнти w нам треба розрахувати.
Тепер запустимо ARD:
import numpy as np
from sklearn.linear_model import ARDRegression

N = 30

# дані про магазинах (в даному прикладі випадкові)
X = np.random.random(size=(N,N)) * 10 + 1

# реальні коефіцієнти [1 2 3 4 5 0 0 ... 0]
w = np.zeros(N)
w[:5] = np.arange(5) + 1

# додамо випадкову помилку
e = np.random.normal(0, 1, size=N)

# дані про продажі
Y = np.dot(X, w) + e

ard = ARDRegression()
ard.fit(X, Y)

print ard.coef_

І отримуємо просто вражаючий результат:
array([ 1.01, 2.14, 2.95, 3.89, 4.79, 0., 0., 0., 0., 0.01, 
0., 0., 0.31, 0.04, -0.05, 0. , 0., 0.01, 0., 0., 
0., 0., 0.01, 0., 0., 0., 0., 0.17, 0., 0. ])

Нагадаю, що реальні коефіцієнти рівні:
array([ 1., 2., 3., 4., 5., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0. ])

Таким чином, маючи всього лише 30 точок в 30-мірному просторі, ми змогли побудувати модель, яка майже в точності повторює реальну залежність.
Для порівняння наведу коефіцієнти, розраховані за допомогою звичайної лінійної регресії:
array([ 0.39 2.07 3.16 2.86 4.8 -0.21 -0.13 0.42 0.6 -0.21 
-0.96 0.03 -0.46 0.57 0.89 0.15 0.24 0.11 -0.38 -0.36 
-0.28 -0.01 0.43 -1.22 0.23 0.15 0.12 0.43 -1.11 -0.3 ])

лінійної регресії з L2-регуляризацией:
array([-0.36 1.48 2.67 3.44 3.99 -0.4 1.01 0.58 -0.81 0.78
-0.13 -0.23 -0.26 -0.24 -0.38 -0.24 -0.38 -0.25 0.54 -0.31 
-0.21 -0.42 0.14 0.88 1.09 0.66 0.12 -0.07 0.08 -0.58])

І вони обидві не витримують ніякої критики.
А ось лінійна регресія з L1-регуляризацией дає схожий результат:
array([ 0.68 1.9 2.88 3.86 4.88 -0.05 0.09 0. 0. 0. 
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 
0. 0. 0.01 0. 0. 0. 0. 0. 0. 0. ])

Як ви бачите, L1-регуляризация навіть краще обнуляє незначущі коефіцієнти, проте значущі коефіцієнти можуть бути розраховані з трохи більшою похибкою.
загалом, ARD — метод чудовий, але є нюанс. Як і багато (можна навіть сказати, майже всі) байєсові методи, ARD надзвичайно складний з обчислювальної точки зору (хоча і добре параллелится). Тому на даних об'ємом декілька десятків-сотень точок він працює швидко (частки секунди), на декількох тисячах — повільно (десятки-сотні секунд), а на десятках і сотнях тисяч — о-о-о-дуже повільно (хвилини, години). Крім того, йому потрібен величезний обсяг оперативної пам'яті.
Однак це не так страшно. Якщо у вас багато даних, то ви сміливо можете користуватися класичними стат.методами, і вони дадуть досить хороший результат. Серйозні проблеми починаються, коли даних мало, і звичайні методи вже не працюють. І тоді на допомогу приходить байєсівської.
ARD активно застосовується в різноманітних kernel-методах, наприклад, Relevance Vector Machine (RVM) — це Support Vector Machine (SVM) разом з ARD. Також він зручний в класифікаторах, коли вам необхідно оцінити значущість наявних ознак. Загалом, спробуйте і вам сподобається.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.