Big Data Analytics: aprendizaje en línea

El aprendizaje en línea es un subcampo del aprendizaje automático que permite escalar modelos de aprendizaje supervisado a conjuntos de datos masivos. La idea básica es que no necesitamos leer todos los datos en la memoria para ajustar un modelo, solo necesitamos leer cada instancia a la vez.

En este caso, mostraremos cómo implementar un algoritmo de aprendizaje en línea mediante regresión logística. Como en la mayoría de los algoritmos de aprendizaje supervisado, existe una función de costo que se minimiza. En regresión logística, la función de costo se define como:

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

donde J (θ) representa la función de costo y h θ (x) representa la hipótesis. En el caso de regresión logística se define con la siguiente fórmula:

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

Ahora que hemos definido la función de costo, necesitamos encontrar un algoritmo para minimizarla. El algoritmo más simple para lograr esto se llama descenso de gradiente estocástico. La regla de actualización del algoritmo para los pesos del modelo de regresión logística se define como:

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

Hay varias implementaciones del siguiente algoritmo, pero la que se implementó en la biblioteca de Wutpal Wabbit es de lejos la más desarrollada. La biblioteca permite el entrenamiento de modelos de regresión a gran escala y utiliza pequeñas cantidades de RAM. En las propias palabras de los creadores, se describe como: "El proyecto Vowpal Wabbit (VW) es un sistema de aprendizaje rápido fuera del núcleo patrocinado por Microsoft Research y (anteriormente) Yahoo! Research".

Trabajaremos con el conjunto de datos titánico de un kagglecompetencia. Los datos originales se pueden encontrar en elbda/part3/vwcarpeta. Aquí tenemos dos archivos:

  • Tenemos datos de entrenamiento (train_titanic.csv) y
  • datos sin etiquetar para hacer nuevas predicciones (test_titanic.csv).

Para convertir el formato csv al vowpal wabbit formato de entrada utilice el csv_to_vowpal_wabbit.pysecuencia de comandos de Python. Obviamente, necesitará tener instalado Python para esto. Navega albda/part3/vw carpeta, abra la terminal y ejecute el siguiente comando:

python csv_to_vowpal_wabbit.py

Tenga en cuenta que para esta sección, si está usando Windows, necesitará instalar una línea de comando Unix, ingrese el sitio web de cygwin para eso.

Abre el terminal y también en la carpeta bda/part3/vw y ejecute el siguiente 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

Analicemos lo que cada argumento del vw call medio.

  • -f model.vw - significa que estamos guardando el modelo en el archivo model.vw para hacer predicciones más adelante

  • --binary - Reporta pérdidas como clasificación binaria con etiquetas -1,1

  • --passes 20 - Los datos se utilizan 20 veces para aprender los pesos.

  • -c - crear un archivo de caché

  • -q ff - Usar características cuadráticas en el espacio de nombres f

  • --sgd - Utilice una actualización de descenso de gradiente estocástico regular / clásico / simple, es decir, no adaptativo, no normalizado y no invariante.

  • --l1 --l2 - Regularización de normas L1 y L2

  • --learning_rate 0.5 - La tasa de aprendizaje α según se define en la fórmula de la regla de actualización

El siguiente código muestra los resultados de ejecutar el modelo de regresión en la línea de comandos. En los resultados, obtenemos la pérdida de registro promedio y un pequeño informe del rendimiento del 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

Ahora podemos usar el model.vw nos capacitamos para generar predicciones con nuevos datos.

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

Las predicciones generadas en el comando anterior no están normalizadas para ajustarse al rango [0, 1]. Para hacer esto, usamos una transformación 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