こんにちは! JQです。
前回は『OSS編~Vagrantを試してみる~』と題して、仮想の開発環境自動化作成ツールであるVagrantを試してみました。
今回は『OSS編~Jubatusを試してみる①~』と題して、オンライン機械学習向けの分散処理フレームワークのJubatusを試してみたいと思います。
Jubatusとは
Jubatus(ユバタス)とはリアルタイムなオンライン機械学習向け分散処理フレームワークです。
株式会社Preferred InfrastructureとNTTソフトウェアイノベーションセンタが共同開発した、日本発のオープンソースになります。
Jubatusのインストール
1. Jubatusサーバのインストール
先ずはJubatusをStandalone形式で試してみたいと思います。
※OSはUbuntu 14.04を利用します。
AptリポジトリにJubatusを追加します。
1 2 |
$ sudo vim /etc/apt/sources.list.d/jubatus.list deb http://download.jubat.us/apt binary/ |
Jubatusサーバをインストールします。
1 2 |
$ sudo apt-get update $ sudo apt-get install jubatus |
プロファイルを読み込むように設定します。
1 2 3 |
$ source /opt/jubatus/profile $ sudo vim /etc/profile source /opt/jubatus/profile |
コマンドを確認してみます。
1 2 3 4 5 6 7 8 9 |
$ jubaanomaly jubaconv jubarecommender_proxy jubaanomaly_proxy jubactl jubaregression jubaclassifier jubagraph jubaregression_proxy jubaclassifier_proxy jubagraph_proxy jubastat jubaclustering jubanearest_neighbor jubastat_proxy jubaclustering_proxy jubanearest_neighbor_proxy jubavisor jubaconfig jubarecommender |
2.Jubatusクライアントのインストール
次にJubatusクライアント(Python)をインストールします。
1 2 3 4 |
$ wget http://peak.telecommunity.com/dist/ez_setup.py $ sudo python ez_setup.py $ sudo easy_install pip $ sudo pip install jubatus |
3.サンプルの実行
公式サイトのチュートリアルを実行してみます。
gitを利用してチュートリアルプログラムを取得します。
1 2 3 4 5 |
$ sudo apt-get install git $ git clone https://github.com/jubatus/jubatus-tutorial-python.git $ cd jubatus-tutorial-python/ $ wget http://people.csail.mit.edu/jrennie/20Newsgroups/20news-bydate.tar.gz $ tar xvzf 20news-bydate.tar.gz |
Jubatusサーバ設定ファイルを確認してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
$ cat config.json { "method": "PA", "converter": { "string_filter_types": { "detag": { "method": "regexp", "pattern": "<[^>]*>", "replace": "" } }, "string_filter_rules": [ { "key": "message", "type": "detag", "suffix": "-detagged" } ], "num_filter_types": {}, "num_filter_rules": [], "string_types": {}, "string_rules": [ { "key": "message-detagged", "type": "space", "sample_weight": "bin", "global_weight": "bin"} ], "num_types": {}, "num_rules": [] }, "parameter": {} } |
チュートリアルプログラムも確認してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
$ cat tutorial.py #!/usr/bin/env python # -*- coding: utf-8 -*- import sys,json from jubatus.classifier.client import Classifier from jubatus.classifier.types import LabeledDatum from jubatus.common import Datum def parse_args(): from optparse import OptionParser, OptionValueError p = OptionParser() p.add_option('-s', '--server_ip', action='store', dest='server_ip', type='string', default='127.0.0.1') p.add_option('-p', '--server_port', action='store', dest='server_port', type='int', default='9199') p.add_option('-n', '--name', action='store', dest='name', type='string', default='tutorial') return p.parse_args() def get_most_likely(estm): ans = None prob = None result = {} result[0] = '' result[1] = 0 for res in estm: if prob == None or res.score > prob : ans = res.label prob = res.score result[0] = ans result[1] = prob return result if __name__ == '__main__': options, remainder = parse_args() classifier = Classifier(options.server_ip,options.server_port, options.name, 10.0) print classifier.get_config() print classifier.get_status() for line in open('train.dat'): label, file = line[:-1].split(',') dat = open(file).read() datum = Datum({"message": dat}) classifier.train([LabeledDatum(label, datum)]) print classifier.get_status() print classifier.save("tutorial") print classifier.load("tutorial") print classifier.get_config() for line in open('test.dat'): label, file = line[:-1].split(',') dat = open(file).read() datum = Datum({"message": dat}) ans = classifier.classify([datum]) if ans != None: estm = get_most_likely(ans[0]) if (label == estm[0]): result = "OK" else: result = "NG" print result + "," + label + ", " + estm[0] + ", " + str(estm[1]) |
実際に実行して試してみます。
デフォルトでは9199が利用されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
$ jubaclassifier --configpath config.json I0507 08:18:19.175415 16356 server_util.cpp:335] starting jubaclassifier 0.5.4 RPC server at 10.185.253.26:9199 pid : 16356 user : ubuntu mode : standalone mode timeout : 10 thread : 2 datadir : /tmp logdir : loglevel : INFO(0) zookeeper : name : interval sec : 16 interval count : 512 zookeeper timeout : 10 interconnect timeout : 10 I0507 08:18:19.177983 16356 server_util.cpp:97] load config from local file: /home/ubuntu/jubatus-tutorial-python/config.json I0507 08:18:19.179244 16356 classifier_serv.cpp:116] config loaded: { "method": "PA", "converter": { "string_filter_types": { "detag": { "method": "regexp", "pattern": "<[^>]*>", "replace": "" } }, "string_filter_rules": [ { "key": "message", "type": "detag", "suffix": "-detagged" } ], "num_filter_types": {}, "num_filter_rules": [], "string_types": {}, "string_rules": [ { "key": "message-detagged", "type": "space", "sample_weight": "bin", "global_weight": "bin"} ], "num_types": {}, "num_rules": [] }, "parameter": {} } I0507 08:18:19.182173 16356 server_helper.hpp:226] start listening at port 9199 I0507 08:18:19.182538 16356 server_helper.hpp:233] jubaclassifier RPC server startup |
Jubatusサーバが起動している状態でチュートリアルプログラムを実行します。
1 |
$ python tutorial.py |
下記のように分類がされていれば成功です。
1 2 3 4 |
NG,sci.space, sci.electronics, 0.449541538954 NG,sci.med, soc.religion.christian, 0.647287130356 OK,misc.forsale, misc.forsale, 0.979650080204 OK,sci.electronics, sci.electronics, 0.768656909466 |
いかがでしたでしょうか?
次回もお楽しみに!!!