レコメンドエンジンやスパム判定、音声や文字認識などは機械学習と呼ばれる技術が使われています。大量のデータをベースに新しいデータがなんであるかを判断します。ビッグデータの時代になり、特に注目されている技術になります。

PredictionIOはそのエンジンの一つで、オープンソース・ソフトウェアとして公開されています。Python、PHP、Ruby、Java向けにSDKが公開されているので、様々なサービスから利用できるでしょう。

今回はそのPredictionIOをレビューしたいと思います。インストールも試用もDockerを使って簡単にできますのでぜひチャレンジしてみてください。

必要なもの

  • Ubuntu 14.04 LTS(CoreOS、CentOSでも大丈夫です)
  • Docker
  • オプション:さくらのクラウドのアカウント

PredictionIOのインストール

インストールはDockerさえ入っていれば簡単にできます。

$ git clone https://github.com/mingfang/docker-predictionio.git
$ cd docker-predictionio
$ sudo ./build

ビルドはDockerコンテナのイメージダウンロードやセットアップがあるので時間がかかります。終わったらそのままDockerイメージを立ち上げます。

$ sudo ./shell
root@4a75279b3192:/# 

これでPredictionIOのサーバに接続しました。

PredictionIOの起動

次にPredictionIOを起動します。

# runsvdir-start &

これでしばらく待つとPredictionIOが起動します。問題なければ管理画面のダッシュボードにアクセスできます。http://サーバのアドレス:9000/ にアクセスします。

ダッシュボードの画面
ダッシュボードの画面

続いてレコメンデーションエンジンの単位になるアプリケーションを準備します。

# cd docker/quickstartapp
# pio template get PredictionIO/template-scala-parallel-ecommercerecommendation MyRecommendation
# cd MyRecommendation
# pio app new MyApp2
[INFO] [HBLEvents] The table pio_event:events_2 doesn't exist yet. Creating now...
[INFO] [App$] Initialized Event Store for this app ID: 2.
[INFO] [App$] Created new app:
[INFO] [App$]       Name: MyApp2
[INFO] [App$]         ID: 2
[INFO] [App$] Access Key: vSKHZIWimnRBC5UODnIZMsdxfr9Xl99yRMNI63fSogvecQoWYAoNxEU5KWSwVLsf
# curl https://raw.githubusercontent.com/apache/spark/master/data/mllib/sample_movielens_data.txt --create-dirs -o data/sample_movielens_data.txt
python data/import_eventserver.py --access_key vSKHZIWimnRBC5UODnIZMsdxfr9Xl99yRMNI63fSogvecQoWYAoNxEU5KWSwVLsf
Namespace(access_key='vSKHZIWimnRBC5UODnIZMsdxfr9Xl99yRMNI63fSogvecQoWYAoNxEU5KWSwVLsf', url='http://localhost:7070')
{u'status': u'alive'}
Importing data...
Set user u1
Set user u2
  :
User u10 views item i40
User u10 buys item i40
204 events are imported.
# pio build
[INFO] [Console$] Using existing engine manifest JSON at /docker/quickstartapp/MyRecommendation/manifest.json
  :
# pio train
# pio deploy --ip 0.0.0.0"

ここでも長い処理が実行されますが、Javaがメモリを食うので他のコンテナを立ち上げたりしていてメモリの余裕がないと失敗します。メモリが2GBあるUbuntuで他に特にサービスが立ち上がっていなければ問題ありませんが、もしメモリエラーが起きた場合はホスト側のプロセスを確認してください。

まだ、上記ログのKEYで表示されている文字列(ここではvSKHZIWimnRBC5UODnIZMsdxfr9Xl99yRMNI63fSogvecQoWYAoNxEU5KWSwVLsf)はアクセスキーになります。プログラミングから利用しますのでメモしておきましょう。

問題なく完了したらアプリケーションをデプロイします。

# cd MyRecommendation && pio deploy --ip 0.0.0.0 &

無事立ち上がると http://サーバのアドレス:8000/ にてPredictionIOエンジンの画面が表示できます。

PredictionIOサーバの画面
PredictionIOサーバの画面

テストデータのインポート

まずテストデータをインポートします。先ほどのアクセスキーを使います。

# curl https://raw.githubusercontent.com/apache/spark/master/data/mllib/sample_movielens_data.txt --create-dirs -o data/sample_movielens_data.txt
# python data/import_eventserver.py --access_key (アクセスキー)
Importing data...
1501 events are imported.

この処理によってユーザがアイテムを購入したというイベントが生成されます。同様の処理は次のようにプログラムから書くこともできます。以下はRubyの例です(gem install predictionioを実行してください)。

require "predictionio"
require "net/http"
require "json"
access_key = "アクセスキー"
client = PredictionIO::EventClient.new(access_key, URI.parse("http://localhost:7070/"))

client.create_event(
  'rate',
  'user',
  1, {
    'targetEntityType' => 'item',
    'targetEntityId' => 5,
    'properties' => { 'rating' => 4.0 }
  }
)

データを取り出す際には以下のように書きます。

require "predictionio"
require "net/http"
require "json"
client = PredictionIO::EngineClient.new(URI.parse("http://localhost:8000/"))

response = client.send_query('user' => 1, 'num' => 4)
=> {"productScores"=>[{"product"=>90, "score"=>8.459938376658831}, {"product"=>55, "score"=>7.617306635837063}, {"product"=>59, "score"=>7.543946275321666}, {"product"=>66, "score"=>7.19562319905969}]}

このようにしてユーザ1に対するお勧め商品を4つ得ることができます。見ての通り、レコメンドを取り出す際にはアクセスキーを使いません。そのためJavaScriptでWebベースで取得することもできます。

curl -H "Content-Type: application/json" -d '{ "user": 1, "num": 4 }' http://localhost:8000/queries.json
{"productScores":[{"product":90,"score":8.459938376658831},{"product":55,"score":7.617306635837063},{"product":59,"score":7.543946275321666},{"product":66,"score":7.19562319905969}]}

既存のWebサービスに対して新しくレコメンドエンジンを追加したいという時にも、PredictionIOであればRESTfulなWeb APIを使って簡単にデータ投入ができます。サーバもDockerで立てれば既存の環境を変更することなくはじめることができます。お手軽に機械学習を使ってみたい方はぜひこの方法をお試しください。

PredictionIO Open Source Machine Learning Server