AWSでAIサービスを使ってみる〜第13回personalize編その③〜

##前回まで
前回はデータセットをs3にアップロードするまでのロールの作成とデータセットの取り込むプログラムを確認しました。

以下、前回までの記事です。

[AWSでAIサービスを使ってみる〜第11回Personalize編〜](https://qiita.com/AInosukey/items/1939cbac0ac5085f6463)

[AWSでAIサービスを使ってみる〜第12回personalize編その②〜](https://qiita.com/AInosukey/items/4215a0030b054609afc8)

##ソリューションとキャンペーンについて

今回はデータ作成後に行うソリューションの構築とキャンペーンを作成していきます。

#####ソリューション
・Pesonalize上でレコメンデーション(商品のおすすめ)を作成する仕組みのことをソリューションと呼びます。

#####キャンペーン
・ソリューションを公開するための仕組みのことをキャンペーンと呼んでいます。レコメンデーション(商品のおすすめ)の取得には学習済みのソリューションバージョンからキャンペーンを作成する必要があります。


それでは早速ソリューションを作成するプログラムを見ていきましょう！


##ソリューションの構築
ソリューション構築するプログラムの全体です。


```pers_create_solution.py
import boto3
import time
personalize = boto3.client('personalize')

#データセットグループを取得
for group in personalize.list_dataset_groups()['datasetGroups']:
  if group['name'] == 'Personalize_TestGroup':
    break
group_arn = group['datasetGroupArn']

#ソリューションを作成
solution_arn = personalize.create_solution(
  #名前注意
  name='Solution_Test', datasetGroupArn=group_arn,
  performAutoML=True)['solutionArn']
print('solution ARN:', solution_arn)

#ソリューション作成の進捗を表示
start = time.time()
status = ''
while status not in ['ACTIVE', 'CREATE FAILED']:
  status = personalize.describe_solution(
      solutionArn=solution_arn)['solution']['status']
  time.sleep(10)
  print('{:7.2f} {}'.format(time.time()-start, status))

#ソリューションバージョンを作成
version_arn = personalize.create_solution_version(
    solutionArn=solution_arn)['solutionVersionArn']
print('solution version ARN:', version_arn)

#ソリューションバージョン作の進捗を表示
start = time.time()
status = ''
while status not in ['ACTIVE', 'CREATE FAILED']:
  status = personalize.describe_solution_version(
      solutionVersionArn=version_arn)['solutionVersion']['status']
  time.sleep(10)
  print('{:7.2f} {}'.format(time.time()-start, status))
```
部分ごとに見ていきましょう！


#####インポートとデータセットグループの取得
```pers_create_solution.py
import boto3
import time
personalize = boto3.client('personalize')

#データセットグループを取得
for group in personalize.list_dataset_groups()['datasetGroups']:
  if group['name'] == 'Personalize_TestGroup':
    break
group_arn = group['datasetGroupArn']
```
・毎度のインポートは省略
・for文からlist_dataset_groupsメソッドで以前作成した'Personalize_TestGroup'を取得し
変数group_arnへ代入


#####ソリューションを作成
```pers_create_solution.py
#ソリューションを作成
solution_arn = personalize.create_solution(
  #名前注意
  name='Solution_Test', datasetGroupArn=group_arn,
  performAutoML=True)['solutionArn']
print('solution ARN:', solution_arn)
```
・crate_solutionメソッドでソリューションを作成します。メソッドの引数のperformAutoMLをTrueに指定すると、Personalizeが自動的に最適な機械学習の方式やパラメータを決定します。手動での調整も可能。

#####ソリューション作成の進捗を表示
```pers_create_solution.py
#ソリューション作成の進捗を表示
start = time.time()
status = ''
while status not in ['ACTIVE', 'CREATE FAILED']:
  status = personalize.describe_solution(
      solutionArn=solution_arn)['solution']['status']
  time.sleep(10)
  print('{:7.2f} {}'.format(time.time()-start, status))
```
・describe_solutionメソッドとwhile not 文でソリューションの情報を'ACTIVE', 'CREATE FAILED'になるまで10秒毎に取得し続けます。
・.formatでstatusを表示します。{:7.2f}の7は整数部分の最小幅、.2fは小数点以下の表示桁数を表します。

参考：[Pythonの文字列フォーマット（formatメソッドの使い方）](https://gammasoft.jp/blog/python-string-format/)

#####ソリューションバージョンの作成
```pers_create_solution.py
#ソリューションバージョンを作成
version_arn = personalize.create_solution_version(
    solutionArn=solution_arn)['solutionVersionArn']
print('solution version ARN:', version_arn)
```
・crate_solution_verdsionメソッドでソリューションバージョンを作成します。

#####ソリューションバージョン作成の進捗を表示
```pers_create_solution.py
#ソリューションバージョン作成の進捗を表示
start = time.time()
status = ''
while status not in ['ACTIVE', 'CREATE FAILED']:
  status = personalize.describe_solution_version(
      solutionVersionArn=version_arn)['solutionVersion']['status']
  time.sleep(10)
  print('{:7.2f} {}'.format(time.time()-start, status))
```
・先ほどのソリューション作成の進捗表示と同じです。


#####ソリューション作成の実行

```
python pers_create.py
```
pythonコマンドでファイル実行。
ソリューションもソリューションバージョンもエラーなく'ACTIVE'になれば作成完了です。

##キャンペーンの作成
キャンペーンを作成するプログラムの全体です。

```pers_create_campaign.py
import boto3
import time

personalize = boto3.client('personalize')
#データセットグループを取得
for group in personalize.list_dataset_groups()['datasetGroups']:
  if group['name'] == 'Personalize_TestGroup':
    break
group_arn = group['datasetGroupArn']

#ソリューションを取得
for solution in personalize.list_solutions(
  datasetGroupArn=group_arn)['solutions']:
  if solution['name'] == 'Solution_Test':
    break
solution_arn = solution['solutionArn']

#ソリューションバージョンを取得
version_arn = personalize.list_solution_versions(
    solutionArn=solution_arn
    )['solutionVersions'][0]['solutionVersionArn']

#キャンペーンを作成
campaign_arn = personalize.create_campaign(
  name='Campaign_Test', solutionVersionArn=version_arn,
  minProvisionedTPS=1)['campaignArn']
print('campaign ARN:', campaign_arn)

#キャンペーンの進捗を表示
start = time.time()
status = ''
while status not in ['ACTIVE', 'CREATE FAILED']:
  status = personalize.describe_campaign(
      campaignArn=campaign_arn)['campaign']['status']
  time.sleep(10)
  print('{:7.2f} {}'.format(time.time()-start, status))
```
部分ごとに見ていきましょう！

#####インポートとデータセット、ソリューション、ソリューションバージョンの取得

```pers_create_campaign.py
import boto3
import time

personalize = boto3.client('personalize')
#データセットグループを取得
for group in personalize.list_dataset_groups()['datasetGroups']:
  if group['name'] == 'Personalize_TestGroup':
    break
group_arn = group['datasetGroupArn']

#ソリューションを取得
for solution in personalize.list_solutions(
  datasetGroupArn=group_arn)['solutions']:
  if solution['name'] == 'Solution_Test':
    break
solution_arn = solution['solutionArn']

#ソリューションバージョンを取得
version_arn = personalize.list_solution_versions(
    solutionArn=solution_arn
    )['solutionVersions'][0]['solutionVersionArn']
```
import略(笑)
・もう皆さん流れはわかる方思いますが、データセット、ソリューション、ソリューションバージョンをそれぞれのメソッドで取得します。ソリューションバージョンについては取得の際に[0]からバージョンのARNを取得します。

#####キャンペーンの作成
```pers_create_campaign.py
#キャンペーンを作成
campaign_arn = personalize.create_campaign(
  name='Campaign_Test', solutionVersionArn=version_arn,
  minProvisionedTPS=1)['campaignArn']
print('campaign ARN:', campaign_arn)
```

・create_campaignメソッドでキャンペーンを取得します。
引数minProvisionedTPSはユーザーにリアルタイムのレコメンデーションを作成するための専用のトランザクション容量を指定します。(TPS:1秒あたりのトランザクション数)

引用:[Amazon Personalizeデベロッパーズガイド:キャンペーンの作成](https://docs.aws.amazon.com/ja_jp/personalize/latest/dg/campaigns.html)

#####キャンペーンの進捗を表示
```pers_create_campaign.py
#キャンペーンの進捗を表示
start = time.time()
status = ''
while status not in ['ACTIVE', 'CREATE FAILED']:
  status = personalize.describe_campaign(
      campaignArn=campaign_arn)['campaign']['status']
  time.sleep(10)
  print('{:7.2f} {}'.format(time.time()-start, status))
```
・いつもの進捗表示です。

#####キャンペーン作成の実行

```
python pers_create.py
```
pythonコマンドでファイル実行。
こちらもお時間かかりますが、エラーなく'ACTIVE'になれば作成完了です。

##まとめ
次回はPersonalize完結！やっとレコメンデーション出せます！

##参考文献サイト
[Pythonの文字列フォーマット（formatメソッドの使い方）](https://gammasoft.jp/blog/python-string-format/)
[Amazon Personalizeデベロッパーズガイド:キャンペーンの作成](https://docs.aws.amazon.com/ja_jp/personalize/latest/dg/campaigns.html)
[AWSでつくるAIプログラミング入門](https://www.amazon.co.jp/AWS%E3%81%A7%E3%81%A4%E3%81%8F%E3%82%8B-AI%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%85%A5%E9%96%80-%E6%9D%BE%E6%B5%A6-%E5%81%A5%E4%B8%80%E9%83%8E/dp/4798059056)