ビッグデータ分析-オンライン学習

オンライン学習は、教師あり学習モデルを大規模なデータセットにスケーリングできる機械学習のサブフィールドです。基本的な考え方は、モデルに合わせるためにメモリ内のすべてのデータを読み取る必要はなく、一度に各インスタンスを読み取るだけでよいということです。

この場合、ロジスティック回帰を使用してオンライン学習アルゴリズムを実装する方法を示します。ほとんどの教師あり学習アルゴリズムと同様に、最小化されたコスト関数があります。ロジスティック回帰では、コスト関数は次のように定義されます。

$$ 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(θ)は、コスト関数を表し、H θ(x)は仮説を表します。ロジスティック回帰の場合、次の式で定義されます。

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

コスト関数を定義したので、それを最小化するアルゴリズムを見つける必要があります。これを達成するための最も単純なアルゴリズムは、確率的勾配降下法と呼ばれます。ロジスティック回帰モデルの重みのアルゴリズムの更新ルールは、次のように定義されます。

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

次のアルゴリズムにはいくつかの実装がありますが、vowpalwabbitライブラリに実装されているものが群を抜いて最も開発されています。このライブラリは、大規模な回帰モデルのトレーニングを可能にし、少量のRAMを使用します。作成者自身の言葉では、「Vowpal Wabbit(VW)プロジェクトは、Microsoft Researchおよび(以前の)Yahoo!Researchが後援する高速のアウトオブコア学習システムです」と説明されています。

からのタイタニックデータセットを使用します kaggleコンペ。元のデータはにありますbda/part3/vwフォルダ。ここに、2つのファイルがあります-

  • トレーニングデータ(train_titanic.csv)があり、
  • 新しい予測を行うためのラベルなしデータ(test_titanic.csv)。

csv形式をに変換するには vowpal wabbit 入力形式は csv_to_vowpal_wabbit.pyPythonスクリプト。これには明らかにPythonをインストールする必要があります。に移動しますbda/part3/vw フォルダ、ターミナルを開き、次のコマンドを実行します-

python csv_to_vowpal_wabbit.py

このセクションでは、Windowsを使用している場合は、Unixコマンドラインをインストールする必要があることに注意してください。そのためにcygwinWebサイトにアクセスしてください。

ターミナルとフォルダを開きます bda/part3/vw 次のコマンドを実行します-

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

の各引数が何であるかを分解しましょう vw call 手段。

  • -f model.vw −後で予測を行うためにモデルをmodel.vwファイルに保存していることを意味します

  • --binary −-1,1ラベルのバイナリ分類として損失を報告します

  • --passes 20 −データは重みを学習するために20回使用されます

  • -c −キャッシュファイルを作成する

  • -q ff −f名前空間で2次関数を使用する

  • --sgd −通常/古典的/単純な確率的勾配降下法の更新を使用します。つまり、非適応、非正規化、および非不変です。

  • --l1 --l2 −L1およびL2ノルムの正則化

  • --learning_rate 0.5 −更新ルール式で定義された学習率α

次のコードは、コマンドラインで回帰モデルを実行した結果を示しています。結果では、平均ログ損失とアルゴリズムパフォーマンスの小さなレポートが得られます。

-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

これで、 model.vw 新しいデータで予測を生成するようにトレーニングしました。

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

前のコマンドで生成された予測は、[0、1]の範囲に収まるように正規化されていません。これを行うために、シグモイド変換を使用します。

# 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