Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Java で楽して Jubatus したい!

Java で楽して Jubatus したい!

Jubatus Casual Talks #1 ( http://partake.in/events/8cfd254f-ef11-463e-8bc1-a01e9d25edb3 ) での発表「Java で楽して Jubatus したい!」の資料です。

E77287648aff5484ac7659748e45c936?s=128

KOMIYA Atsushi

June 02, 2013
Tweet

Transcript

  1. Java で楽して Jubatus したい ! 2013.6.2 Jubatus Casual Talks #1

    KOMIYA Atsushi (@komiya_atsushi)
  2. Agenda 1. 自己紹介 2. 今日お話すること 3. はじめての Java からの Jubatus

    4. Java から楽して Jubatus しよう 5. まとめ
  3. 1. 自己紹介

  4. KOMIYA Atsushi @komiya_atsushi

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

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

  7. #TokyoWebmining 事務局

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

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

  10. 2. 今日 お話すること

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

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

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

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

  16. 今日お話すること •Java から Jubatus を利用 してみる •Jubatus Java Client に

    ついて思うこと •Java からの Jubatus の 利用をちょっと楽にしてみる
  17. 3. はじめての Java からの Jubatus

  18. なぜ Java なの? •機械学習、というと Python が有力 (?) •NumPy, SciPy, scikit-learn…

    •でも、Java エンジニアの人口は それなりにいるよね? •かくいう弊社も、主要プロダクトは Java で書かれています
  19. なぜ Java なの?

  20. なぜ Java なの? Java : 約 17% Python : 約

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

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

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

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

  25. 実際に 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
  26. 実際に 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) を利用します
  27. 【補足】 多値分類/クラス分類 •個々の「特徴」をもとに、あらかじめ 列挙されている「ラベル」を付与して いくお仕事 髪:長い 髭:なし 髪:短い 髭:あり 髪:長い

    髭:なし 髪:なし 髭:なし 髪:長い 髭:なし 髪:短い 髭:あり ラベル:男性 ラベル:女性 分類器
  28. Jubatus Java Client •Jubatus 開発チーム謹製の公式製品 •IDL (Interface Description Language) を元に各種言語向けのクライアントを

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

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

    自動生成 main ディレクトリがないね!
  31. 使い方 •Maven の場合: pom.xml に以下を追記 •Maven じゃない場合: •http://download.jubat.us/maven/us/jubat/jubat us/ あたりから

    jar を直接ダウンロード <repositories> <repository> <id>jubat.us</id> <name>Jubatus Repository for Maven</name> <url>http://download.jubat.us/maven</url> </repository> </repositories> <dependencies> <dependency> <groupId>us.jubat</groupId> <artifactId>jubatus</artifactId> <version>x.x.x</version> </dependency> </dependencies> repositories 要素の中に記述する dependencies 要素の中に記述する
  32. こんな感じになりました (コードは http://goo.gl/RoxX0#L56 こちら) •やるべきことは、 ClassifierClient #classify() の呼び出し •そのために List<Datum>

    を組み立てている
  33. ClassifierClient#classify() に与える List<Datum> の構造 •例えば次のツイートを言語判別したい

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

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

    「特徴」を含んだ List<Datum> を構築します
  36. ClassifierClient#classify() に与える List<Datum> の構造 List<Datum> Datum num_values: List<TupleStringDouble> string_values: List<TupleStringString>

    TupleStringString second: "湯婆婆「null というのか… first: "text"
  37. こんな感じになりました (コードは http://goo.gl/RoxX0#L56 こちら) •やるべきことは、 ClassifierClient #classify() の呼び出し •そのために List<Datum>

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

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

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

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

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

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

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

    を組み立てている Jubatus サーバから 返ってきた結果より 分類スコアが一番高い ラベルを選出する
  45. Jubatus Java Client を使ってみた感想 •ちょっと辛い… •何が辛いかというと… •『#classify() に渡すオブジェクトの組み 立てが面倒だな…』(;´Д`) •『似たようなクラスがたくさんあるなあ。

    どれを使えばいいんだろ…』(´・ω・`) •『ClassifierClient#classify() の戻り値 が List の List …』(;´∀`) •『あれっよく見ると TupleStringString クラスが二つあるよ…』⊂⌒~⊃。Д。)⊃
  46. 辛いこと:似たようなクラスがたくさんある •こんな感じ •TupleStringString •TupleStringFloat •TupleStringDouble •TupleStringDatum •どこで何を使えばいいのか、すぐには 理解できない •IDE のサジェスト機能があまり役立た

    ない
  47. 辛いこと:同じ名前のクラスがある •例:TupleStringString クラス •us.jubat.classifier •us.jubat.regression •us.jubat.anomaly •us.jubat.graph •us.jubat.recommender •間違ってパッケージが異なるクラスを使う とコンパイルエラーになる

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

    •当然、サジェスト機能は残念なことに…
  49. ほかにも… •実現したい処理に対し,コード記述量が 多くなりがちなので •特徴抽出の試行錯誤(trial and error)が しづらい •どんな処理をしているのか、ぱっとみて 把握しづらい Java

    で Jubatus を利用するのは 微妙かなこれは…
  50. 4. Java から楽して Jubatus しよう

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

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

  53. どうすれば Java での Jubatus の利用を楽にすることができるか? •Jubatus Java Client のコードは自動 生成されている

    •IDL の更新を考えると、Jubatus Java Client そのものに手を加えるのは非現実的 •Jubatus Java Client をまるっと包み 込み、使いやすいインタフェースを 提供するラッパーライブラリを作ろう というわけで・・・
  54. by xsix http://www.flickr.com/photos/xsix/5064029709/ 作りました 作っています! Jubaba “ゆばーば”

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

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

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

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

    Jubaba サーバとのやりとりは 今まで通り Jubatus Java Client が担う Jubatus Java Client を内部で呼び出す
  59. どんなもの? •Jubatus Java Client よりは •コード量の記述が少なくて済む •多少オブジェクト指向な作りになっている •流れるようなインタフェース (method chaining)ぽく書ける

    •同名クラスは存在しない •IDE の恩恵を受けられるように
  60. どう使うの? 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();
  61. どう使うの? 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();
  62. どう使うの? 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();
  63. どう使うの? 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();
  64. どう使うの? •現在は多値分類機能 (Classifier)のみ サポート •Jubatus Java Client と同様にバルク処理 できます •詳しくは

    GitHub の jubaba-prototypeを 参照してください •https://github.com/komiya-atsushi/jubaba- prototype •※絶賛開発中により API 構成がガラリと変わ る恐れがございます
  65. 先ほどのツイートの言語判別コードは…

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

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

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

    ご要望お待ちしております!
  69. 5. まとめ

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

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