ROMANCE DAWN for the new world

Microsoft Azure を中心とした技術情報を書いています。

Azure Recommendations Solution Template を使ってみる

Microsoft Cognitive Services で提供されていた Recommendations API は、プレビューのまま開発が中断され、2018年2月15日に正式に廃止されました。
その代わりとして、Recommendations Solution Template が提供されています。

github.com

今回は、Recommendations Solution Template を使って、商品カタログのレコメンド API を試してみます。

Recommendations Solution Template とは

このテンプレートを使うと、Azure にレコメンデーション エンジンがデプロイされ、商品カタログとトランザクション履歴のデータに基づいて、商品のレコメンド予測モデルを構築できます。
レコメンデーション エンジンは、Azure Web Apps、Web Jobs、Storage で構成されるアーキテクチャとなっています。

f:id:TonyTonyKun:20181021161224p:plain

SAR(Smart Adaptive Recommendations)アルゴリズムによって、次の2つのシナリオがサポートされています。

Item-to-Item Recommendations

「この商品をチェックした人はこんな商品もチェックしています」のようなレコメンドを表示するシナリオです。関連する商品を表示することで、カタログ内の商品を見つけやすくします。

Personalized Recommendations

ユーザーの最近のトランザクション履歴をもとに、そのユーザーに特化したレコメンドを表示します。

レコメンデーション エンジンをデプロイする

GitHub リポジトリの「Deploy to Azure」ボタンをクリックすると Azure ポータルの ARM テンプレートが開くので、リソースグループ名を入力して、デプロイするだけです。

f:id:TonyTonyKun:20181021155134p:plain

数分で作成が完了します。

f:id:TonyTonyKun:20181021155146p:plain

作成されたリソースグループを開き、Deployment → Microsoft Template → Outputs の順でメニューを開くと、レコメンド API の URL や Key が表示されます。

f:id:TonyTonyKun:20181021155202p:plain

モデルのトレーニングに使うデータをアップロードする

モデルのトレーニングに使うサンプルデータが提供されているので、withTimestamps フォルダにある「catalog.csv」と「usage1.csv」をダウンロードします。
aka.ms

ダウンロードした CSV ファイルは、ARM テンプレートで作成された Azure Storage に Blob コンテナを作ってアップロードします。
今回は、Blob コンテナ「input-files」を作成し「catalog.csv」をアップロード、「trainUsage」ディレクトリの中に「usage1.csv」をアップロードしました。

input-files
 trainUsage
  usage1.csv
 catalog.csv

モデルをトレーニングする

Azure ポータルの Outputs メニューを確認し、「RECOMMENDATIONSSWAGGER」の URL から、Swagger UI を開きます。

f:id:TonyTonyKun:20181021155903p:plain

モデルをトレーニングするためには、POST /api/models API を使います。

POST https://<service_name>.azurewebsites.net/api/models
x-api-key: your_api_key
Content-Type: application/json
{
   "description": "Simple recommendations model",
   "blobContainerName": "input-files",
   "usageRelativePath": "trainUsage",
}

API Key は、「ADMINPRIMARYKEY」に記載されているキーを Swagger UI に貼り付けます。下記のようなレスポンスが返ってくれば、成功です。

{
  "id": "70f8d6f2-5cb2-4fe6-a311-9f64fcde6824",
  "description": "Simple recommendations model",
  "creationTime": "2018-10-21T06:13:39.5996404Z",
  "modelStatus": "Created",
  "parameters": {
    "blobContainerName": "input-files",
    "usageRelativePath": "trainUsage",
    "supportThreshold": 6,
    "cooccurrenceUnit": "User",
    "similarityFunction": "Jaccard",
    "enableColdItemPlacement": false,
    "enableColdToColdRecommendations": false,
    "enableUserAffinity": true,
    "enableUserToItemRecommendations": false,
    "allowSeedItemsInRecommendations": false,
    "enableBackfilling": true,
    "decayPeriodInDays": 30
  }
}

トレーニングの完了を確認する

トレーニングした結果確認には、GET /api/models/{modelId} API を使います。モデルIDは、先ほどの API のレスポンスにある id です。

GET https://<service_name>.azurewebsites.net/api/models/70f8d6f2-5cb2-4fe6-a311-9f64fcde6824
x-api-key: your_api_key

数分でトレーニングが完了し、下記のようなレスポンスが返ってきます。

{
  "id": "70f8d6f2-5cb2-4fe6-a311-9f64fcde6824",
  "description": "Simple recommendations model",
  "creationTime": "2018-10-21T06:13:39.5996404Z",
  "modelStatus": "Completed",
  "modelStatusMessage": "Model Training Completed Successfully",
  "parameters": {
    "blobContainerName": "input-files",
    "usageRelativePath": "trainUsage",
    "supportThreshold": 6,
    "cooccurrenceUnit": "User",
    "similarityFunction": "Jaccard",
    "enableColdItemPlacement": false,
    "enableColdToColdRecommendations": false,
    "enableUserAffinity": true,
    "enableUserToItemRecommendations": false,
    "allowSeedItemsInRecommendations": false,
    "enableBackfilling": true,
    "decayPeriodInDays": 30
  },

レコメンドを取得する

今回は、Item-to-Item Recommendations を使ってみます。レコメンドを取得するには、GET /api/models/{modelId} API を使います。itemId には、「catalog.csv」内の任意のデータを指定します。

GET https://<service_name>.azurewebsites.net/api/models/70f8d6f2-5cb2-4fe6-a311-9f64fcde6824/recommend?itemId=4XZ-00006
x-api-key: your_api_key
Content-Type: application/json

指定した商品のレコメンドが、下記のようなレスポンスが返ってくれば成功です。

[
  {
    "recommendedItemId": "fkf-00642",
    "score": 0.006606797222048044
  },
  {
    "recommendedItemId": "fkf-01145",
    "score": 0.00028058543102815747
  },
  {
    "recommendedItemId": "dhf-00285",
    "score": 0.0000208172423299402
  },
  {
    "recommendedItemId": "6gq-00364",
    "score": 0
  },
  {
    "recommendedItemId": "qr2-00011",
    "score": 0
  },
  {
    "recommendedItemId": "qq2-00031",
    "score": 0
  },
  {
    "recommendedItemId": "p2w-00004",
    "score": 0
  },
  {
    "recommendedItemId": "aaa-02875",
    "score": 0
  },
  {
    "recommendedItemId": "gza-00202",
    "score": 0
  },
  {
    "recommendedItemId": "r4t-00009",
    "score": 0
  }
]

なお、API だけでなく、Web のユーザーインターフェースも提供されています。同様に、モデルのトレーニングやレコメンドの取得を行うことができます。

f:id:TonyTonyKun:20181021160933p:plain

ユーザーインターフェースの URL は、Azure ポータルの Outputs メニューの「RECOMMENDATIONSUI」から取得できます。

まとめ

Cognitive Services で提供されていた頃に比べるとひと手間かかりますが、ARM テンプレートを使ってサクッとデプロイできるので、お手軽にレコメンド API を構築できます。
レコメンド機能をアプリケーションに追加してみると楽しいので、ぜひ試してみてください。

Microsoft MVP for Microsoft Azure を再受賞しました

2018年7月1日付けで、Microsoft Most Valuable Professional (MVP) アワードを再受賞しました。受賞カテゴリは、Microsoft Azure です。

f:id:TonyTonyKun:20180724211653j:plain

前回は制度変更に伴なう自動更新だったので、審査のある初めての更新でしたが、無事に再受賞できました。
今年はコミュニティーでの登壇やブログでの情報発信に加えて、製品チームへのフィードバックやコントリビュートにもチャレンジしたいです。

Interact 2018 で Kubernetes の話をしてきました

interact.connpass.com

先週の土曜日、Interact 2018 に参加して、Kubernetes の話をしてきました。
speakerdeck.com

セッションの内容としては、OSS トラックだったので、Azure 成分は少なめで、Kubernetes の概要から最低限押さえておきたい内部構造をデモを交えながら解説しました。
300人を超える申し込みがあり、同時に6セッション(全24セッション)が開催されたので、自分のセッションに参加者が集まるのか不安もありましたが、当日は部屋が満席になるほどの沢山の方に参加して頂き、ありがとうございました。Twitter のタイムラインや参加者アンケートを確認する範囲では、概ねいい評価の意見が多く安心しました。

個人の主催とは思えない規模のイベントであり、今年で5年目ということでしたが、私自身初めての参加でした。普段参加しているコミュニティーとは違った雰囲気で、楽しい時間を過ごすことができました。きっと来年も開催されるではないかと思いますので、また参加したいです。
運営の皆さま、そして参加された皆さま、ありがとうございました。