jubashを使ってお手軽に機械学習してみる

[Jubatus Advent Calendar 2016](http://qiita.com/advent-calendar/2016/jubatus)の7日目です。
この記事では、Jubatusをプログラミング不要で使うことができるツール **jubash** を紹介します。

# jubashとは

jubashは[Jubakit](https://github.com/jubatus/jubakit)に同梱されているツールの1つです。
その名の通り、Jubatusを呼び出すためのシェルプログラムとして動作します。

jubashを使うと、Jubatusの提供するすべての機械学習APIをコマンドラインから対話的に呼び出すことができます。Jubatusで機械学習を行う場合、通常であれば[JubatusクライアントAPI](http://jubat.us/ja/api/)を使用したプログラムを作成する必要がありますが、jubashを使えば学習/分析処理をコマンドラインで対話的に行うことができるため、コーディング不要でJubatusを使うことができます。 [^1]

[^1]: 実環境で利用するアプリケーションを開発する場合は、クライアントAPIの利用を推奨します。

# インストール

``jubakit`` パッケージをインストールすると、自動的に ``jubash`` コマンドが使えるようになります。

```sh
$ pip install jubakit
$ which jubash
/Users/kenichi/.pyenv/shims/jubash
```

# さっそく使ってみる

まずは、Jubatusサーバを起動します。ここでは分類エンジンを使用します。 [^2]

```
$ jubaclassifier -f /opt/jubatus/share/jubatus/example/config/classifier/default.json &
2016-12-06 20:03:06,066 7697 INFO  [server_util.cpp:429] starting jubaclassifier 1.0.0 RPC server at 192.168.122.211:9199
...
```

[^2]: 起動時に指定する設定ファイルの場所はインストール方法により異なります。Ubuntuであれば ``/opt/jubatus/share/jubatus/example/config``, RHEL/CentOS であれば ``/usr/share/jubatus/example/config``, Homebrewであれば ``/usr/local/share/jubatus/example/config``, ソースから入れた場合は ``~/local/share/jubatus/example/config`` です。

続けて、jubashを起動します。

```sh
$ jubash
[Jubatus:classifier<>@127.0.0.1:9199] # 
```

このようにシェルプロンプトが表示されれば成功です。 [^3]
jubashは、何もオプションを付けずに実行すると ``127.0.0.1:9199`` に接続します。

[^3]: シェルプロンプトは ``[Jubatus:エンジン名<クラスタ名>@IPアドレス:ポート番号] # `` の形式です。スタンドアロンモードの場合はクラスタ名は空文字列です。

では、実際にデータを学習させてみましょう。
ここでは、「身長と服から性別を分類する」モデルを作ってみたいと思います。

jubashのシェルプロンプトに、API名とそのパラメタを、コマンドとその引数のイメージで指定します。(コピペしやすいようにシェルプロンプトを省略しています)

```sh
train male height 1.80 bottom jeans
```

これで1件のデータが学習されました。
この行は、「身長(height)が1.8メートルで服(bottom)がジーンズの人は男性(male)だよ、とJubatusに教える(train)」という意味です。
このようにスペース区切りでkey-valueの組を指定することで、様々なデータを使用して学習することができます。

さらに学習データを増やしてみましょう。

```sh
train male   height 1.80 bottom jeans
train female height 1.56 bottom skirt
train male   height 1.65 bottom chino
train female height 1.72 bottom jeans
train male   height 1.82 bottom jeans
train female height 1.43 bottom skirt
train male   height 1.76 bottom jeans
train female height 1.52 bottom skirt
```

ある程度データを学習したら、モデルを使って分類を行ってみましょう。
分類には ``classify`` というAPIを使います。

```sh
[Jubatus:classifier<>@127.0.0.1:9199] # classify height 1.92 bottom chino
male: 1.36218726635
female: -0.726596474648
```

分析結果が表示されました。
maleのスコアがfemaleより高いので、身長1.92メートルで服がチノパンの人は男性の可能性が高いようです。
いろいろなデータで試してみてください。

```sh
[Jubatus:classifier<>@127.0.0.1:9199] # classify height 1.92 bottom skirt
female: 0.747189581394
male: -0.111598797143

[Jubatus:classifier<>@127.0.0.1:9199] # classify height 1.92 bottom jeans
male: 0.803386986256
female: -0.167796239257
```

Jubatusの提供する機械学習アルゴリズムは全てオンライン機械学習なので、 ``train`` と ``classify`` を好きな順番で呼び出すことができます。

# その他のコマンド

``help`` コマンドで、jubashで利用可能なコマンドのリストが確認できます。 [^4]
また、 ``help train`` のようにAPI名を指定すると、さらに詳細な使い方を見ることができます。 [^5]

```
[Jubatus:classifier<>@127.0.0.1:9199] # help

Commands:
=========
classify      do_mix      get_proxy_status  load       timeout
clear         exit        get_status        reconnect  train  
connect       get_config  help              save       verbose
delete_label  get_labels  keepalive         set_label
```

```
[Jubatus:classifier<>@127.0.0.1:9199] help train
Syntax: train label datum_key datum_value [datum_key datum_value ...]
    Trains the model with given label and datum.
    Bulk training is not supported on the command line.
```

[^4]: シェルプロンプトではTab補完も使えます。
[^5]: 利用するエンジンによって利用可能なAPI(コマンド)は変わります。

# まとめ

jubashを使うと、スペース区切りのkey-valueデータを用意するだけでプログラミングなしで機械学習を試してみることができます。まずは手元にあるデータを気軽に分析してみてはいかがでしょうか。
jubashの詳しい使い方は [Jubakitのドキュメント](http://jubat.us/ja/jubakit/architecture/shell.html) や [コマンドラインリファレンス](http://jubat.us/ja/jubakit/guide/jubash.html) をご覧ください。

明日は @TkrUdagawa さんがJubatusの多腕バンディット機能について解説してくれます。お楽しみに！