Big Data Analytics - Online-Lernen

Online-Lernen ist ein Teilbereich des maschinellen Lernens, mit dem überwachte Lernmodelle auf umfangreiche Datensätze skaliert werden können. Die Grundidee ist, dass wir nicht alle Daten im Speicher lesen müssen, um zu einem Modell zu passen, sondern nur jede Instanz gleichzeitig lesen müssen.

In diesem Fall zeigen wir, wie ein Online-Lernalgorithmus mithilfe der logistischen Regression implementiert wird. Wie bei den meisten überwachten Lernalgorithmen gibt es eine Kostenfunktion, die minimiert wird. In der logistischen Regression ist die Kostenfunktion definiert als -

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

wobei J (& thgr;) die Kostenfunktion darstellt und h & thgr; (x) die Hypothese darstellt. Im Falle einer logistischen Regression wird sie mit der folgenden Formel definiert:

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

Nachdem wir die Kostenfunktion definiert haben, müssen wir einen Algorithmus finden, um sie zu minimieren. Der einfachste Algorithmus, um dies zu erreichen, heißt stochastischer Gradientenabstieg. Die Aktualisierungsregel des Algorithmus für die Gewichte des logistischen Regressionsmodells ist definiert als -

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

Es gibt mehrere Implementierungen des folgenden Algorithmus, aber die in der vowpal wabbit- Bibliothek implementierte ist bei weitem die am weitesten entwickelte. Die Bibliothek ermöglicht das Training von Regressionsmodellen in großem Maßstab und verwendet kleine Mengen an RAM. In den eigenen Worten des Erstellers heißt es: "Das Vowpal Wabbit (VW) -Projekt ist ein schnelles Out-of-Core-Lernsystem, das von Microsoft Research und (zuvor) Yahoo! Research gesponsert wird."

Wir werden mit dem Titanic-Datensatz von a arbeiten kaggleWettbewerb. Die Originaldaten finden Sie in derbda/part3/vwMappe. Hier haben wir zwei Dateien -

  • Wir haben Trainingsdaten (train_titanic.csv) und
  • unbeschriftete Daten, um neue Vorhersagen zu treffen (test_titanic.csv).

Um das CSV-Format in das zu konvertieren vowpal wabbit Eingabeformat verwenden Sie die csv_to_vowpal_wabbit.pyPython-Skript. Dafür muss natürlich Python installiert sein. Navigieren Sie zubda/part3/vw Ordner, öffnen Sie das Terminal und führen Sie den folgenden Befehl aus:

python csv_to_vowpal_wabbit.py

Beachten Sie, dass Sie für diesen Abschnitt, wenn Sie Windows verwenden, eine Unix-Befehlszeile installieren müssen, die Cygwin- Website dafür aufrufen müssen .

Öffnen Sie das Terminal und auch im Ordner bda/part3/vw und führen Sie den folgenden Befehl aus:

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

Lassen Sie uns zusammenfassen, was jedes Argument der vw call meint.

  • -f model.vw - bedeutet, dass wir das Modell in der Datei model.vw speichern, um später Vorhersagen zu treffen

  • --binary - Meldet Verlust als binäre Klassifizierung mit -1,1 Bezeichnungen

  • --passes 20 - Die Daten werden 20 Mal verwendet, um die Gewichte zu lernen

  • -c - Erstellen Sie eine Cache-Datei

  • -q ff - Verwenden Sie quadratische Features im f-Namespace

  • --sgd - Verwenden Sie ein reguläres / klassisches / einfaches stochastisches Gradientenabstiegs-Update, dh nicht adaptiv, nicht normalisiert und nicht invariant.

  • --l1 --l2 - Regularisierung der Normen L1 und L2

  • --learning_rate 0.5 - Die Lernrate α ist in der Aktualisierungsregelformel definiert

Der folgende Code zeigt die Ergebnisse der Ausführung des Regressionsmodells in der Befehlszeile. In den Ergebnissen erhalten wir den durchschnittlichen Protokollverlust und einen kleinen Bericht über die Leistung des Algorithmus.

-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

Jetzt können wir die verwenden model.vw Wir haben trainiert, um Vorhersagen mit neuen Daten zu generieren.

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

Die im vorherigen Befehl generierten Vorhersagen werden nicht so normalisiert, dass sie in den Bereich [0, 1] passen. Dazu verwenden wir eine Sigmoid-Transformation.

# 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