Аналитика больших данных - онлайн-обучение

Онлайн-обучение - это подраздел машинного обучения, которое позволяет масштабировать модели контролируемого обучения до огромных наборов данных. Основная идея состоит в том, что нам не нужно читать все данные в памяти, чтобы соответствовать модели, нам нужно только читать каждый экземпляр за раз.

В этом случае мы покажем, как реализовать алгоритм онлайн-обучения с использованием логистической регрессии. Как и в большинстве алгоритмов контролируемого обучения, функция стоимости минимизирована. В логистической регрессии функция затрат определяется как -

$$ 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