Slide 1

Slide 1 text

Java で楽して Jubatus したい ! 2013.6.2 Jubatus Casual Talks #1 KOMIYA Atsushi (@komiya_atsushi)

Slide 2

Slide 2 text

Agenda 1. 自己紹介 2. 今日お話すること 3. はじめての Java からの Jubatus 4. Java から楽して Jubatus しよう 5. まとめ

Slide 3

Slide 3 text

1. 自己紹介

Slide 4

Slide 4 text

KOMIYA Atsushi @komiya_atsushi

Slide 5

Slide 5 text

分析力をコアとする 情報最適化企業

Slide 6

Slide 6 text

で機械学習寄りなエンジニアやってます

Slide 7

Slide 7 text

#TokyoWebmining 事務局

Slide 8

Slide 8 text

#TokyoWebmining 事務局 データ分析、機械学習、 アドテクなどのお話を して下さる講師募集中!

Slide 9

Slide 9 text

#TokyoWebmining 事務局 データ分析、機械学習、 アドテクなどのお話を して下さる講師募集中! 発表タイトルを添えての @TokyoWebmining 宛の メンション、 お待ちしておりますね!

Slide 10

Slide 10 text

2. 今日 お話すること

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

Q. お仕事で Java を 使っていない方?

Slide 13

Slide 13 text

このトークは 最初から最後まで Java から Jubatus を つっつくお話に 終始しています

Slide 14

Slide 14 text

小難しい数式は 一切出てきません 機械学習の深い話も しません

Slide 15

Slide 15 text

【おことわり】 機械学習の深い話を 期待して来られた方々、 申し訳ございませんが このトークは箸休め程度に お聞き下さい…

Slide 16

Slide 16 text

今日お話すること •Java から Jubatus を利用 してみる •Jubatus Java Client に ついて思うこと •Java からの Jubatus の 利用をちょっと楽にしてみる

Slide 17

Slide 17 text

3. はじめての Java からの Jubatus

Slide 18

Slide 18 text

なぜ Java なの? •機械学習、というと Python が有力 (?) •NumPy, SciPy, scikit-learn… •でも、Java エンジニアの人口は それなりにいるよね? •かくいう弊社も、主要プロダクトは Java で書かれています

Slide 19

Slide 19 text

なぜ Java なの?

Slide 20

Slide 20 text

なぜ Java なの? Java : 約 17% Python : 約 4.3%

Slide 21

Slide 21 text

Java から Jubatus どれくらい使われているのだろうか…?

Slide 22

Slide 22 text

Java から Jubatus どれくらい使われているのだろうか…? 「Java で Jubatus 使って◯◯してみた」 系のブログエントリは皆無?

Slide 23

Slide 23 text

Java から Jubatus どれくらい使われているのだろうか…? 「Java で Jubatus 使って◯◯してみた」 系のブログエントリは皆無?

Slide 24

Slide 24 text

Java から Jubatus どれくらい使われているのだろうか…? 使われていないことには 何か理由があるのかも…

Slide 25

Slide 25 text

実際に Java から Jubatus を利用してみましょう •お題 •Twitter の Streaming API (sample) を しばいて流れ出てくるツイートの言語 (日本語 / 英語)を判別する簡単なお仕事 •jubatus-example の twitter_streaming_lang (Python 実装) を参考にさせて頂きました • http://github.com/jubatus/jubatus-example • https://github.com/jubatus/jubatus- example/tree/master/twitter_streaming_lang

Slide 26

Slide 26 text

実際に Java から Jubatus を利用してみましょう •お題 •Twitter の Streaming API (sample) を しばいて流れ出てくるツイートの言語 (日本語 / 英語)を判別する簡単なお仕事 •jubatus-example の twitter_streaming_lang (Python 実装) を参考にさせて頂きました • http://github.com/jubatus/jubatus-example • https://github.com/jubatus/jubatus- example/tree/master/twitter_streaming_lang Jubatus の多値分類機能 (Classifier) を利用します

Slide 27

Slide 27 text

【補足】 多値分類/クラス分類 •個々の「特徴」をもとに、あらかじめ 列挙されている「ラベル」を付与して いくお仕事 髪:長い 髭:なし 髪:短い 髭:あり 髪:長い 髭:なし 髪:なし 髭:なし 髪:長い 髭:なし 髪:短い 髭:あり ラベル:男性 ラベル:女性 分類器

Slide 28

Slide 28 text

Jubatus Java Client •Jubatus 開発チーム謹製の公式製品 •IDL (Interface Description Language) を元に各種言語向けのクライアントを 自動生成

Slide 29

Slide 29 text

Jubatus Java Client •Jubatus 開発チーム謹製の公式製品 •IDL (Interface Description Language) を元に各種言語向けのクライアントを 自動生成

Slide 30

Slide 30 text

Jubatus Java Client •Jubatus 開発チーム謹製の公式製品 •IDL (Interface Description Language) を元に各種言語向けのクライアントを 自動生成 main ディレクトリがないね!

Slide 31

Slide 31 text

使い方 •Maven の場合: pom.xml に以下を追記 •Maven じゃない場合: •http://download.jubat.us/maven/us/jubat/jubat us/ あたりから jar を直接ダウンロード jubat.us Jubatus Repository for Maven http://download.jubat.us/maven us.jubat jubatus x.x.x repositories 要素の中に記述する dependencies 要素の中に記述する

Slide 32

Slide 32 text

こんな感じになりました (コードは http://goo.gl/RoxX0#L56 こちら) •やるべきことは、 ClassifierClient #classify() の呼び出し •そのために List を組み立てている

Slide 33

Slide 33 text

ClassifierClient#classify() に与える List の構造 •例えば次のツイートを言語判別したい

Slide 34

Slide 34 text

ClassifierClient#classify() に与える List の構造 •例えば次のツイートを言語判別したい この文字列をまるっと 特徴として扱い、 Jubatus の多値分類器 に投げます

Slide 35

Slide 35 text

ClassifierClient#classify() に与える List の構造 •例えば次のツイートを言語判別したい この文字列をまるっと 特徴として扱い、 Jubatus の多値分類器 に投げます 「特徴」を含んだ List を構築します

Slide 36

Slide 36 text

ClassifierClient#classify() に与える List の構造 List Datum num_values: List string_values: List TupleStringString second: "湯婆婆「null というのか… first: "text"

Slide 37

Slide 37 text

こんな感じになりました (コードは http://goo.gl/RoxX0#L56 こちら) •やるべきことは、 ClassifierClient #classify() の呼び出し •そのために List を組み立てている

Slide 38

Slide 38 text

こんな感じになりました (コードは http://goo.gl/RoxX0#L56 こちら) •やるべきことは、 ClassifierClient #classify() の呼び出し •そのために List を組み立てている

Slide 39

Slide 39 text

こんな感じになりました (コードは http://goo.gl/RoxX0#L56 こちら) •やるべきことは、 ClassifierClient #classify() の呼び出し •そのために List を組み立てている

Slide 40

Slide 40 text

こんな感じになりました (コードは http://goo.gl/RoxX0#L56 こちら) •やるべきことは、 ClassifierClient #classify() の呼び出し •そのために List を組み立てている

Slide 41

Slide 41 text

こんな感じになりました (コードは http://goo.gl/RoxX0#L56 こちら) •やるべきことは、 ClassifierClient #classify() の呼び出し •そのために List を組み立てている

Slide 42

Slide 42 text

こんな感じになりました (コードは http://goo.gl/RoxX0#L56 こちら) •やるべきことは、 ClassifierClient #classify() の呼び出し •そのために List を組み立てている ここまでが List の 構築処理となる

Slide 43

Slide 43 text

こんな感じになりました (コードは http://goo.gl/RoxX0#L56 こちら) •やるべきことは、 ClassifierClient #classify() の呼び出し •そのために List を組み立てている ここでようやく Jubatus サーバに 分類処理をお願い している

Slide 44

Slide 44 text

こんな感じになりました (コードは http://goo.gl/RoxX0#L56 こちら) •やるべきことは、 ClassifierClient #classify() の呼び出し •そのために List を組み立てている Jubatus サーバから 返ってきた結果より 分類スコアが一番高い ラベルを選出する

Slide 45

Slide 45 text

Jubatus Java Client を使ってみた感想 •ちょっと辛い… •何が辛いかというと… •『#classify() に渡すオブジェクトの組み 立てが面倒だな…』(;´Д`) •『似たようなクラスがたくさんあるなあ。 どれを使えばいいんだろ…』(´・ω・`) •『ClassifierClient#classify() の戻り値 が List の List …』(;´∀`) •『あれっよく見ると TupleStringString クラスが二つあるよ…』⊂⌒~⊃。Д。)⊃

Slide 46

Slide 46 text

辛いこと:似たようなクラスがたくさんある •こんな感じ •TupleStringString •TupleStringFloat •TupleStringDouble •TupleStringDatum •どこで何を使えばいいのか、すぐには 理解できない •IDE のサジェスト機能があまり役立た ない

Slide 47

Slide 47 text

辛いこと:同じ名前のクラスがある •例:TupleStringString クラス •us.jubat.classifier •us.jubat.regression •us.jubat.anomaly •us.jubat.graph •us.jubat.recommender •間違ってパッケージが異なるクラスを使う とコンパイルエラーになる •当然、サジェスト機能は残念なことに…

Slide 48

Slide 48 text

辛いこと:同じ名前のクラスがある •例:TupleStringString クラス •us.jubat.classifier •us.jubat.regression •us.jubat.anomaly •us.jubat.graph •us.jubat.recommender •間違ってパッケージが異なるクラスを使う とコンパイルエラーになる •当然、サジェスト機能は残念なことに…

Slide 49

Slide 49 text

ほかにも… •実現したい処理に対し,コード記述量が 多くなりがちなので •特徴抽出の試行錯誤(trial and error)が しづらい •どんな処理をしているのか、ぱっとみて 把握しづらい Java で Jubatus を利用するのは 微妙かなこれは…

Slide 50

Slide 50 text

4. Java から楽して Jubatus しよう

Slide 51

Slide 51 text

Jubatus Java Client の扱いは難しいのは よくわかった

Slide 52

Slide 52 text

けどやっぱり Java で Jubatus したい!

Slide 53

Slide 53 text

どうすれば Java での Jubatus の利用を楽にすることができるか? •Jubatus Java Client のコードは自動 生成されている •IDL の更新を考えると、Jubatus Java Client そのものに手を加えるのは非現実的 •Jubatus Java Client をまるっと包み 込み、使いやすいインタフェースを 提供するラッパーライブラリを作ろう というわけで・・・

Slide 54

Slide 54 text

by xsix http://www.flickr.com/photos/xsix/5064029709/ 作りました 作っています! Jubaba “ゆばーば”

Slide 55

Slide 55 text

どんな構成? Jubaba Jubatus Java Client .java

Slide 56

Slide 56 text

どんな構成? Jubaba Jubatus Java Client .java Jubaba を利用して Java ソースコードを記述する

Slide 57

Slide 57 text

どんな構成? Jubaba Jubatus Java Client .java Jubaba を利用して Java ソースコードを記述する Jubatus Java Client を内部で呼び出す

Slide 58

Slide 58 text

どんな構成? Jubaba Jubatus Java Client .java Jubaba を利用して Java ソースコードを記述する Jubaba サーバとのやりとりは 今まで通り Jubatus Java Client が担う Jubatus Java Client を内部で呼び出す

Slide 59

Slide 59 text

どんなもの? •Jubatus Java Client よりは •コード量の記述が少なくて済む •多少オブジェクト指向な作りになっている •流れるようなインタフェース (method chaining)ぽく書ける •同名クラスは存在しない •IDE の恩恵を受けられるように

Slide 60

Slide 60 text

どう使うの? Configuration conf = new ConfigurationBuilder().host("127.0.0.1").port(9199).build(); Classifier classifier = new Classifier(conf, "name"); // 訓練データを用いて多値分類のモデルを更新する classifier.newFeatures() .label("male") .add("hair", "short") .add("bottom", "jeans") .add("height", 1.70) .train(); // 更新したモデルを使って多値分類する ClassificationResult res = classifier.newFeatures() .add("hair", "short") .add("bottom", "jeans") .add("height", 1.70) .classify(); // 多値分類結果のうち、最大のスコアとなったラベルを取得する String estimatedLabel = res.maximumScoredLabel();

Slide 61

Slide 61 text

どう使うの? Configuration conf = new ConfigurationBuilder().host("127.0.0.1").port(9199).build(); Classifier classifier = new Classifier(conf, "name"); // 訓練データを用いて多値分類のモデルを更新する classifier.newFeatures() .label("male") .add("hair", "short") .add("bottom", "jeans") .add("height", 1.70) .train(); // 更新したモデルを使って多値分類する ClassificationResult res = classifier.newFeatures() .add("hair", "short") .add("bottom", "jeans") .add("height", 1.70) .classify(); // 多値分類結果のうち、最大のスコアとなったラベルを取得する String estimatedLabel = res.maximumScoredLabel();

Slide 62

Slide 62 text

どう使うの? Configuration conf = new ConfigurationBuilder().host("127.0.0.1").port(9199).build(); Classifier classifier = new Classifier(conf, "name"); // 訓練データを用いて多値分類のモデルを更新する classifier.newFeatures() .label("male") .add("hair", "short") .add("bottom", "jeans") .add("height", 1.70) .train(); // 更新したモデルを使って多値分類する ClassificationResult res = classifier.newFeatures() .add("hair", "short") .add("bottom", "jeans") .add("height", 1.70) .classify(); // 多値分類結果のうち、最大のスコアとなったラベルを取得する String estimatedLabel = res.maximumScoredLabel();

Slide 63

Slide 63 text

どう使うの? Configuration conf = new ConfigurationBuilder().host("127.0.0.1").port(9199).build(); Classifier classifier = new Classifier(conf, "name"); // 訓練データを用いて多値分類のモデルを更新する classifier.newFeatures() .label("male") .add("hair", "short") .add("bottom", "jeans") .add("height", 1.70) .train(); // 更新したモデルを使って多値分類する ClassificationResult res = classifier.newFeatures() .add("hair", "short") .add("bottom", "jeans") .add("height", 1.70) .classify(); // 多値分類結果のうち、最大のスコアとなったラベルを取得する String estimatedLabel = res.maximumScoredLabel();

Slide 64

Slide 64 text

どう使うの? •現在は多値分類機能 (Classifier)のみ サポート •Jubatus Java Client と同様にバルク処理 できます •詳しくは GitHub の jubaba-prototypeを 参照してください •https://github.com/komiya-atsushi/jubaba- prototype •※絶賛開発中により API 構成がガラリと変わ る恐れがございます

Slide 65

Slide 65 text

先ほどのツイートの言語判別コードは…

Slide 66

Slide 66 text

先ほどのツイートの言語判別コードは…

Slide 67

Slide 67 text

先ほどのツイートの言語判別コードは… すっきりしましたね!!

Slide 68

Slide 68 text

今後やりたいこと •多値分類以外の機能のサポート •プロパティファイルからの設定読込み •JavaBeans の命名規約に従ったクラス から特徴を自動抽出 •ファイルからのデータ取り込み •例)LIBSVM format なファイル ご要望お待ちしております!

Slide 69

Slide 69 text

5. まとめ

Slide 70

Slide 70 text

まとめ •Jubatus Java Client をそのまま 使うとちょっと苦労しちゃうね… •でも工夫すれば、Java でも楽に Jubatus を利用できそうだよ! そう、Jubaba ならね。

Slide 71

Slide 71 text

ご清聴ありがとうございました! WE’RE HIRING!! エンジニア/データアナリスト募集中! 詳しくは @komiya_atsushi まで!