Аналитика больших данных - онлайн-обучение
Онлайн-обучение - это подраздел машинного обучения, которое позволяет масштабировать модели контролируемого обучения до огромных наборов данных. Основная идея состоит в том, что нам не нужно читать все данные в памяти, чтобы соответствовать модели, нам нужно только читать каждый экземпляр за раз.
В этом случае мы покажем, как реализовать алгоритм онлайн-обучения с использованием логистической регрессии. Как и в большинстве алгоритмов контролируемого обучения, функция стоимости минимизирована. В логистической регрессии функция затрат определяется как -
$$ J (\ theta) \: = \: \ frac {-1} {m} \ left [\ sum_ {i = 1} ^ {m} y ^ {(i)} log (h _ {\ theta} ( x ^ {(i)})) + (1 - y ^ {(i)}) log (1 - h _ {\ theta} (x ^ {(i)})) \ right] $$
где J (θ) представляет функцию стоимости, а h θ (x) представляет гипотезу. В случае логистической регрессии это определяется следующей формулой -
$$ h_ \ theta (x) = \ frac {1} {1 + e ^ {\ theta ^ T x}} $$
Теперь, когда мы определили функцию стоимости, нам нужно найти алгоритм для ее минимизации. Простейший алгоритм достижения этого называется стохастическим градиентным спуском. Правило обновления алгоритма весов модели логистической регрессии определяется как -
$$ \ theta_j: = \ theta_j - \ alpha (h_ \ theta (x) - y) x $$
Существует несколько реализаций следующего алгоритма, но тот, который реализован в библиотеке vowpal wabbit , на сегодняшний день является наиболее развитым. Библиотека позволяет обучать крупномасштабные регрессионные модели и использует небольшой объем оперативной памяти. По словам самих создателей, он описывается следующим образом: «Проект Vowpal Wabbit (VW) - это система быстрого внепланового обучения, спонсируемая Microsoft Research и (ранее) Yahoo! Research».
Мы будем работать с набором данных titanic из kaggleконкуренция. Исходные данные можно найти вbda/part3/vwпапка. Здесь у нас есть два файла -
- У нас есть данные для обучения (train_titanic.csv), и
- немаркированные данные для создания новых прогнозов (test_titanic.csv).
Чтобы преобразовать формат csv в формат vowpal wabbit формат ввода используйте csv_to_vowpal_wabbit.pyскрипт на Python. Очевидно, для этого вам понадобится установленный Python. Перейдите кbda/part3/vw папку, откройте терминал и выполните следующую команду -
python csv_to_vowpal_wabbit.py
Обратите внимание, что в этом разделе, если вы используете Windows, вам нужно будет установить командную строку Unix, для этого войдите на сайт cygwin .
Открываем терминал и тоже в папке bda/part3/vw и выполните следующую команду -
vw train_titanic.vw -f model.vw --binary --passes 20 -c -q ff --sgd --l1
0.00000001 --l2 0.0000001 --learning_rate 0.5 --loss_function logistic
Давайте разберемся, что каждый аргумент vw call средства.
-f model.vw - означает, что мы сохраняем модель в файле model.vw для дальнейшего прогнозирования
--binary - Сообщает о потерях как двоичную классификацию с метками -1,1
--passes 20 - Данные используются 20 раз для определения веса
-c - создать файл кеша
-q ff - Используйте квадратичные функции в пространстве имен f
--sgd - использовать регулярное / классическое / простое обновление стохастического градиентного спуска, т.е. неадаптивное, ненормализованное и неинвариантное.
--l1 --l2 - регуляризация норм L1 и L2
--learning_rate 0.5 - Скорость обучения α, определенная в формуле правила обновления
В следующем коде показаны результаты запуска регрессионной модели в командной строке. В результате мы получаем среднюю логарифмическую потерю и небольшой отчет о производительности алгоритма.
-loss_function logistic
creating quadratic features for pairs: ff
using l1 regularization = 1e-08
using l2 regularization = 1e-07
final_regressor = model.vw
Num weight bits = 18
learning rate = 0.5
initial_t = 1
power_t = 0.5
decay_learning_rate = 1
using cache_file = train_titanic.vw.cache
ignoring text input in favor of cache input
num sources = 1
average since example example current current current
loss last counter weight label predict features
0.000000 0.000000 1 1.0 -1.0000 -1.0000 57
0.500000 1.000000 2 2.0 1.0000 -1.0000 57
0.250000 0.000000 4 4.0 1.0000 1.0000 57
0.375000 0.500000 8 8.0 -1.0000 -1.0000 73
0.625000 0.875000 16 16.0 -1.0000 1.0000 73
0.468750 0.312500 32 32.0 -1.0000 -1.0000 57
0.468750 0.468750 64 64.0 -1.0000 1.0000 43
0.375000 0.281250 128 128.0 1.0000 -1.0000 43
0.351562 0.328125 256 256.0 1.0000 -1.0000 43
0.359375 0.367188 512 512.0 -1.0000 1.0000 57
0.274336 0.274336 1024 1024.0 -1.0000 -1.0000 57 h
0.281938 0.289474 2048 2048.0 -1.0000 -1.0000 43 h
0.246696 0.211454 4096 4096.0 -1.0000 -1.0000 43 h
0.218922 0.191209 8192 8192.0 1.0000 1.0000 43 h
finished run
number of examples per pass = 802
passes used = 11
weighted example sum = 8822
weighted label sum = -2288
average loss = 0.179775 h
best constant = -0.530826
best constant’s loss = 0.659128
total feature number = 427878
Теперь мы можем использовать model.vw мы научились делать прогнозы на новых данных.
vw -d test_titanic.vw -t -i model.vw -p predictions.txt
Прогнозы, сгенерированные в предыдущей команде, не нормализованы, чтобы соответствовать диапазону [0, 1]. Для этого мы используем сигмовидное преобразование.
# Read the predictions
preds = fread('vw/predictions.txt')
# Define the sigmoid function
sigmoid = function(x) {
1 / (1 + exp(-x))
}
probs = sigmoid(preds[[1]])
# Generate class labels
preds = ifelse(probs > 0.5, 1, 0)
head(preds)
# [1] 0 1 0 0 1 0