ローリングコンバットピッチなう!

AIとか仮想化とかペーパークラフトとか

Jubatusで分類器のチュートリアルを実行中

[technology]Jubatusで学習結果を保存する

Jubatusのclassifierのチュートリアルを動かしてみました。
普通にコピペしてサーバーIPだけ書き換えて動かすだけで問題無く動きました。

将軍の下の名前から徳川、足利、北条を当てるってという問題設定自体がなかなか面白いなと思いつつ、これ学習結果はどうやって保存するの?と疑問が。

普通にTIP&FAQSのところに書いてありました。

学習モデルのバックアップとリカバリ — Jubatus

で、一応将軍の名前の分類のサンプルで実験。
まずJubatusはデータ保存先のディレクトリ名の指定付で起動します。

$ docker run --expose 9199 -v $PWD:/tmp/config jubatus/jubatus jubaclassifier -f /tmp/config/shogun_perc.json -d /tmp/config

で、サンプルスクリプト
Classifier チュートリアル (Python) — Jubatus
に1行client.save()を追加します。
mainの部分だけ抜粋します。

if __name__ == '__main__':
    # connect to the jubatus
    client = jubatus.Classifier(host, port, name)
    # run example
    train(client)
    predict(client)
    client.save('shogun') # 学習データ保存

これでサンプルスクリプトを実行すると、<サーバーIP>_<ポート番号>_classifier_shogun.jubatusというファイルに学習結果が保存されます。
これをロードする場合は、以下の様にtrainの代わりにclient.load()で前回保存したデータを読み込み、その後、推論が実行できます。

if __name__ == '__main__':
    # connect to the jubatus
    client = jubatus.Classifier(host, port, name)
    # load saved learn data
    client.load('shogun') # 学習データ読み込み
    # run example
#    train(client)
    predict(client)

ところでチュートリアルでは分類器のメソッドがAROWになっていますが、設定jsonを下記の様にしてperceptronにしてもちゃんと分類出来ました。

{
    "method": "perceptron",
    "converter": {
      "num_filter_types": {},
      "num_filter_rules": [],
      "string_filter_types": {},
      "string_filter_rules": [],
      "num_types": {},
      "num_rules": [],
      "string_types": {
        "unigram": { "method": "ngram", "char_num": "1" }
      },
      "string_rules": [
        { "key": "*", "type": "unigram", "sample_weight": "bin", "global_weight": "bin" }
      ]
    },
    "parameter": {
    }
  }

アルゴリズムの内容は下記に説明されています。
アルゴリズム — Jubatus

統計論とか理解できていないので良く判らない感じです。
自分はqiitaの以下の記事とか読んで知識補完中です。
で、これ見るととりあえず線形分類はARROWかNHEAD使っておけという感じなんでしょうかね?
(ニューラルネットワークの学習最適化でとりあえずADAMでってのに似てるかな?...と理屈は良く判らないままベストプラクティスを見つけようとするのは悪いクセだな...)

qiita.com
qiita.com