OSS編~Jubatusを試してみる①~

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                  jubarecommender

2.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 jubatus

3.サンプルの実行

公式サイトのチュートリアルを実行してみます。

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.gz

Jubatusサーバ設定ファイルを確認してみます。

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 startup

Jubatusサーバが起動している状態でチュートリアルプログラムを実行します。

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

いかがでしたでしょうか?

次回もお楽しみに!!!

この記事を書いた人

aws-recipe-user