機械学習フレームワークJubatusを使ったアニメのレコメンデーション

岡野です。今、アメリカのシリコンバレーでインターンしてます。

オンライン機械学習向け分散処理フレームワークJubatus

最近、ビッグデータ関連で機械学習がブームですね。
私は卒論で、機械学習フレームワークのJubatus(ユバタス)を使い、その使いやすさに感動しました。
Jubatusはオンライン機械学習向け分散処理フレームワークです。
繰り返し処理に時間がかかる機械学習とデータ転送に時間がかかる分散処理を、最新研究の機械学習アルゴリズムと分散処理アルゴリズムをフル活用することによって、ある程度の精度を保ちながらオンラインで行う夢のソフトウェアだと僕は思ってます。

バッチ処理とオンライン処理

機械学習というのは一般的に、学習と出力によって行われます。例えば、
「身長180センチ、Tシャツ、ジーンズは男性」
「身長153センチ、タンクトップ、ミニスカートは女性」
というデータを機械学習に教える作業を「学習」と言います。
学習させた機械学習に、
「身長163センチ、Tシャツ、ミニスカートは男性?女性?」
と質問し、「女性」という結果を得ることを「出力」と言います。
バッチ処理では、一度に学習を行い出力させます。出力する前に、毎度全データを学習させる必要があります。
一方、オンライン機械学習というのは、出力した後でも継続的に学習も行います。出力する前に、学習する必要が無いので即座に(オンラインで)結果を得ることができます。

機械学習×分散処理×オンライン

機械学習関連のライブラリやフレームワークはたくさんありますが、オンラインで分散処理機械学習をしているのは、おそらく世界にはJubatusの他に無いでしょう。
分散処理型の機械学習といえば、有名なところでMahout/Hadoopもありますが、Mahout/Hadoopは分散処理のバッチ処理向けであり、オンライン処理を達成しません。
最近は、MLlib/Sparkなるものも登場してます。SparkはHadoopを高速化した分散処理フレームワークです。MLlibはSparkの機械学習プラグインです。Sparkも元々はバッチ処理でしたが、ストリーム処理をするためのプラグインも登場しました。これとMLibを組み合わせるとJubatusのようなオンライン機械学習フレームワークが実現しそうですが、ストリーム処理とMLlibを同時に使用できるかどうかは不明です。

アニメのレコメンデーション

そこで今回は、機械学習入門としてJubatusで簡単なプログラムを作ったので紹介したいと思 います。簡単にというと「アニメのレコメンデーション」です。

とりあえずゴールとしては、

・各部員に似た部員を数人リストアップする
・各部員がまだ見ていないアニメの中でオススメのアニメをレコメンドする

まるでTwitterの「あなたに似たユーザ」やAmazonの「おすすめの商品」みたいですね。
機械学習は現在は主にそういった場所に使われています。

さて、まず学習するための教師データが必要になります。とりあえず、アニメ好きが多いロ技研部員達に頼んで、Googleスプレッドシートに今までに見たアニメとその評価を記入してもらいました。フォーマットは(あなたの名前、アニメの名前、5段階評価)で。
実際のデータがこちらになります。
https://github.com/routerman/Recommender/blob/master/data.dat
ソースコードはこちら、
https://github.com/routerman/Recommender/blob/master/recom.cpp
即席でチャチャッと書いたので汚いです。すいません。。

レコメンデーション結果

これで、実行
結果の見方は、

部員名:
similar to: 似ている部員トップ3(類似度)
recommend 部員名: オススメのアニメトップ5(予測評価値)

ルーターマン:
similar to :Bobby(0.204344), Shiyox(0.161062), sekigon(0.108002),
recommend ルーターマン(98): ガルガンティア(2.6), まどかマギカ(2), 魔女の宅急便(1.8), 天空の城ラピュタ(1.8), コードギアス(1.8),
Bobby:
similar to :Hiroki(0.249479), ルーターマン(0.204344), sekigon(0.0243314),
recommend Bobby(89): クレヨンしんちゃん(2.75), ガルガンティア(2.25), 進撃の巨人(2.25), 攻殻機動隊(1.5), ベクシル日本鎖国(1.25),
sekigon:
similar to :Shiyox(0.45279), ルーターマン(0.108002), Hiroki(0.0873813),
recommend sekigon(98): まどかマギカ(2), 魔女の宅急便(1.8), 天空の城ラピュタ(1.8), ジョジョの奇妙な冒険(1.8), エヴァンゲリオン(1.6),
Shiyox:
similar to :sekigon(0.45279), ルーターマン(0.161062), Hiroki(0.101597),
recommend Shiyox(96): クレヨンしんちゃん(2.75), ドラえもん(2.25), 宇宙のステルヴィア(1.25), 天空の城ラピュタ(1.25), ゾイド(1.25),
Hiroki:
similar to :Bobby(0.249479), Shiyox(0.101597), sekigon(0.0873813),
recommend Hiroki(98): 進撃の巨人(2.6), ジョジョの奇妙な冒険(1.8), 攻殻機動隊(1.8), コードギアス(1.8), エヴァンゲリオン(1.6),
shima:
similar to :
recommend shima(18):
tani:
similar to :
recommend tani(1):

( taniさんとshimaさんが何も無いのは、アニメが奇跡的に全部誰とも被ってなかったからです。
よって、似ているユーザもレコメンドするアニメも無い、といった感じです。こういうこともあるんですね。)

たくさんのご協力ありがとうございました。

評価ですか、
機械学習関連の研究は評価が難しいんです。
結果を見ても、正しいかどうかわからないですし。
せめて、部員達がオススメされたアニメを気に入ってくれたら幸いです。

将来研究

次はWebアプリケーションとして実装をしたいですね。結構、もうありますが。。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中