Análise de Big Data - Aprendizado Online

O aprendizado online é um subcampo do aprendizado de máquina que permite dimensionar modelos de aprendizado supervisionado para conjuntos de dados massivos. A ideia básica é que não precisamos ler todos os dados na memória para ajustar um modelo, precisamos apenas ler cada instância de cada vez.

Neste caso, mostraremos como implementar um algoritmo de aprendizagem online usando regressão logística. Como na maioria dos algoritmos de aprendizado supervisionado, existe uma função de custo que é minimizada. Na regressão logística, a função de custo é definida 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] $$

onde J (θ) representa a função de custo eh θ (x) representa a hipótese. No caso de regressão logística é definida com a seguinte fórmula -

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

Agora que definimos a função de custo, precisamos encontrar um algoritmo para minimizá-la. O algoritmo mais simples para conseguir isso é chamado de descida gradiente estocástica. A regra de atualização do algoritmo para os pesos do modelo de regressão logística é definida como -

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

Existem várias implementações do algoritmo a seguir, mas aquele implementado na biblioteca wabbit vowpal é de longe o mais desenvolvido. A biblioteca permite o treinamento de modelos de regressão em grande escala e usa pequenas quantidades de RAM. Nas próprias palavras dos criadores, ele é descrito como: "O projeto Vowpal Wabbit (VW) é um sistema de aprendizagem out-of-core rápido patrocinado pela Microsoft Research e (anteriormente) Yahoo! Research".

Estaremos trabalhando com o conjunto de dados titânico de um kaggleconcorrência. Os dados originais podem ser encontrados nobda/part3/vwpasta. Aqui, temos dois arquivos -

  • Temos dados de treinamento (train_titanic.csv), e
  • dados não rotulados para fazer novas previsões (test_titanic.csv).

Para converter o formato csv para o vowpal wabbit formato de entrada use o csv_to_vowpal_wabbit.pyscript python. Obviamente, você precisará ter o python instalado para isso. Navegue até obda/part3/vw pasta, abra o terminal e execute o seguinte comando -

python csv_to_vowpal_wabbit.py

Observe que para esta seção, se você estiver usando o Windows, você precisará instalar uma linha de comando Unix, entre no site do cygwin para isso.

Abra o terminal e também na pasta bda/part3/vw e execute o seguinte 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

Vamos quebrar o que cada argumento do vw call significa.

  • -f model.vw - significa que estamos salvando o modelo no arquivo model.vw para fazer previsões mais tarde

  • --binary - Relatórios de perda como classificação binária com -1,1 rótulos

  • --passes 20 - Os dados são usados ​​20 vezes para aprender os pesos

  • -c - criar um arquivo de cache

  • -q ff - Use recursos quadráticos no namespace f

  • --sgd - usar atualização de gradiente descendente estocástico regular / clássico / simples, ou seja, não adaptativo, não normalizado e não invariante.

  • --l1 --l2 - Regularização das normas L1 e L2

  • --learning_rate 0.5 - A taxa de aprendizagem α conforme definida na fórmula da regra de atualização

O código a seguir mostra os resultados da execução do modelo de regressão na linha de comando. Nos resultados, obtemos a perda de log média e um pequeno relatório do desempenho do 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

Agora podemos usar o model.vw treinamos para gerar previsões com novos dados.

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

As previsões geradas no comando anterior não são normalizadas para caber no intervalo [0, 1]. Para fazer isso, usamos uma transformação sigmóide.

# 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