Jubatus(ユバタス)とはリアルタイムなオンライン機械学習向け分散処理フレームワークです。
株式会社Preferred InfrastructureとNTTソフトウェアイノベーションセンタが共同開発した、日本発のオープンソースになります。
Jubatusのインストール
1. Jubatusサーバのインストール
先ずはJubatusをStandalone形式で試してみたいと思います。
※OSはUbuntu 14.04を利用します。
AptリポジトリにJubatusを追加します。
1$ sudo vim /etc/apt/sources.list.d/jubatus.list2deb http://download.jubat.us/apt binary/Jubatusサーバをインストールします。
1$ sudo apt-get update2$ sudo apt-get install jubatusプロファイルを読み込むように設定します。
1$ source /opt/jubatus/profile2$ sudo vim /etc/profile3source /opt/jubatus/profileコマンドを確認してみます。
1$ 2jubaanomaly jubaconv3jubarecommender_proxy4jubaanomaly_proxy jubactl jubaregression5jubaclassifier jubagraph jubaregression_proxy6jubaclassifier_proxy jubagraph_proxy jubastat7jubaclustering jubanearest_neighbor jubastat_proxy8jubaclustering_proxy jubanearest_neighbor_proxy jubavisor9jubaconfig jubarecommender2.Jubatusクライアントのインストール
次にJubatusクライアント(Python)をインストールします。
1$ wget http://peak.telecommunity.com/dist/ez_setup.py2$ sudo python ez_setup.py3$ sudo easy_install pip4$ sudo pip install jubatus3.サンプルの実行
公式サイトのチュートリアルを実行してみます。
gitを利用してチュートリアルプログラムを取得します。
1$ sudo apt-get install git2$ git clone https://github.com/jubatus/jubatus-tutorial-python.git3$ cd jubatus-tutorial-python/4$ wget http://people.csail.mit.edu/jrennie/20Newsgroups/20news-bydate.tar.gz5$ tar xvzf 20news-bydate.tar.gzJubatusサーバ設定ファイルを確認してみます。
1$ cat config.json2{3 "method": "PA",4 "converter": {5 "string_filter_types": {6 "detag": { "method": "regexp", "pattern": "<[^>]*>", "replace": "" }7 },8 "string_filter_rules": [9 { "key": "message", "type": "detag", "suffix": "-detagged" }10 ],11 "num_filter_types": {},12 "num_filter_rules": [],13 "string_types": {},14 "string_rules": [15 { "key": "message-detagged", "type": "space", "sample_weight": "bin", "global_weight": "bin"}16 ],17 "num_types": {},18 "num_rules": []19 },20 "parameter": {}21}チュートリアルプログラムも確認してみます。
1$ cat tutorial.py2#!/usr/bin/env python34# -*- coding: utf-8 -*-56import sys,json78from jubatus.classifier.client import Classifier9from jubatus.classifier.types import LabeledDatum10from jubatus.common import Datum1112def parse_args():13 from optparse import OptionParser, OptionValueError14 p = OptionParser()15 p.add_option('-s', '--server_ip', action='store',16 dest='server_ip', type='string', default='127.0.0.1')17 p.add_option('-p', '--server_port', action='store',18 dest='server_port', type='int', default='9199')19 p.add_option('-n', '--name', action='store',20 dest='name', type='string', default='tutorial')21 return p.parse_args()2223def get_most_likely(estm):24 ans = None25 prob = None26 result = {}27 result[0] = ''28 result[1] = 029 for res in estm:30 if prob == None or res.score > prob :31 ans = res.label32 prob = res.score33 result[0] = ans34 result[1] = prob35 return result3637if __name__ == '__main__':38 options, remainder = parse_args()3940 classifier = Classifier(options.server_ip,options.server_port, options.name, 10.0)4142 print classifier.get_config()43 print classifier.get_status()4445 for line in open('train.dat'):46 label, file = line[:-1].split(',')47 dat = open(file).read()48 datum = Datum({"message": dat})49 classifier.train([LabeledDatum(label, datum)])5051 print classifier.get_status()5253 print classifier.save("tutorial")5455 print classifier.load("tutorial")5657 print classifier.get_config()5859 for line in open('test.dat'):60 label, file = line[:-1].split(',')61 dat = open(file).read()62 datum = Datum({"message": dat})63 ans = classifier.classify([datum])64 if ans != None:65 estm = get_most_likely(ans[0])66 if (label == estm[0]):67 result = "OK"68 else:69 result = "NG"70 print result + "," + label + ", " + estm[0] + ", " + str(estm[1])実際に実行して試してみます。
デフォルトでは9199が利用されます。
1$ 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:91992 pid : 163563 user : ubuntu4 mode : standalone mode5 timeout : 106 thread : 27 datadir : /tmp8 logdir :9 loglevel : INFO(0)10 zookeeper :11 name :12 interval sec : 1613 interval count : 51214 zookeeper timeout : 1015 interconnect timeout : 101617I0507 08:18:19.177983 16356 server_util.cpp:97] load config from local file: /home/ubuntu/jubatus-tutorial-python/config.json18I0507 08:18:19.179244 16356 classifier_serv.cpp:116] config loaded: {19 "method": "PA",20 "converter": {21 "string_filter_types": {22 "detag": { "method": "regexp", "pattern": "<[^>]*>", "replace": "" }23 },24 "string_filter_rules": [25 { "key": "message", "type": "detag", "suffix": "-detagged" }26 ],27 "num_filter_types": {},28 "num_filter_rules": [],29 "string_types": {},30 "string_rules": [31 { "key": "message-detagged", "type": "space", "sample_weight": "bin", "global_weight": "bin"}32 ],33 "num_types": {},34 "num_rules": []35 },36 "parameter": {}37}38I0507 08:18:19.182173 16356 server_helper.hpp:226] start listening at port 919939I0507 08:18:19.182538 16356 server_helper.hpp:233] jubaclassifier RPC server startupJubatusサーバが起動している状態でチュートリアルプログラムを実行します。
1$ python tutorial.py下記のように分類がされていれば成功です。
1NG,sci.space, sci.electronics, 0.4495415389542NG,sci.med, soc.religion.christian, 0.6472871303563OK,misc.forsale, misc.forsale, 0.9796500802044OK,sci.electronics, sci.electronics, 0.768656909466いかがでしたでしょうか?
次回もお楽しみに!!!