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