Big-data-analytics-online-learning

提供:Dev Guides
移動先:案内検索

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

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

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

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

次のアルゴリズムにはいくつかの実装がありますが、https://github.com/JohnLangford/vowpal_wabbit/wiki [vowpal wabbit]ライブラリに実装されているものは、最も開発されたものです。 このライブラリは、大規模な回帰モデルのトレーニングを可能にし、少量のRAMを使用します。 クリエーター自身の言葉では、「Vowpal Wabbit(VW)プロジェクトは、Microsoft Researchおよび(以前は)Yahoo!がスポンサーとなっている高速なコア外学習システムです。 研究"。

*kaggle* コンペティションのタイタニックデータセットを使用します。 元のデータは *bda/part3/vw* フォルダーにあります。 ここでは、2つのファイルがあります-
  • トレーニングデータ(train_titanic.csv)があり、
  • 新しい予測を行うためのラベルなしデータ(test_titanic.csv)。

csv形式を vowpal wabbit 入力形式に変換するには、 csv_to_vowpal_wabbit.py Pythonスクリプトを使用します。 このためには、当然pythonをインストールする必要があります。 bda/part3/vw フォルダーに移動し、ターミナルを開いて次のコマンドを実行します-

python csv_to_vowpal_wabbit.py

このセクションでは、Windowsを使用している場合、Unixコマンドラインをインストールする必要があるため、そのためのhttps://www.cygwin.com/[cygwin] Webサイトを入力してください。

端末を開き、フォルダ 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ラベルのバイナリ分類として損失を報告
  • -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[[Generate class labels
preds = ifelse(probs > 0.5, 1, 0)
head(preds)
# [1] 0 1 0 0 1 0