

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

# Feature Store サンプルノートブックを使用した不正検出
<a name="feature-store-fraud-detection-notebook"></a>

**重要**  
Amazon SageMaker Studio または Amazon SageMaker Studio Classic に Amazon SageMaker リソースの作成を許可するカスタム IAM ポリシーでは、これらのリソースにタグを追加するアクセス許可も付与する必要があります。Studio と Studio Classic は、作成したリソースに自動的にタグ付けするため、リソースにタグを追加するアクセス許可が必要になります。IAM ポリシーで Studio と Studio Classic によるリソースの作成が許可されていても、タグ付けが許可されていない場合は、リソースを作成しようとしたときに「AccessDenied」エラーが発生する可能性があります。詳細については、「[SageMaker AI リソースにタグ付けのアクセス許可を付与する](security_iam_id-based-policy-examples.md#grant-tagging-permissions)」を参照してください。  
SageMaker リソースを作成するためのアクセス許可を付与する [AWS Amazon SageMaker AI の マネージドポリシー](security-iam-awsmanpol.md) には、それらのリソースの作成中にタグを追加するためのアクセス許可もあらかじめ含まれています。

このページのサンプルコードは、「[Fraud Detection with Amazon SageMaker Feature Store](https://sagemaker-examples.readthedocs.io/en/latest/sagemaker-featurestore/sagemaker_featurestore_fraud_detection_python_sdk.html)」のサンプルノートブックを参照しています。このガイドに記載のコードは概念的なものであり、コピーしても完全には機能しないため、このノートブックは Studio Classic、ノートブックインスタンス、または JupyterLab で実行することをお勧めします。

サンプルノートブックなどを提供する GitHub レポジトリ ([aws/amazon-sagemaker-examples](https://github.com/aws/amazon-sagemaker-examples)) をクローンするには、以下を実行します。
+ **Studio Classic の場合**

  まず、Studio Classic を起動します。Studio または Studio Classic がデフォルトのエクスペリエンスとして有効になっている場合は、Studio Classic を開くことができます。Studio Classic を開くには、「[Amazon SageMaker AI コンソールを使用して Amazon SageMaker Studio Classic を起動する](studio-launch.md#studio-launch-console)」を参照してください。

  [aws/amazon-sagemaker-examples](https://github.com/aws/amazon-sagemaker-examples) の GitHub レポジトリを Studio Classic にクローンするには、「[Amazon SageMaker Studio Classicで Git レポジトリのクローンを作成する](studio-tasks-git.md)」の手順を実行します。
+ **Amazon SageMaker ノートブックインスタンスの場合**

  まず、「[ノートブックインスタンスへのアクセス](howitworks-access-ws.md)」の手順に従って、SageMaker ノートブックインスタンスを起動します。

  その後、[Amazon SageMaker AI アカウントに Git リポジトリを追加する](nbi-git-resource.md) の手順に従います。

SageMaker AI のサンプルノートブックの準備が整ったところで、`amazon-sagemaker-examples/sagemaker-featurestore` ディレクトリに移動し、「[Amazon SageMaker Feature Store を使用した不正検出](https://sagemaker-examples.readthedocs.io/en/latest/sagemaker-featurestore/sagemaker_featurestore_fraud_detection_python_sdk.html)」のサンプルノートブックを開きます。

## ステップ 1: 特徴量ストアセッションを設定する
<a name="feature-store-setup"></a>

Feature Store の使用を開始するには、SageMaker AI セッション、Boto3 セッション、Feature Store セッションを作成します。また、特徴量用の Amazon S3 バケットを設定します。これがオフラインストアとなります。次のコードでは SageMaker AI のデフォルトバケットを使い、カスタムプレフィックスを追加します。

**注記**  
ノートブックの実行に使用するロールには、`AmazonSageMakerFullAccess` と `AmazonSageMakerFeatureStoreAccess` のマネージドポリシーががアタッチされている必要があります。IAM ロールへのポリシーの追加の詳細については「[IAM ロールにポリシーを追加する](feature-store-adding-policies.md)」を参照してください。

```
import boto3
import sagemaker
from sagemaker.session import Session

sagemaker_session = sagemaker.Session()
region = sagemaker_session.boto_region_name
boto_session = boto3.Session(region_name=region)
role = sagemaker.get_execution_role()
default_bucket = sagemaker_session.default_bucket()
prefix = 'sagemaker-featurestore'
offline_feature_store_bucket = 's3://{}/{}'.format(default_bucket, prefix)

sagemaker_client = boto_session.client(service_name='sagemaker', region_name=region)
featurestore_runtime = boto_session.client(service_name='sagemaker-featurestore-runtime', region_name=region)

feature_store_session = Session(
    boto_session=boto_session,
    sagemaker_client=sagemaker_client,
    sagemaker_featurestore_runtime_client=featurestore_runtime
)
```

## ステップ 2: データセットをロードし、データを特徴量グループに分割する
<a name="feature-store-load-datasets"></a>

各特徴のデータフレームにデータをロードします。これらのデータフレームは、特徴グループをセットアップした後に使います。この不正検出の例では、これらのステップが次のコード中に見えます。

```
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import io

s3_client = boto3.client(service_name='s3', region_name=region)

fraud_detection_bucket_name = 'sagemaker-featurestore-fraud-detection'
identity_file_key = 'sampled_identity.csv'
transaction_file_key = 'sampled_transactions.csv'

identity_data_object = s3_client.get_object(Bucket=fraud_detection_bucket_name, Key=identity_file_key)
transaction_data_object = s3_client.get_object(Bucket=fraud_detection_bucket_name, Key=transaction_file_key)

identity_data = pd.read_csv(io.BytesIO(identity_data_object['Body'].read()))
transaction_data = pd.read_csv(io.BytesIO(transaction_data_object['Body'].read()))

identity_data = identity_data.round(5)
transaction_data = transaction_data.round(5)

identity_data = identity_data.fillna(0)
transaction_data = transaction_data.fillna(0)

# Feature transformations for this dataset are applied before ingestion into FeatureStore.
# One hot encode card4, card6
encoded_card_bank = pd.get_dummies(transaction_data['card4'], prefix = 'card_bank')
encoded_card_type = pd.get_dummies(transaction_data['card6'], prefix = 'card_type')

transformed_transaction_data = pd.concat([transaction_data, encoded_card_type, encoded_card_bank], axis=1)
transformed_transaction_data = transformed_transaction_data.rename(columns={"card_bank_american express": "card_bank_american_express"})
```

## ステップ 3: 特徴量グループを設定する
<a name="feature-store-set-up-feature-groups-fraud-detection"></a>

特徴グループをセットアップするときは、特徴名を一意の名前でカスタマイズし、`FeatureGroup` クラスを使って各特徴グループをセットアップする必要があります。

```
from sagemaker.feature_store.feature_group import FeatureGroup
feature_group_name = "some string for a name"
feature_group = FeatureGroup(name=feature_group_name, sagemaker_session=feature_store_session)
```

例えば、この不正検出の例では、2 つの特徴グループは `identity` と `transaction` です。次のコードでは、タイムスタンプを使って名前をカスタマイズする方法と、その後名前とセッションを渡すことで各グループをセットアップする方法を見ることができます。

```
import time
from time import gmtime, strftime, sleep
from sagemaker.feature_store.feature_group import FeatureGroup

identity_feature_group_name = 'identity-feature-group-' + strftime('%d-%H-%M-%S', gmtime())
transaction_feature_group_name = 'transaction-feature-group-' + strftime('%d-%H-%M-%S', gmtime())

identity_feature_group = FeatureGroup(name=identity_feature_group_name, sagemaker_session=feature_store_session)
transaction_feature_group = FeatureGroup(name=transaction_feature_group_name, sagemaker_session=feature_store_session)
```

## ステップ 4: レコード識別子とイベント時刻の特徴量を設定する
<a name="feature-store-set-up-record-identifier-event-time"></a>

このステップでは、レコード識別子名とイベント時間特徴名を指定します。この名前は、データ内の対応する特徴の列にマッピングされます。この不正検出の例では、関心のある列は `TransactionID` です。タイムスタンプが使用できない場合は、データに `EventTime` を追加できます。次のコードでは、どのようにこれらの変数が設定され、その後どのように両方の特徴のデータに `EventTime` が追加されるかを確認できます。

```
record_identifier_name = "TransactionID"
event_time_feature_name = "EventTime"
current_time_sec = int(round(time.time()))
identity_data[event_time_feature_name] = pd.Series([current_time_sec]*len(identity_data), dtype="float64")
transformed_transaction_data[event_time_feature_name] = pd.Series([current_time_sec]*len(transaction_data), dtype="float64")
```

## ステップ 5: 特徴量定義をロードする
<a name="feature-store-load-feature-definitions"></a>

これで、特徴データを含むデータフレームを渡すことで、特徴定義をロードできるようになりました。不正検出の例の次のコードでは、`load_feature_definitions` を使ってアイデンティティの特徴とトランザクションの特徴がそれぞれロードされます。この関数はデータの各列のデータ型を自動的に検出します。自動検出ではなくスキーマを使うデベロッパーは、「[Data Wrangler から特徴グループをエクスポートする](https://docs.aws.amazon.com/sagemaker/latest/dg/data-wrangler-data-export.html#data-wrangler-data-export-feature-store)」のコード例を参照してください。この例では、`FeatureGroup` の作成に使用できる `FeatureDefinition` として、スキーマをロードし、マッピングし、追加する方法を示しています。この例では、SageMaker Python SDK の代わりに使用できる AWS SDK for Python (Boto3) 実装についても説明します。

```
identity_feature_group.load_feature_definitions(data_frame=identity_data); # output is suppressed
transaction_feature_group.load_feature_definitions(data_frame=transformed_transaction_data); # output is suppressed
```

## ステップ 6: 特徴量グループを作成する
<a name="feature-store-setup-create-feature-group"></a>

このステップでは、`create` 関数を使って特徴グループを作成します。次のコードは、利用可能なすべてのパラメータを示しています。オンラインストアはデフォルトで作成されないため、有効にする場合は、これを `True` に設定する必要があります。`s3_uri` は、オフラインストアの S3 バケットの場所です。

```
# create a FeatureGroup
feature_group.create(
    description = "Some info about the feature group",
    feature_group_name = feature_group_name,
    record_identifier_name = record_identifier_name,
    event_time_feature_name = event_time_feature_name,
    feature_definitions = feature_definitions,
    role_arn = role,
    s3_uri = offline_feature_store_bucket,
    enable_online_store = True,
    online_store_kms_key_id = None,
    offline_store_kms_key_id = None,
    disable_glue_table_creation = False,
    data_catalog_config = None,
    tags = ["tag1","tag2"])
```

次のコードは不正検出の例で、作成する 2 つの特徴グループそれぞれについて、最小限の `create` 呼び出しを示しています。

```
identity_feature_group.create(
    s3_uri=offline_feature_store_bucket,
    record_identifier_name=record_identifier_name,
    event_time_feature_name=event_time_feature_name,
    role_arn=role,
    enable_online_store=True
)

transaction_feature_group.create(
    s3_uri=offline_feature_store_bucket,
    record_identifier_name=record_identifier_name,
    event_time_feature_name=event_time_feature_name,
    role_arn=role,
    enable_online_store=True
)
```

特徴グループを作成すると、データのロードに時間がかかり、特徴グループが作成されて使えるようになるまで待つ必要があります。次の方法を使うと、状態をチェックできます。

```
status = feature_group.describe().get("FeatureGroupStatus")
```

特徴グループが作成中である場合は、レスポンスとして `Creating` を受け取ります。このステップが正常に完了した場合、レスポンスは `Created` になります。その他のあり得るステータスは `CreateFailed`、`Deleting`、または `DeleteFailed` です。

## ステップ 7: 特徴量グループを操作する
<a name="feature-store-working-with-feature-groups"></a>

特徴量グループを設定できたので、次のどのタスクも実行できます。

**Topics**
+ [特徴量グループを記述する](#feature-store-describe-feature-groups)
+ [特徴量グループを一覧表示する](#feature-store-list-feature-groups)
+ [特徴量グループにレコードを入れる](#feature-store-put-records-feature-group)
+ [特徴量グループからレコードを取得する](#feature-store-get-records-feature-group)
+ [Hive DDL コマンドを生成する](#feature-store-generate-hive-ddl-commands-feature-group)
+ [トレーニングデータセットを構築する](#feature-store-build-training-dataset)
+ [Athena クエリを作成して実行する](#feature-store-write-athena-query)
+ [特徴量グループの削除](#feature-store-delete-feature-group)

### 特徴量グループを記述する
<a name="feature-store-describe-feature-groups"></a>

`describe` 関数を使って、特徴グループに関する情報を取得できます。

```
feature_group.describe()
```

### 特徴量グループを一覧表示する
<a name="feature-store-list-feature-groups"></a>

`list_feature_groups` 関数を使って、すべての特徴量グループを一覧表示できます。

```
sagemaker_client.list_feature_groups()
```

### 特徴量グループにレコードを入れる
<a name="feature-store-put-records-feature-group"></a>

`ingest` 関数を使って特徴データをロードできます。特徴データのデータフレームを渡し、ワーカー数を設定し、それが戻るのを待つかどうかを選択します。次の例は `ingest` 関数を使う方法を示しています。

```
feature_group.ingest(
    data_frame=feature_data, max_workers=3, wait=True
)
```

各特徴グループに対して、ロードする特徴データに `ingest` 関数を実行します。

### 特徴量グループからレコードを取得する
<a name="feature-store-get-records-feature-group"></a>

`get_record` 関数を使い、レコード識別子によって特定の特徴のデータを取得できます。次の例では、サンプルの識別子を使ってレコードを取得しています。

```
record_identifier_value = str(2990130)
featurestore_runtime.get_record(FeatureGroupName=transaction_feature_group_name, RecordIdentifierValueAsString=record_identifier_value)
```

不正検出の例からのレスポンスの例を次に示します。

```
...
'Record': [{'FeatureName': 'TransactionID', 'ValueAsString': '2990130'},
  {'FeatureName': 'isFraud', 'ValueAsString': '0'},
  {'FeatureName': 'TransactionDT', 'ValueAsString': '152647'},
  {'FeatureName': 'TransactionAmt', 'ValueAsString': '75.0'},
  {'FeatureName': 'ProductCD', 'ValueAsString': 'H'},
  {'FeatureName': 'card1', 'ValueAsString': '4577'},
...
```

### Hive DDL コマンドを生成する
<a name="feature-store-generate-hive-ddl-commands-feature-group"></a>

SageMaker Python SDK の `FeatureStore` クラスには、Hive DDL コマンドを生成する機能も用意されています。テーブルのスキーマは、特徴定義に基づいて生成されます。列の名前は特徴名に基づいており、データ型は特徴のタイプに基づいて推論されます。

```
print(feature_group.as_hive_ddl())
```

出力の例:

```
CREATE EXTERNAL TABLE IF NOT EXISTS sagemaker_featurestore.identity-feature-group-27-19-33-00 (
  TransactionID INT
  id_01 FLOAT
  id_02 FLOAT
  id_03 FLOAT
  id_04 FLOAT
 ...
```

### トレーニングデータセットを構築する
<a name="feature-store-build-training-dataset"></a>

Feature Store は、特徴量グループを作成すると AWS Glue データカタログを自動的に構築し、必要に応じてこれをオフにできます。以下で、このトピックの前の方で作成したアイデンティティ特徴グループとトランザクション特徴グループの両方の特徴値を使って、1 つのトレーニングデータセットを作成する方法を説明します。また、Amazon Athena クエリを実行して、オフラインストアに保存されたアイデンティティ特徴グループとトランザクション特徴グループの両方のデータを結合する方法を説明します。

まず、`athena_query()` を使って、アイデンティティとトランザクションの両方の特徴グループに対して Athena クエリを作成します。「table\_name」は、Feature Store によって自動生成される AWS Glue テーブルです。

```
identity_query = identity_feature_group.athena_query()
transaction_query = transaction_feature_group.athena_query()

identity_table = identity_query.table_name
transaction_table = transaction_query.table_name
```

### Athena クエリを作成して実行する
<a name="feature-store-write-athena-query"></a>

これらの特徴量グループに対するクエリを SQL を使って作成し、`.run()` コマンドを使って実行して、データセットを保存する Amazon S3 バケットの場所を指定します。

```
# Athena query
query_string = 'SELECT * FROM "'+transaction_table+'" LEFT JOIN "'+identity_table+'" ON "'+transaction_table+'".transactionid = "'+identity_table+'".transactionid'

# run Athena query. The output is loaded to a Pandas dataframe.
dataset = pd.DataFrame()
identity_query.run(query_string=query_string, output_location='s3://'+default_s3_bucket_name+'/query_results/')
identity_query.wait()
dataset = identity_query.as_dataframe()
```

ここから、このデータセットを使ってモデルをトレーニングし、次いで推論を実行できます。

### 特徴量グループの削除
<a name="feature-store-delete-feature-group"></a>

特徴グループは、`delete` 関数を使って削除できます。

```
feature_group.delete()
```

次のコード例は、不正検出の例のものです。

```
identity_feature_group.delete()
transaction_feature_group.delete()
```

詳細については、「[DeleteFeatureGroup API](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DeleteFeatureGroup.html)」を参照してください。