TransmogrifAIを使ってPredictionIO用のAutoMLテンプレートを作ってみた

Apache PredictionIOは、SalesforceによってApache Software Foundationに寄贈されたオープンソース機械学習プラットフォームです。

PredictionIOは機械学習ワークフローの全プロセスをカバーし、エンジンテンプレートという雛形をベースにすることで機械学習を使用した予測Web API簡単に作成することができます。 すぐに使える様々なエンジンテンプレートが用意されており、その中から目的に合ったものを選ぶことができます。 ただし、エンジンテンプレートはあくまでテンプレートなので、使用するデータやアルゴリズムにあわせてScala / Javaコードを書いてテンプレートをカスタマイズする必要があります。

一方で、TransmogrifAIは、Salesforceによって開発されたApache Spark上で動作するAutoMLライブラリで、コーディングなしで最良のモデルを見つけることを自動化することができます。そこで、TransmogrifAIを使用してPredictionIO用のコーディング不要の機械学習テンプレートを作成できるのではないかと思い、作ってみました。

github.com

タイタニックのサンプルを実行してみる

テンプレートの使い方を見るためにタイタニックのサンプルを動かしてみましょう。その前にPredictionIO自体のセットアップは済ませておく必要があります。

まずはpioコマンドでアプリケーションを作成します。

$ pio app new MyAutoMLApp1
[INFO] [App$] Initialized Event Store for this app ID: 4.
[INFO] [Pio$] Created a new app:
[INFO] [Pio$]       Name: MyAutoMLApp1
[INFO] [Pio$]         ID: 1
[INFO] [Pio$] Access Key: xxxxxxxxxxxxxxxx

アクセスキーを環境変数に設定します。

$ export ACCESS_KEY=xxxxxxxxxxxxxxxx

イベントサーバーを起動します。

$ pio eventserver &

イベントデータをイベントサーバにインポートします。テンプレートのルートディレクトリで以下のコマンドを実行します。

$ python ./data/import_titanic.py --file ./data/titanic.csv --access_key $ACCESS_KEY

学習を行います。結構時間がかかります。

$ pio train

学習が終了したらWeb API起動します。デフォルトでは8080ポートで起動します。

$ pio deploy

実際にリクエストを投げて動作を確認します。

$ curl -H "Content-Type: application/json" -d '{ "pClass": "2", "name": "Wheadon, Mr. Edward H", "sex": "male", "age": 66, "sibSp": 0, "parCh": 0, "ticket": "C.A 24579", "fare", 10.5, "cabin": "", "embarked": "S" }' http://localhost:8000/queries.json
{"survived":0.0}

$ curl -H "Content-Type: application/json" -d '{ "pClass": "2", "name": "Nicola-Yarred, Miss. Jamila", "sex": "female", "age": 14, "sibSp": 1, "parCh": 0, "ticket": "2651", "fare", 11.2417, "cabin": "", "embarked": "C" }' http://localhost:8000/queries.json
{"survived":1.0}

データにあわせてカスタマイズする

カスタマイズするにはコードを変更する必要はなく、テンプレートに含まれているengine.jsonという設定ファイルを修正するだけです。

"algorithms": [
  {
    "name": "algo",
    "params": {
      "target" : "survived",
      "schema" : [
        {
          "field": "survived",
          "type": "double",
          "nullable": false
        },
        {
          "field": "pClass",
          "type": "string",
          "nullable": true
        },
        ...
      ]
    }
  }
]

データにあわせてschemaを定義し、予測対象のフィールド名をtargetに指定します。現時点ではtargetで指定するフィールドはdouble型である必要があります。

まとめ

Apache PredictionIOとTransmogrifAIはどちらもApache Sparkで動作し、Salesforce社によってオープンソース化された機械学習プロダクトです。組み合わせて利用することで機械学習のワークフロー全体を自動化することができます。もちろんこのAutoMLテンプレートには改善点も多々ありますが、組み合わせ的にはなかなか良いコンビネーションなのではないかと思います。

なお、このテンプレートの作成中、TransmogrifAIの主要開発者の1人であるMatthew TovbinさんからTwitter上でいくつかの有用なアドバイスをいただきました。また、TransmogrifAIのドキュメントでこの記事の英語版を紹介していただきました。ありがとうございました。