Big Data Analytics - Apprentissage en ligne

L'apprentissage en ligne est un sous-domaine de l'apprentissage automatique qui permet d'adapter les modèles d'apprentissage supervisé à des ensembles de données massifs. L'idée de base est que nous n'avons pas besoin de lire toutes les données en mémoire pour s'adapter à un modèle, nous avons seulement besoin de lire chaque instance à la fois.

Dans ce cas, nous montrerons comment implémenter un algorithme d'apprentissage en ligne en utilisant la régression logistique. Comme dans la plupart des algorithmes d'apprentissage supervisé, il existe une fonction de coût qui est minimisée. Dans la régression logistique, la fonction de coût est définie comme -

$$ 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 (θ) représente la fonction de coût et h θ (x) représente l'hypothèse. Dans le cas de la régression logistique, elle est définie par la formule suivante -

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

Maintenant que nous avons défini la fonction de coût, nous devons trouver un algorithme pour la minimiser. L'algorithme le plus simple pour y parvenir est appelé descente de gradient stochastique. La règle de mise à jour de l'algorithme pour les poids du modèle de régression logistique est définie comme -

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

Il existe plusieurs implémentations de l'algorithme suivant, mais celle implémentée dans la bibliothèque vowpal wabbit est de loin la plus développée. La bibliothèque permet la formation de modèles de régression à grande échelle et utilise de petites quantités de RAM. Selon les propres mots des créateurs, il est décrit comme suit: "Le projet Vowpal Wabbit (VW) est un système d'apprentissage rapide hors du cœur sponsorisé par Microsoft Research et (auparavant) Yahoo! Research".

Nous travaillerons avec l'ensemble de données titanesques d'un kaggleconcurrence. Les données originales se trouvent dans lebda/part3/vwdossier. Ici, nous avons deux fichiers -

  • Nous avons des données d'entraînement (train_titanic.csv), et
  • données non étiquetées afin de faire de nouvelles prédictions (test_titanic.csv).

Afin de convertir le format csv en vowpal wabbit format d'entrée utilisez le csv_to_vowpal_wabbit.pyscript python. Vous aurez évidemment besoin d'installer python pour cela. Accédez aubda/part3/vw dossier, ouvrez le terminal et exécutez la commande suivante -

python csv_to_vowpal_wabbit.py

Notez que pour cette section, si vous utilisez Windows, vous devrez installer une ligne de commande Unix, entrez sur le site Web cygwin pour cela.

Ouvrez le terminal et également dans le dossier bda/part3/vw et exécutez la commande suivante -

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

Décomposons ce que chaque argument de la vw call veux dire.

  • -f model.vw - signifie que nous enregistrons le modèle dans le fichier model.vw pour faire des prédictions plus tard

  • --binary - Rapporte la perte sous forme de classification binaire avec -1,1 étiquettes

  • --passes 20 - Les données sont utilisées 20 fois pour apprendre les poids

  • -c - créer un fichier cache

  • -q ff - Utiliser des fonctionnalités quadratiques dans l'espace de noms f

  • --sgd - utiliser la mise à jour de descente de gradient stochastique régulière / classique / simple, c'est-à-dire non adaptative, non normalisée et non invariante.

  • --l1 --l2 - Régularisation des normes L1 et L2

  • --learning_rate 0.5 - Le taux d'apprentissage α tel que défini dans la formule de règle de mise à jour

Le code suivant montre les résultats de l'exécution du modèle de régression dans la ligne de commande. Dans les résultats, nous obtenons la perte de journal moyenne et un petit rapport sur les performances de l'algorithme.

-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

Maintenant, nous pouvons utiliser le model.vw nous nous sommes entraînés à générer des prédictions avec de nouvelles données.

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

Les prédictions générées dans la commande précédente ne sont pas normalisées pour tenir entre la plage [0, 1]. Pour ce faire, nous utilisons une transformation sigmoïde.

# 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