#はじめに
機械学習をとにかく体験したい人、難解な計算式を前に機械学習をあきらめた人に朗報です。機械学習のコードをまったく書かずに、機械学習を活用したシステムが作れます。機械学習、AIという言葉を毎日のように目に、耳にする今日この頃、機械学習に挑戦した人も多いのではないでしょうか?
挑戦はしたものの、難解な数式の前に敗北した人も多いのではないでしょうか?数学の知識がなくても、機械学習を使えたら…
そんな悩みを解決するのが、Apache PredictionIOです。
本記事では、そのPredictionIOについて書いています。手軽に機械学習を体験したい人、これから機械学習を勉強する人にもおすすめです。
#PredictionIOとは?
PredictionIOはオープンソースの機械学習サーバで、使用言語はScalaです。アーキテクチャは以下になります。
画像は公式から
アーキテクチャ図からもわかる通り、Event ServerとEngine(s)で成り立っています。これらについて紹介します。
##Event Server
まず、Event Serverから紹介します。Event ServerはPredictionIOと連携させたいアプリのデータを収集する場所になります。1つのEvent Serverに複数のアプリのデータを保存することも可能です。以下のようなイメージです。
画像は公式から
データベースは以下の3つが使用可能です。
- PostgreSQL 9.1
- MySQL 5.1
- HBase 0.98.6 & Elasticsearch 1.4.0
※表記より新しいバージョンも可
###データベース作成時の注意
データベースを作る際、データベース名とパスワードはイベントサーバの設定と統一させる必要があります。
###Event Serverへデータ送信
Event Serverへのデータの送信方法については、公式に以下が用意されています。
- REST API
- PHP SDK
- Python SDK
- Ruby SDK
- Java SDK
これらのほかにもコミュニティによるSDKもあります。こちらをどうぞ
Event APIは以下が用意されています。
- accessKey:連携するアプリのアクセスキー
- event:イベント名(viewやbuy等)
- entityType:entityの名前、RDBのテーブル名
- entityTipeId:entityのid(ユニーク値)
- targetEntityType:(option)entityTypeに従属するテーブル名
- targetEntityId:(option)targetEntityTypeのid
- properties:(option)event、entityの関連情報
optionに関しては使用するEngineによります。
詳細はこちら
##Engine(s)
次に、Engine(s)について説明します。Engine(s)は主に2つの働きをします。
- Event Serverに収集したデータを学習し、予測モデル作成
- アプリからのクエリに対する予測結果の返答
###予測モデルの作成
Engine(s)はEvent Serverに収集したデータを学習し、予測モデルを作成します。以下のようなイメージです。
これまで、Engine(s)と書いている通り、Engineは1つだけでなく、複数実装することも可能です。
さて、**Engineを複数実装すると、どのようなメリットがあるのか?**と思う人もいるのではないでしょうか?複数のEngineを実装することで何ができるのかを一言で言うと、
複数の予測結果を返答させることができる!
そのまんますぎるので、具体例で説明します。
例えば、Facebookで考えてみましょう。Facebookには「おすすめの投稿」と「○○さんと知り合いですか?」という投稿と友達をレコメンドする機能があります。複数の予測結果を返してますね!
では、どうように予測結果を返しているのでしょうか?「おすすめの投稿」はユーザの閲覧履歴から予測モデルを作成し、「○○さんと知り合いですか?」はユーザの友達から予測モデルを作成していると考えられます。(実際、Facebookがどうしているのかは知りません)
要するに、複数の予測モデルを作成するときに複数のEngineを実装します。以下のようなイメージになります。
上図のEngine1とEngine2はそれぞれの学習アルゴリズムが必要とするデータ(閲覧履歴や友達等)を使用して、予測モデルを作成しています。
従って、Event ServerにはEngine(s)が予測モデルを作成するのに使うデータを送る必要があります。
####どんなデータが必要か?
アプリからEvent Serverにデータを送る際、データの形式はEngineに依存します。どんなデータの形式が必要になるかはEngineのREADMEを参照してください。PredictionIOの公式にEngineのテンプレートがあるのでそちらをどうぞ。
###予測結果の返答
予測モデルを作成したら、アプリからクエリをEngine(s)に送ります。すると、Engine(s)が作成した予測モデルとクエリから予測結果を返してくれます。以下のようなイメージです。※Engineを複数実装している場合、各Engineにクエリを送る必要があります。
予測結果はJSONで返ってきます。
#PredictionIOで何ができるか?
ここまでをまとめると、PredictionIOとは
- Event ServerとEngine(s)で構成
- アプリからEvent Serverにデータを送り、そのデータをEngine(s)に学習させ、予測モデル作成
- 予測モデルを作ったEngine(s)にクエリ投げると、予測結果を返答
というイメージができているでしょうか?
次に、PredictionIOで何ができるのか?について説明します。
PredictionIOで何ができるか?一言で言うと、
**どんなEngine(s)が使えるか?**と同じです。
使えるEngineとして以下のようなカテゴリーにテンプレートが用意されています。
- Recommenders
- Classification
- Regression
- NLP
- Clustering
- Similarity
- Other
詳細はこちら
この中から、自分が必要なEngine(s)を選択して、使用することになります。全てのテンプレートEngineがGitHubで公開されているので、使い方はそちらを参考にしてください。
##PredictionIOを使うのに必要なもの
PredictionIOを使うためには以下のものも必要になります。
- Apache Spark 1.4.0
- Java SE Development Kit 7
- Apache Hadoop 2.4.0 (option)
- 上記のDB(PostgreSQL、MySQL、HBase & Elasticsearch)のいずれか
※上記より新しいバージョンも可
##PredictionIOを使うのになくても問題ないもの
なくても問題ないものは以下です。
- 機械学習の理論、数学知識(なくても使えます)
- 機械学習のコードを書くタスク(テンプレートのEngineを使えば機械学習のコードは書きません)
PredictionIOを使うだけなら、機械学習の知識はなくても問題ありません。データさえ用意すれば使えます。
#機械学習の知識を活かしたい、学習アルゴリズムを作りたい人には
PredictionIOを使うだけなら、機械学習の知識がなくても使えると書きました。が、エンジニアたるものEngine
を使うだけでなく、作りたい、勉強した機械学習の知識を活用したいという人もいるでしょう。
そんな方は、Engineを作ってみてはいかがでしょうか?作ったEngineをテンプレートとして提出することもできます。詳細はこちら
機械学習を使えるだけでなく、提供もできる。それがPredictionIOです。
#さいごに
PredictionIOについて、いかがだったでしょうか?機械学習初心者や計算が苦手な人にも手軽に使えるところ、機械学習のエキスパートにはEngineを作って、提供できるところが良いと感じています。
PredictionIOを活用して、機械学習ライフを楽しんでみてはいかがでしょうか?
まずはレコメンドのテンプレートからPredictionIOを始めてみてはいかがでしょうか?
少しでも、興味を持っていただけたらいいねをお願いします。