こんにちは、PS課のミネです。
今年のre:inventで発表されたAmazon Personalizeとは、パーソナライゼーションやレコメンデーションに関する機械学習の知識がほとんど無くとも、ユーザーがモデルをデプロイできるサービスです。
![]()
そんなAmazon Personalizeですがpreviewに当選しましたので、以下のAWS公式ブログ/サンプルを参考にデータセットはRで準備し、AWS CLIでリソースの作成をしてAmazon Personalizeを利用してみたいと思います。
データセット準備
AWS公式ブログでも利用されているMoviLensのratings.csvからデータセットを準備します。AWS公式ブログはPythonで実行されていますが、今回はRで実行してみました。
#CSVファイルを読み込み。
ratings <- read.csv("ratings.csv", header = T)
#rating列をランダムに並べ替えます。もうちょっといい方法はあるかも。
ratings$rating <- sample(ratings$rating, 20000263)
#ratingが4以上の行を抽出。
ratings <- subset(ratings, ratings$rating>3.6)
#rating列の削除。
ratings$rating <- NULL
#Amazon Personalizeで利用できる列名に変更。
colnames(ratings) <- c('USER_ID','ITEM_ID','TIMESTAMP')
#使用する10万件のみ抽出。
ratings <- ratings[1:100000,]
#CSVファイルに保存。row.names = FALSEで行番号を削除しています。
write.csv(ratings, "ratings.processed.csv", row.names = FALSE)
あとはAWS CLIでの作業になります。
S3バケットへアップロードします。
$ aws s3 cp ratings.processed.csv s3://hogehoge
S3バケットのバケットポリシーはPersonalizeからアクセスできるよう以下のようにします。
{
"Version": "2012-10-17",
"Id": "PersonalizeS3BucketAccessPolicy",
"Statement": [
{
"Sid": "PersonalizeS3BucketAccessPolicy",
"Effect": "Allow",
"Principal": {
"Service": "personalize.amazonaws.com"
},
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::hogehoge",
"arn:aws:s3:::hogehoge/*"
]
}
]
}
AWS CLIでAmazon Personalizeを操作可能にする
Amazon PersonalizeはまだpreviewのためデフォルトではAWS CLIで操作できないようです。
以下を実行して操作可能にします。
$ wget -N https://s3-us-west-2.amazonaws.com/personalize-cli-json-models/personalize.json
$ wget -N https://s3-us-west-2.amazonaws.com/personalize-cli-json-models/personalize-runtime.json
$ aws configure add-model --service-model file://`pwd`/personalize.json --service-name personalize
$ aws configure add-model --service-model file://`pwd`/personalize-runtime.json --service-name personalize-runtime
スキーマ作成
AWS CLIでAmazpn Personalizeが操作できるようになったところで、データセット用にスキーマを作成します。Amazon Personalizeでは事前に定義されたキーワードを使う必要があります。
まずはスキーマをJSONファイル(schema.json)へ書き込みます。
{
"type": "record",
"name": "Interactions",
"namespace": "com.amazonaws.personalize.schema",
"fields":[
{
"name": "ITEM_ID",
"type": "string"
},
{
"name": "USER_ID",
"type": "string"
},
{
"name": "TIMESTAMP",
"type": "long"
}
],
"version": "1.0"
}
作成したJSONファイルの内容からAMazon Personalizeにスキーマを作成します。
$ aws personalize create-schema --name スキーマ名 --schema file://`pwd`/schema.json
スキーマのARNが返ってくるので以下のコマンドでスキーマの内容を確認できます。
$ aws personalize describe-schema --schema-arn スキーマのARN
データセットグループ作成
データセットグループを作成します。データセットグループとはデータセットやこの後作成するSolution・Campaignをひとまとめにしたものです。
$ aws personalize create-dataset-group --name データセットグループ名
データセットグループのARNが返れば成功です。
続いてデータセットを作成します。
$ aws personalize create-dataset --schema-arn スキーマのARN \
--dataset-group-arn データセットグループのARN \
--dataset-type INTERACTIONS
こちらもデータセットのARNが返ってくれば成功です。
データセットのインポート
先ほどS3へアップロードしたCSVをAmazon Personalizeのデータセットへインポートします。インポートするにはインポートジョブを作成・実行する必要があります。
まずはインポート用のIAMロールを作成します。IAMポリシーは以下とします。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::hogehoge"
]
},
{
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::hogehoge/*"
]
}
]
}
IAMロールの信頼関係は以下のようにAmazon Personalizeを指定します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "personalize.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
作成したIAMロールを使用してインポートジョブを実行します。
$ aws personalize create-dataset-import-job --job-name ジョブ名 \
--role-arn IAMロールのARN \
--dataset-arn データセットのARN \
--data-source dataLocation=s3://hogehoge/ratings.processed.csv
インポートジョブのARNが返ってくるので、以下のコマンドでジョブの実行ステータスが確認できます。latestDatasetImportJobRun
のstatus
がActiveになるとインポート成功です。
$ aws personalize describe-dataset-import-job --dataset-import-job-arn ジョブのARN
Solutionの作成
Amazon Personalizeでは学習アルゴリズムのことをレシピと呼ぶようです。レシピはPersonalizeでデフォルトで用意されているものもありますが、ユーザーが持ち込むことも可能です。インポートしたデータをレシピに学習させたものをSolutionと呼ぶようです。今回のレシピはデフォルトで用意されているDeepFMを利用します。
Solutionの作成は以下のコマンドで実行します。DeepFMのレシピのARNを指定しています。事前定義されたレシピのARNはドキュメントで確認可能です。min-tps
は「minimum transactions per second」の略です。今回は1としておきます。
$ aws personalize create-solution --name Solution名 \
--recipe-arn arn:aws:personalize:::recipe/awspersonalizedeepfmmodel \
--min-tps 1 \
--dataset-group-arn データセットグループのARN
ちなみに上記コマンドでレシピのARNを指定せずに--perform-auto-ml
のオプションを使ってAutoMLを利用することができます。AutoMLを利用すればデータセットに対して最適なレシピを選択するのも自動で実行されます。各アルゴリズムに対して知識がなくとも、レシピが選択できるので非常に便利です。
以下のコマンドでSolutionの状態を確認します。latestSolutionVersion
のstatus
がActiveとなれば学習完了です。完了までには少し時間がかかります。
$ aws personalize describe-solution --solution-arn SolutionのARN
Solutionの学習が完了すると、以下のコマンドで各メトリクスが確認できます。
$ aws personalize get-metrics --solution-arn SolutionのARN
Campaignの作成
トレーニングしたSolutionをデプロイしますが、Personalizeでは「Campaign」というコンポーネントでSolutionがデプロイされます。以下のコマンドでCampaignを作成します。--update-mode
でAUTO
を指定していますが、これはSolutionが更新されると自動でCampaignが更新されるというオプションです。MANUAL
を指定した場合はSolutionを更新しても自動でCampaignは更新されず、aws personalize update-campaign
で更新する必要があります。
$ aws personalize create-campaign \
--name sample-campaign \
--solution-arn SolutionのARN \
--update-mode AUTO
レコメンドしてみる
それではレコメンドしてみます。以下のコマンドでレコメンドできます。--query "itemList[*].itemId"
でITEM_IDのリストが返ってくるようになっています。
$ aws personalize-runtime get-recommendations \
--campaign-arn CampaignのARN \
--user-id 任意のUSER_ID \
--query "itemList[*].itemId"
以下が返り値の例です。
["4226", "260", "3949", "337", "832", "5459", {略} , "555", "597", "2396"]
まとめ
いかがでしたでしょうか。いとも簡単にレコメンデーションのモデルをデプロイすることが出来ました。今回は事前定義されたレシピを明示的に選択しましたが、AutoMLを有効にするとその選択すらいらなくなります。ほとんど労力をかけずによりよいレコメンデーションの仕組みをアプリケーションに組み込めるわけですね。