数学の知識がなくてもできる機械学習

#はじめに
機械学習をとにかく体験したい人、難解な計算式を前に機械学習をあきらめた人に朗報です。機械学習のコードをまったく書かずに、機械学習を活用したシステムが作れます。機械学習、AIという言葉を毎日のように目に、耳にする今日この頃、機械学習に挑戦した人も多いのではないでしょうか？

挑戦はしたものの、難解な数式の前に敗北した人も多いのではないでしょうか？数学の知識がなくても、機械学習を使えたら…
そんな悩みを解決するのが、Apache PredictionIOです。

本記事では、そのPredictionIOについて書いています。手軽に機械学習を体験したい人、これから機械学習を勉強する人にもおすすめです。

#PredictionIOとは？
PredictionIOはオープンソースの機械学習サーバで、使用言語はScalaです。アーキテクチャは以下になります。

![PredictionIO_architecture.png](https://qiita-image-store.s3.amazonaws.com/0/148136/1fb43c81-1d38-d696-022d-cb2092f3193e.png)画像は[公式](http://predictionio.incubator.apache.org/start/)から

アーキテクチャ図からもわかる通り、Event ServerとEngine(s)で成り立っています。これらについて紹介します。
##Event Server
まず、Event Serverから紹介します。Event ServerはPredictionIOと連携させたいアプリのデータを収集する場所になります。1つのEvent Serverに複数のアプリのデータを保存することも可能です。以下のようなイメージです。
![predictionIO_EventServer_image.png](https://qiita-image-store.s3.amazonaws.com/0/148136/8e4a39cc-8998-fe96-1ae0-f44b7d7dde3f.png)
画像は[公式](http://predictionio.incubator.apache.org/datacollection/)から

データベースは以下の３つが使用可能です。

* PostgreSQL 9.1
* MySQL 5.1
* HBase 0.98.6 & Elasticsearch 1.4.0

※表記より新しいバージョンも可

###データベース作成時の注意
データベースを作る際、<font color="Red">**データベース名**</font>と<font color="Red">**パスワード**</font>はイベントサーバの設定と統一させる必要があります。

###Event Serverへデータ送信
Event Serverへのデータの送信方法については、公式に以下が用意されています。

* REST API
* PHP SDK
* Python SDK
* Ruby SDK
* Java SDK

これらのほかにもコミュニティによるSDKもあります。[こちら](http://predictionio.incubator.apache.org/sdk/community/)をどうぞ

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によります。

詳細は[こちら](http://predictionio.incubator.apache.org/datacollection/eventapi/)

##Engine(s)
次に、Engine(s)について説明します。Engine(s)は主に2つの働きをします。

* Event Serverに収集したデータを学習し、予測モデル作成
* アプリからのクエリに対する予測結果の返答

###予測モデルの作成
Engine(s)はEvent Serverに収集したデータを学習し、予測モデルを作成します。以下のようなイメージです。

![PredictionIO_Engines.png](https://qiita-image-store.s3.amazonaws.com/0/148136/bf4794f7-5733-e58c-5ff9-4d5b81f61b6c.png)
これまで、Engine(s)と書いている通り、Engineは1つだけでなく、複数実装することも可能です。

さて、**Engineを複数実装すると、どのようなメリットがあるのか？**と思う人もいるのではないでしょうか？複数のEngineを実装することで何ができるのかを一言で言うと、

<font color="Blue">**複数の予測結果を返答させることができる！**</font>

そのまんますぎるので、具体例で説明します。
例えば、Facebookで考えてみましょう。Facebookには「おすすめの投稿」と「○○さんと知り合いですか？」という**投稿**と**友達**をレコメンドする機能があります。複数の予測結果を返してますね！

では、どうように予測結果を返しているのでしょうか？「おすすめの投稿」はユーザの閲覧履歴から予測モデルを作成し、「○○さんと知り合いですか？」はユーザの友達から予測モデルを作成していると考えられます。（実際、Facebookがどうしているのかは知りません）

要するに、<font color="Blue">**複数の予測モデルを作成する**</font>ときに複数のEngineを実装します。以下のようなイメージになります。
![PredictionIO_multi_engines.png](https://qiita-image-store.s3.amazonaws.com/0/148136/0fa058f4-08d8-84a1-9419-a2bc6602cebd.png)

上図のEngine1とEngine2はそれぞれの<font color="Red">**学習アルゴリズムが必要とするデータ**</font>（閲覧履歴や友達等）を使用して、予測モデルを作成しています。

従って、**Event ServerにはEngine(s)が予測モデルを作成するのに使うデータ**を送る必要があります。

####どんなデータが必要か？
アプリからEvent Serverにデータを送る際、データの形式はEngineに依存します。どんなデータの形式が必要になるかはEngineのREADMEを参照してください。PredictionIOの公式にEngineのテンプレートがあるので[そちら](http://predictionio.incubator.apache.org/gallery/template-gallery/)をどうぞ。

###予測結果の返答
予測モデルを作成したら、アプリからクエリをEngine(s)に送ります。すると、Engine(s)が作成した予測モデルとクエリから予測結果を返してくれます。以下のようなイメージです。※Engineを複数実装している場合、各Engineにクエリを送る必要があります。

![PredictionIO_query.png](https://qiita-image-store.s3.amazonaws.com/0/148136/ad1dcc8b-ac11-5d9b-5462-857793f6918a.png)

予測結果は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

詳細は[こちら](http://predictionio.incubator.apache.org/gallery/template-gallery/)

この中から、自分が必要な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をテンプレートとして提出することもできます。詳細は[こちら](http://predictionio.incubator.apache.org/community/submit-template/)

機械学習を使えるだけでなく、提供もできる。それがPredictionIOです。

#さいごに
PredictionIOについて、いかがだったでしょうか？機械学習初心者や計算が苦手な人にも手軽に使えるところ、機械学習のエキスパートにはEngineを作って、提供できるところが良いと感じています。

PredictionIOを活用して、機械学習ライフを楽しんでみてはいかがでしょうか？
まずは[レコメンドのテンプレート](http://predictionio.incubator.apache.org/templates/recommendation/quickstart/)からPredictionIOを始めてみてはいかがでしょうか？

少しでも、興味を持っていただけたらいいねをお願いします。