

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

# Feature Store サンプルノートブックの概要
<a name="feature-store-introduction-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) には、それらのリソースの作成中にタグを追加するためのアクセス許可もあらかじめ含まれています。

このトピックのサンプルコードは、「[Introduction to Feature Store](https://sagemaker-examples.readthedocs.io/en/latest/sagemaker-featurestore/feature_store_introduction.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 ノートブックインスタンスを起動します。

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

## ステップ 1: SageMaker AI セッションを設定する
<a name="feature-store-setup"></a>

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

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

```
# SageMaker Python SDK version 2.x is required
import sagemaker
import sys
```

```
import boto3
import pandas as pd
import numpy as np
import io
from sagemaker.session import Session
from sagemaker import get_execution_role

prefix = 'sagemaker-featurestore-introduction'
role = get_execution_role()

sagemaker_session = sagemaker.Session()
region = sagemaker_session.boto_region_name
s3_bucket_name = sagemaker_session.default_bucket()
```

## ステップ 2: データを検査する
<a name="feature-store-load-datasets"></a>

このサンプルノートブックでは、ノートブック全体をホストする [GitHub リポジトリ](https://github.com/aws/amazon-sagemaker-examples/tree/master/sagemaker-featurestore/data)から合成データを取り込みます。

```
customer_data = pd.read_csv("data/feature_store_introduction_customer.csv")
orders_data = pd.read_csv("data/feature_store_introduction_orders.csv")

print(customer_data.head())
print(orders_data.head())
```

次の図は、特徴量ストアにデータが取り込まれる前のデータ処理ステップを説明しています。このノートブックでは、複数ソースからのデータがあり、これらのデータを特徴量ストアに別々に保存するユースケースについて説明します。この例では、データウェアハウスのデータ (顧客データ) とリアルタイムストリーミングサービスのデータ (注文データ) を考えます。

![このサンプルノートブックの特徴量ストアでの特徴量グループの作成とデータインジェスト](http://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/images/feature-store/feature-store-intro-diagram.png)


## ステップ 3: 特徴グループを作成する
<a name="feature-store-set-up-feature-groups-introduction"></a>

まず、customer\_data と orders\_data の特徴グループ名を作成します。この後、次のとおり `customer_data` に 1 つと `orders_data` に 1 つの、2 つの特徴量グループを作成します。

```
import time
from time import strftime, gmtime
customers_feature_group_name = 'customers-feature-group-' + strftime('%d-%H-%M-%S', gmtime())
orders_feature_group_name = 'orders-feature-group-' + strftime('%d-%H-%M-%S', gmtime())
```

`customers_data` と `orders_data` の `FeatureGroup` オブジェクトをインスタンス化します。

```
from sagemaker.feature_store.feature_group import FeatureGroup

customers_feature_group = FeatureGroup(
    name=customers_feature_group_name, sagemaker_session=sagemaker_session
)
orders_feature_group = FeatureGroup(
    name=orders_feature_group_name, sagemaker_session=sagemaker_session
)
```

```
import time
current_time_sec = int(round(time.time()))
record_identifier_feature_name = "customer_id"
```

データフレームに `EventTime` 特徴を追加します。このパラメータは必須で、各データポイントにタイムスタンプを追加します。

```
customer_data["EventTime"] = pd.Series([current_time_sec]*len(customer_data), dtype="float64")
orders_data["EventTime"] = pd.Series([current_time_sec]*len(orders_data), dtype="float64")
```

次のとおり、特徴量グループに特徴量定義をロードします。

```
customers_feature_group.load_feature_definitions(data_frame=customer_data)
orders_feature_group.load_feature_definitions(data_frame=orders_data)
```

以下は `create` を呼び出し、それぞれ `customers_feature_group` と `orders_feature_group` という 2 つの特徴量グループを作成します。

```
customers_feature_group.create(
    s3_uri=f"s3://{s3_bucket_name}/{prefix}",
    record_identifier_name=record_identifier_feature_name,
    event_time_feature_name="EventTime",
    role_arn=role,
    enable_online_store=True
)

orders_feature_group.create(
    s3_uri=f"s3://{s3_bucket_name}/{prefix}",
    record_identifier_name=record_identifier_feature_name,
    event_time_feature_name="EventTime",
    role_arn=role,
    enable_online_store=True
)
```

特徴量グループが作成されたことを確認するには、 `DescribeFeatureGroup` API と `ListFeatureGroups` API を使用して表示します。

```
customers_feature_group.describe()
```

```
orders_feature_group.describe()
```

```
sagemaker_session.boto_session.client('sagemaker', region_name=region).list_feature_groups() # We use the boto client to list FeatureGroups
```

## ステップ 4: 特徴グループにデータを取り込む
<a name="feature-store-set-up-record-identifier-event-time"></a>

特徴量グループを作成したら、特徴量グループにデータを取り込めます。SageMaker AI AWS SDK for Python (Boto3)を使用している場合は、`ingest` API コールを使用します。SDK for Python (Boto3) を使用している場合は、`PutRecord` API を使用します。この両方のオプションのデータ取り込みには 1 分もかかりません。この例では SageMaker AI SDK for Python (Boto3) を使用しているため、次のとおり `ingest` API コールを使用します。

```
def check_feature_group_status(feature_group):
    status = feature_group.describe().get("FeatureGroupStatus")
    while status == "Creating":
        print("Waiting for Feature Group to be Created")
        time.sleep(5)
        status = feature_group.describe().get("FeatureGroupStatus")
    print(f"FeatureGroup {feature_group.name} successfully created.")

check_feature_group_status(customers_feature_group)
check_feature_group_status(orders_feature_group)
```

```
customers_feature_group.ingest(
    data_frame=customer_data, max_workers=3, wait=True
)
```

```
orders_feature_group.ingest(
    data_frame=orders_data, max_workers=3, wait=True
)
```

`get_record` を任意の顧客レコード ID「573291」で使用して、データが特徴量グループに取り込まれているかを確認します。

```
customer_id = 573291
sample_record = sagemaker_session.boto_session.client('sagemaker-featurestore-runtime', region_name=region).get_record(FeatureGroupName=customers_feature_group_name, RecordIdentifierValueAsString=str(customer_id))
```

```
print(sample_record)
```

以下は、`batch_get_record` を使用して、レコードのバッチを取得する方法を説明しています。

```
all_records = sagemaker_session.boto_session.client(
    "sagemaker-featurestore-runtime", region_name=region
).batch_get_record(
    Identifiers=[
        {
            "FeatureGroupName": customers_feature_group_name,
            "RecordIdentifiersValueAsString": ["573291", "109382", "828400", "124013"],
        },
        {
            "FeatureGroupName": orders_feature_group_name,
            "RecordIdentifiersValueAsString": ["573291", "109382", "828400", "124013"],
        },
    ]
)
```

```
print(all_records)
```

## ステップ 5：クリーンアップ
<a name="feature-store-load-feature-definitions"></a>

ここでは、作成した特徴量グループを削除します。

```
customers_feature_group.delete()
orders_feature_group.delete()
```

## ステップ 6：次のステップ
<a name="feature-store-setup-create-feature-group"></a>

このサンプルノートブックでは、特徴量ストアの使用を開始し、特徴量グループを作成して、特徴量グループにデータを取り込む方法を説明しました。

不正検出のユースケースで特徴量ストアを使用する方法の高度な例については、「[Fraud Detection with Feature Store](https://sagemaker-examples.readthedocs.io/en/latest/sagemaker-featurestore/sagemaker_featurestore_fraud_detection_python_sdk.html)」を参照してください。

## ステップ 7: プログラマー向けのサンプルコード
<a name="feature-store-working-with-feature-groups"></a>

このノートブックでは、さまざまな API コールを使いました。そのほとんどは SageMaker Python SDK からアクセスできますが、Boto3 内でのみ提供されているものもあります。SageMaker Python SDK API コールは Feature Store オブジェクトで直接呼び出すことができます。一方、Boto3 内にある API コールを呼び出すには、まず Boto3 セッションと SageMaker AI セッションを介して Boto3 クライアントにアクセスする必要があります (`sagemaker_session.boto_session.client()` など)。

このノートブックの API コールの一覧は、以下のとおりです。このような呼び出しは SDK for Python 内で提供され、リファレンスとして Boto3 で提供されています。

 **SDK for Python (Boto3) API コール** 

```
describe()
ingest()
delete()
create()
load_feature_definitions()
```

 **Boto 3 の API コール** 

```
list_feature_groups()
get_record()
```