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