ビッグデータ分析-オンライン学習
オンライン学習は、教師あり学習モデルを大規模なデータセットにスケーリングできる機械学習のサブフィールドです。基本的な考え方は、モデルに合わせるためにメモリ内のすべてのデータを読み取る必要はなく、一度に各インスタンスを読み取るだけでよいということです。
この場合、ロジスティック回帰を使用してオンライン学習アルゴリズムを実装する方法を示します。ほとんどの教師あり学習アルゴリズムと同様に、最小化されたコスト関数があります。ロジスティック回帰では、コスト関数は次のように定義されます。
$$ 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