使用開始 (SDK for Java 2.x) - Amazon Personalize

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

使用開始 (SDK for Java 2.x)

このチュートリアルでは、Amazon Personalize ワークフローを最初から最後まで完了する方法をAWS SDK for Java 2.x。

不要な料金が発生しないようにするには、使用開始実習を終了したら、」リソースをクリーンアップするをクリックして、チュートリアルで作成したリソースを削除します。

Prerequisites

このチュートリアルを完了するための前提条件となる手順は、次のとおりです。

前提条件を完了したら、Amazon Personalize 依存関係を pom.xml ファイルに追加し、Amazon Personalize パッケージをインポートします。

  1. pom.xml ファイルに次の依存関係を追加します。最新のバージョン番号は、サンプルコードとは異なる場合があります。

    <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>personalize</artifactId> <version>2.16.83</version> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>personalizeruntime</artifactId> <version>2.16.83</version> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>personalizeevents</artifactId> <version>2.16.83</version> </dependency>
  2. プロジェクトに次のインポートステートメントを追加します。

    // import client packages import software.amazon.awssdk.services.personalize.PersonalizeClient; import software.amazon.awssdk.services.personalizeruntime.PersonalizeRuntimeClient; // The PersonalizeEventsClient is optional. Import if you are going to add interactions to the Interactions dataset in real time. import software.amazon.awssdk.services.personalizeevents.PersonalizeEventsClient; // Amazon Personalize exception package import software.amazon.awssdk.services.personalize.model.PersonalizeException; // schema packages import software.amazon.awssdk.services.personalize.model.CreateSchemaRequest; // dataset group packages import software.amazon.awssdk.services.personalize.model.CreateDatasetGroupRequest; import software.amazon.awssdk.services.personalize.model.DescribeDatasetGroupRequest; // dataset packages import software.amazon.awssdk.services.personalize.model.CreateDatasetRequest; // dataset import job packages import software.amazon.awssdk.services.personalize.model.CreateDatasetImportJobRequest; import software.amazon.awssdk.services.personalize.model.DataSource; import software.amazon.awssdk.services.personalize.model.DatasetImportJob; import software.amazon.awssdk.services.personalize.model.DescribeDatasetImportJobRequest; // solution packages import software.amazon.awssdk.services.personalize.model.CreateSolutionRequest; import software.amazon.awssdk.services.personalize.model.CreateSolutionResponse; // solution version packages import software.amazon.awssdk.services.personalize.model.DescribeSolutionRequest; import software.amazon.awssdk.services.personalize.model.CreateSolutionVersionRequest; import software.amazon.awssdk.services.personalize.model.CreateSolutionVersionResponse; import software.amazon.awssdk.services.personalize.model.DescribeSolutionVersionRequest; // campaign packages import software.amazon.awssdk.services.personalize.model.CreateCampaignRequest; import software.amazon.awssdk.services.personalize.model.CreateCampaignResponse; // get recommendations packages import software.amazon.awssdk.services.personalizeruntime.model.GetRecommendationsRequest; import software.amazon.awssdk.services.personalizeruntime.model.GetRecommendationsResponse; import software.amazon.awssdk.services.personalizeruntime.model.PredictedItem; // Java time utility package import java.time.Instant;

Amazon Personalize 依存関係を pom.xml ファイルに追加し、必要なパッケージをインポートしたら、以下の Amazon Personalize クライアントをインスタンス化します。

PersonalizeClient personalizeClient = PersonalizeClient.builder() .region(region) .build(); PersonalizeEventsClient personalizeEventsClient = PersonalizeEventsClient.builder() .region(region) .build(); // a PersonalizeRuntimeClient is optional for this tutorial. Optionally use this client if you want to add new interactions to the Interactions dataset in real-time. PersonalizeRuntimeClient personalizeRuntimeClient = PersonalizeRuntimeClient.builder() .region(region) .build();

Amazon Personalize クライアントを初期化したら、入門ガイドの前提条件。Amazon Personalize に履歴データをインポートするには、次の操作を行います。

  1. 以下の Avro スキーマを、作業ディレクトリに JSON ファイルとして保存します。このスキーマは、完了したときに作成した CSV ファイルの列と一致します。入門ガイドの前提条件

    { "type": "record", "name": "Interactions", "namespace": "com.amazonaws.personalize.schema", "fields": [ { "name": "USER_ID", "type": "string" }, { "name": "ITEM_ID", "type": "string" }, { "name": "TIMESTAMP", "type": "long" } ], "version": "1.0" }
  2. 以下のを使用します。createSchemaメソッドを使用して、Amazon Personalize でスキーマを作成します。パラメータとして、Amazon Personalize サービスクライアント、スキーマの名前、前のステップで作成したスキーマ JSON ファイルのファイルパスを渡します。このメソッドは、新しいスキーマの Amazon リソースネーム (ARN) を返します。後で使用するために、これを保存します。

    public static String createSchema(PersonalizeClient personalizeClient, String schemaName, String filePath) { String schema = null; try { schema = new String(Files.readAllBytes(Paths.get(filePath))); } catch (IOException e) { System.out.println(e.getMessage()); } try { CreateSchemaRequest createSchemaRequest = CreateSchemaRequest.builder() .name(schemaName) .schema(schema) .build(); String schemaArn = personalizeClient.createSchema(createSchemaRequest).schemaArn(); System.out.println("Schema arn: " + schemaArn); return schemaArn; } catch (PersonalizeException e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } return ""; }
  3. データセットグループを作成します。以下のを使用します。createDatasetGroupメソッドを使用して、データセットグループを作成します。パラメータとして、Amazon Personalize サービスクライアントとデータセットグループの名前を渡します。このメソッドは、新しいデータセットグループの ARN を返します。後で使用するために、これを保存します。

    public static String createDatasetGroup(PersonalizeClient personalizeClient, String datasetGroupName) { try { CreateDatasetGroupRequest createDatasetGroupRequest = CreateDatasetGroupRequest.builder() .name(datasetGroupName) .build(); return personalizeClient.createDatasetGroup(createDatasetGroupRequest).datasetGroupArn(); } catch (PersonalizeException e) { System.out.println(e.awsErrorDetails().errorMessage()); } return ""; }
  4. インタラクションデータセットを作成します。以下のを使用します。createDatasetメソッドを使用して、インタラクションデータセットを作成します。Amazon Personalize サービスクライアント、データセットの名前、スキーマの ARN、データセットグループの ARN、およびInteractionsをデータセットタイプとして使用します。このメソッドは、新しいデータセットの ARN を返します。後で使用するために、これを保存します。

    public static String createDataset(PersonalizeClient personalizeClient, String datasetName, String datasetGroupArn, String datasetType, String schemaArn) { try { CreateDatasetRequest request = CreateDatasetRequest.builder() .name(datasetName) .datasetGroupArn(datasetGroupArn) .datasetType(datasetType) .schemaArn(schemaArn) .build(); String datasetArn = personalizeClient.createDataset(request) .datasetArn(); System.out.println("Dataset " + datasetName + " created."); return datasetArn; } catch (PersonalizeException e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } return ""; }
  5. データセットインポートジョブを使用してデータをインポートします。以下のを使用します。createPersonalizeDatasetImportJobメソッドを使用して、データセットインポートジョブを作成します。

    パラメータとして、Amazon Personalize サービスクライアント、データセットグループの ARN、ジョブの名前、インタラクションデータセットの ARN、Amazon S3 バケットパス(s3://bucket name/folder name/ratings.csv)、およびサービスリンクされたロールの ARN (このロールは、入門ガイドの前提条件). このメソッドは、データセットインポートジョブの ARN を返します。オプションで、後で使用するために、これを保存します。

    public static String createPersonalizeDatasetImportJob(PersonalizeClient personalizeClient, String jobName, String datasetArn, String s3BucketPath, String roleArn) { long waitInMilliseconds = 60 * 1000; String status; String datasetImportJobArn; try { DataSource importDataSource = DataSource.builder() .dataLocation(s3BucketPath) .build(); CreateDatasetImportJobRequest createDatasetImportJobRequest = CreateDatasetImportJobRequest.builder() .datasetArn(datasetArn) .dataSource(importDataSource) .jobName(jobName) .roleArn(roleArn) .build(); datasetImportJobArn = personalizeClient.createDatasetImportJob(createDatasetImportJobRequest) .datasetImportJobArn(); DescribeDatasetImportJobRequest describeDatasetImportJobRequest = DescribeDatasetImportJobRequest.builder() .datasetImportJobArn(datasetImportJobArn) .build(); long maxTime = Instant.now().getEpochSecond() + 3 * 60 * 60; while (Instant.now().getEpochSecond() < maxTime) { DatasetImportJob datasetImportJob = personalizeClient .describeDatasetImportJob(describeDatasetImportJobRequest) .datasetImportJob(); status = datasetImportJob.status(); System.out.println("Dataset import job status: " + status); if (status.equals("ACTIVE") || status.equals("CREATE FAILED")) { break; } try { Thread.sleep(waitInMilliseconds); } catch (InterruptedException e) { System.out.println(e.getMessage()); } } return datasetImportJobArn; } catch (PersonalizeException e) { System.out.println(e.awsErrorDetails().errorMessage()); } return ""; }
  6. (オプション) イベントトラッカーを追加し、イベントを記録します。詳細については、「イベントの記録」を参照してください。

Amazon Personalize へのデータのインポートの詳細については、データの準備とインポート

データをインポートしたら、ソリューションとソリューションバージョンを次のように作成します。-solutionモデルをトレーニングするための設定とソリューションバージョン訓練されたモデルです。

  1. 以下のを使用して、新しいソリューションを作成します。createPersonalizeSolution方法。パラメーターとして、Amazon Personalize サービスクライアント、データセットグループ Amazon リソースネーム(ARN)、ソリューションの名前、ユーザーパーソナライゼーションレシピの ARN(arn:aws:personalize:::recipe/aws-user-personalization). このメソッドは、新しいソリューションの ARN を返します。後で使用するために、これを保存します。

    public static String createPersonalizeSolution(PersonalizeClient personalizeClient, String datasetGroupArn, String solutionName, String recipeArn) { try { CreateSolutionRequest solutionRequest = CreateSolutionRequest.builder() .name(solutionName) .datasetGroupArn(datasetGroupArn) .recipeArn(recipeArn) .build(); CreateSolutionResponse solutionResponse = personalizeClient.createSolution(solutionRequest); return solutionResponse.solutionArn(); } catch (PersonalizeException e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } return ""; }
  2. 以下のを使用してソリューションバージョンを作成します。createPersonalizeSolutionVersion方法。前のステップソリューションの ARN をパラメータとして渡します。次のコードは、まず、ソリューションの準備ができているかどうかを確認し、ソリューションのバージョンを作成します。トレーニングの間に、コードは DescribeSolutionVersion オペレーションを使用して、ソリューションバージョンのステータスを取得します。トレーニングが完了すると、新しいソリューションバージョンの ARN が返されます。後で使用するために、これを保存します。

    public static String createPersonalizeSolutionVersion(PersonalizeClient personalizeClient, String solutionArn) { long maxTime = 0; long waitInMilliseconds = 30 * 1000; // 30 seconds String solutionStatus = ""; String solutionVersionStatus = ""; String solutionVersionArn = ""; try { DescribeSolutionRequest describeSolutionRequest = DescribeSolutionRequest.builder() .solutionArn(solutionArn) .build(); maxTime = Instant.now().getEpochSecond() + 3 * 60 * 60;; // Wait until solution is active. while (Instant.now().getEpochSecond() < maxTime) { solutionStatus = personalizeClient.describeSolution(describeSolutionRequest).solution().status(); System.out.println("Solution status: " + solutionStatus); if (solutionStatus.equals("ACTIVE") || solutionStatus.equals("CREATE FAILED")) { break; } try { Thread.sleep(waitInMilliseconds); } catch (InterruptedException e) { System.out.println(e.getMessage()); } } if (solutionStatus.equals("ACTIVE")) { CreateSolutionVersionRequest createSolutionVersionRequest = CreateSolutionVersionRequest.builder() .solutionArn(solutionArn) .build(); CreateSolutionVersionResponse createSolutionVersionResponse = personalizeClient.createSolutionVersion(createSolutionVersionRequest); solutionVersionArn = createSolutionVersionResponse.solutionVersionArn(); System.out.println("Solution version ARN: " + solutionVersionArn); DescribeSolutionVersionRequest describeSolutionVersionRequest = DescribeSolutionVersionRequest.builder() .solutionVersionArn(solutionVersionArn) .build(); while (Instant.now().getEpochSecond() < maxTime) { solutionVersionStatus = personalizeClient.describeSolutionVersion(describeSolutionVersionRequest).solutionVersion().status(); System.out.println("Solution version status: " + solutionVersionStatus); if (solutionVersionStatus.equals("ACTIVE") || solutionVersionStatus.equals("CREATE FAILED")) { break; } try { Thread.sleep(waitInMilliseconds); } catch (InterruptedException e) { System.out.println(e.getMessage()); } } return solutionVersionArn; } } catch(PersonalizeException e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } return ""; }

詳細については、「ソリューションを作成します。」を参照してください。ソリューションバージョンを作成したら、先に進む前にそのパフォーマンスを評価できます。詳細については、「ステップ 4: メトリクスを使用したソリューションバージョンの評価」を参照してください。

ソリューションバージョンをトレーニングして評価したら、Amazon Personalize キャンペーンを使用してデプロイします。以下のを使用します。createPersonalCampaignメソッドを使用して、ソリューションバージョンを展開します。パラメータとして、Amazon Personalize サービスクライアント、前のステップで作成したソリューションバージョンの Amazon リソースネーム(ARN)、キャンペーンの名前を渡します。このメソッドは、新しいキャンペーンの ARN を返します。後で使用するために、これを保存します。

public static String createPersonalCompaign(PersonalizeClient personalizeClient, String solutionVersionArn, String name) { try { CreateCampaignRequest createCampaignRequest = CreateCampaignRequest.builder() .minProvisionedTPS(1) .solutionVersionArn(solutionVersionArn) .name(name) .build(); CreateCampaignResponse campaignResponse = personalizeClient.createCampaign(createCampaignRequest); System.out.println("The campaign ARN is "+campaignResponse.campaignArn()); return campaignResponse.campaignArn(); } catch (PersonalizeException e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } }

Amazon Personalize キャンペーンの詳細については、キャンペーンの作成

キャンペーンを作成したら、そのキャンペーンを使用して推奨事項を取得します。以下のを使用します。getRecsメソッドを使用して、ユーザーの推奨事項を取得します。パラメータとして、Amazon Personalize ランタイムクライアント、前のステップで作成した Amazon リソースネーム (ARN)、およびユーザー ID (123) を、インポートした履歴データから選択します。このメソッドは、推奨項目のリストを画面に出力します。

public static void getRecs(PersonalizeRuntimeClient personalizeRuntimeClient, String campaignArn, String userId){ try { GetRecommendationsRequest recommendationsRequest = GetRecommendationsRequest.builder() .campaignArn(campaignArn) .numResults(20) .userId(userId) .build(); GetRecommendationsResponse recommendationsResponse = personalizeRuntimeClient.getRecommendations(recommendationsRequest); List<PredictedItem> items = recommendationsResponse.itemList(); for (PredictedItem item: items) { System.out.println("Item Id is : "+item.itemId()); System.out.println("Item score is : "+item.score()); } } catch (AwsServiceException e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } }

Amazon Personalize プロジェクトを完了

SDK for Java 2.x を使用して Amazon Personalize ワークフローを完了する方法を示すオールインワンプロジェクトについては、personalize_appAWSSDK の例repository. このプロジェクトには、さまざまなレシピを使用した複数のソリューションバージョンのトレーニング、PutEvents 操作によるイベントの記録が含まれます。

その他の例については、「」に記載されたコードを参照してください。パーソナライズフォルダのAWSSDK の例リポジトリ