Big Data Analytics - nauka online

Uczenie się online to poddziedzina uczenia maszynowego, która umożliwia skalowanie nadzorowanych modeli uczenia się do ogromnych zbiorów danych. Podstawową ideą jest to, że nie musimy czytać wszystkich danych z pamięci, aby dopasować model, musimy tylko czytać każdą instancję na raz.

W tym przypadku pokażemy, jak zaimplementować algorytm uczenia się online za pomocą regresji logistycznej. Podobnie jak w większości algorytmów uczenia nadzorowanego istnieje funkcja kosztu, która jest zminimalizowana. W regresji logistycznej funkcję kosztu definiuje się jako -

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

gdzie J (θ) reprezentuje funkcję kosztu, a h θ (x) reprezentuje hipotezę. W przypadku regresji logistycznej określa się ją wzorem -

$$ h_ \ theta (x) = \ frac {1} {1 + e ^ {\ theta ^ T x}} $$

Po zdefiniowaniu funkcji kosztu musimy znaleźć algorytm, aby ją zminimalizować. Najprostszy algorytm służący do osiągnięcia tego nazywa się stochastycznym spadkiem gradientowym. Reguła aktualizacji algorytmu dla wag modelu regresji logistycznej jest zdefiniowana jako -

$$ \ theta_j: = \ theta_j - \ alpha (h_ \ theta (x) - y) x $$

Istnieje kilka implementacji następującego algorytmu, ale ten zaimplementowany w bibliotece wabbit samogłosek jest zdecydowanie najbardziej rozwinięty. Biblioteka umożliwia uczenie modeli regresji na dużą skalę i wykorzystuje niewielkie ilości pamięci RAM. Własnymi słowami twórców jest on opisany jako: „Projekt Vowpal Wabbit (VW) to szybki, poza rdzeniem system uczenia się sponsorowany przez Microsoft Research i (wcześniej) Yahoo! Research”.

Będziemy pracować z zestawem danych Titanic z pliku kagglekonkurencja. Oryginalne dane można znaleźć w plikubda/part3/vwteczka. Tutaj mamy dwa pliki -

  • Mamy dane treningowe (train_titanic.csv) i
  • nieoznakowane dane w celu tworzenia nowych prognoz (test_titanic.csv).

Aby przekonwertować format csv do formatu vowpal wabbit format wejściowy użyj csv_to_vowpal_wabbit.pyskrypt Pythona. Oczywiście będziesz musiał mieć w tym celu zainstalowany Python. Przejdź dobda/part3/vw folder, otwórz terminal i wykonaj następujące polecenie -

python csv_to_vowpal_wabbit.py

Zwróć uwagę, że w tej sekcji, jeśli używasz systemu Windows, musisz zainstalować wiersz poleceń systemu Unix, wprowadź w tym celu witrynę internetową cygwin .

Otwórz terminal, a także w folderze bda/part3/vw i wykonaj następujące polecenie -

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

Złóżmy, co każdy argument funkcji vw call znaczy.

  • -f model.vw - oznacza, że ​​zapisujemy model w pliku model.vw w celu późniejszego wykonania prognoz

  • --binary - Zgłasza stratę jako klasyfikację binarną z etykietami -1,1

  • --passes 20 - Dane są używane 20 razy do nauki wagi

  • -c - utwórz plik pamięci podręcznej

  • -q ff - Użyj funkcji kwadratowych w przestrzeni nazw f

  • --sgd - używaj regularnej / klasycznej / prostej aktualizacji gradientu stochastycznego, tj. Nieadaptacyjna, nienormalizowana i niezmiennicza.

  • --l1 --l2 - regularyzacja norm L1 i L2

  • --learning_rate 0.5 - Współczynnik uczenia α zgodnie z formułą reguły aktualizacji

Poniższy kod przedstawia wyniki uruchomienia modelu regresji w wierszu polecenia. W wynikach otrzymujemy średnią utratę dziennika i mały raport o wydajności algorytmu.

-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

Teraz możemy użyć model.vw przeszkoliliśmy się w generowaniu prognoz na podstawie nowych danych.

vw -d test_titanic.vw -t -i model.vw -p predictions.txt

Prognozy wygenerowane w poprzednim poleceniu nie są znormalizowane w celu dopasowania do zakresu [0, 1]. Aby to zrobić, używamy transformacji sigmoidalnej.

# 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