Big Data Analytics - Apprendimento online

L'apprendimento online è un sottocampo dell'apprendimento automatico che consente di scalare i modelli di apprendimento supervisionato a enormi set di dati. L'idea di base è che non abbiamo bisogno di leggere tutti i dati in memoria per adattare un modello, abbiamo solo bisogno di leggere ogni istanza alla volta.

In questo caso, mostreremo come implementare un algoritmo di apprendimento online utilizzando la regressione logistica. Come nella maggior parte degli algoritmi di apprendimento supervisionato, esiste una funzione di costo ridotta al minimo. Nella regressione logistica, la funzione di costo è definita come:

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

dove J (θ) rappresenta la funzione di costo e h θ (x) rappresenta l'ipotesi. Nel caso di regressione logistica si definisce con la seguente formula:

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

Ora che abbiamo definito la funzione di costo, dobbiamo trovare un algoritmo per minimizzarla. L'algoritmo più semplice per ottenere questo risultato è chiamato discesa del gradiente stocastico. La regola di aggiornamento dell'algoritmo per i pesi del modello di regressione logistica è definita come:

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

Ci sono diverse implementazioni del seguente algoritmo, ma quello implementato nella libreria vowpal wabbit è di gran lunga il più sviluppato. La libreria consente l'addestramento di modelli di regressione su larga scala e utilizza piccole quantità di RAM. Nelle stesse parole dei creatori è descritto come: "Il progetto Vowpal Wabbit (VW) è un sistema di apprendimento veloce out-of-core sponsorizzato da Microsoft Research e (in precedenza) Yahoo! Research".

Lavoreremo con il set di dati Titanic da un file kaggleconcorrenza. I dati originali possono essere trovati nel filebda/part3/vwcartella. Qui abbiamo due file:

  • Abbiamo dati di addestramento (train_titanic.csv) e
  • dati senza etichetta per fare nuove previsioni (test_titanic.csv).

Per convertire il formato csv in vowpal wabbit formato di input utilizzare il csv_to_vowpal_wabbit.pyscript Python. Ovviamente dovrai avere Python installato per questo. Vai al filebda/part3/vw cartella, apri il terminale ed esegui il seguente comando:

python csv_to_vowpal_wabbit.py

Nota che per questa sezione, se stai usando Windows, dovrai installare una riga di comando Unix, entrare nel sito web di cygwin per quello.

Apri il terminale e anche nella cartella bda/part3/vw ed eseguire il seguente comando -

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

Analizziamo ciò che ogni argomento del vw call si intende.

  • -f model.vw - significa che stiamo salvando il modello nel file model.vw per fare previsioni in seguito

  • --binary - Segnala la perdita come classificazione binaria con etichette -1,1

  • --passes 20 - I dati vengono utilizzati 20 volte per apprendere i pesi

  • -c - crea un file di cache

  • -q ff - Usa le caratteristiche quadratiche nello spazio dei nomi f

  • --sgd - utilizzare l'aggiornamento della discesa del gradiente stocastico regolare / classico / semplice, ovvero non adattivo, non normalizzato e non invariante.

  • --l1 --l2 - Regolarizzazione delle norme L1 e L2

  • --learning_rate 0.5 - Il tasso di apprendimento α come definito nella formula della regola di aggiornamento

Il codice seguente mostra i risultati dell'esecuzione del modello di regressione nella riga di comando. Nei risultati, otteniamo la perdita di registro media e un piccolo report delle prestazioni dell'algoritmo.

-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

Ora possiamo usare il file model.vw ci siamo formati per generare previsioni con nuovi dati.

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

Le previsioni generate nel comando precedente non vengono normalizzate per rientrare nell'intervallo [0, 1]. Per fare ciò, usiamo una trasformazione sigmoidea.

# 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