View a markdown version of this page

Feature Store サンプルノートブックの概要 - Amazon SageMaker AI

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

Feature Store サンプルノートブックの概要

重要

Amazon SageMaker Studio または Amazon SageMaker Studio Classic に Amazon SageMaker リソースの作成を許可するカスタム IAM ポリシーでは、これらのリソースにタグを追加するアクセス許可も付与する必要があります。Studio と Studio Classic は、作成したリソースに自動的にタグ付けするため、リソースにタグを追加するアクセス許可が必要になります。IAM ポリシーで Studio と Studio Classic によるリソースの作成が許可されていても、タグ付けが許可されていない場合は、リソースを作成しようとしたときに「AccessDenied」エラーが発生する可能性があります。詳細については、「SageMaker AI リソースにタグ付けのアクセス許可を付与する」を参照してください。

SageMaker リソースを作成するためのアクセス許可を付与する AWS Amazon SageMaker AI の マネージドポリシー には、それらのリソースの作成中にタグを追加するためのアクセス許可もあらかじめ含まれています。

このトピックのサンプルコードは、「Introduction to Feature Store」のサンプルノートブックを参照しています。このガイドに記載のコードは概念的なものであり、コピーしても完全には機能しないため、このノートブックは Studio Classic、ノートブックインスタンス、または JupyterLab で実行することをお勧めします。

サンプルノートブックなどを提供する GitHub レポジトリ (aws/amazon-sagemaker-examples) をクローンするには、以下を実行します。

SageMaker AI サンプルノートブックの準備が整ったところで、amazon-sagemaker-examples/sagemaker-featurestore ディレクトリに移動し、Feature Store 入門のサンプルノートブックを開きます。

ステップ 1: SageMaker AI セッションを設定する

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

注記

ノートブックの実行に使用するロールには、AmazonS3FullAccessAmazonSageMakerFeatureStoreAccess のマネージドポリシーががアタッチされている必要があります。IAM ロールへのポリシーの追加の詳細については「IAM ロールにポリシーを追加する」を参照してください。

# SageMaker Python SDK version 3.x is required import sagemaker import sys
import boto3 import pandas as pd import numpy as np import io from sagemaker.core.helper.session_helper import Session from sagemaker.core.helper.session_helper import get_execution_role prefix = 'sagemaker-featurestore-introduction' role = get_execution_role() sagemaker_session = Session() region = sagemaker_session.boto_region_name s3_bucket_name = sagemaker_session.default_bucket()

ステップ 2: データを検査する

このサンプルノートブックでは、ノートブック全体をホストする GitHub リポジトリから合成データを取り込みます。

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())

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

このサンプルノートブックの特徴量ストアでの特徴量グループの作成とデータインジェスト

ステップ 3: 特徴グループを作成する

まず、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())

V3 では、 FeatureGroup.create()は特徴量グループを直接作成して返すクラスメソッドであるため、個別のインスタンス化ステップは必要ありません。

from sagemaker.mlops.feature_store import FeatureGroup # No separate instantiation needed in v3; FeatureGroup.create() is called directly below
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")

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

from sagemaker.mlops.feature_store import load_feature_definitions_from_dataframe customer_feature_defs = load_feature_definitions_from_dataframe(customer_data) order_feature_defs = load_feature_definitions_from_dataframe(orders_data)

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

from sagemaker.mlops.feature_store import OnlineStoreConfig, OfflineStoreConfig, S3StorageConfig FeatureGroup.create( feature_group_name=customers_feature_group_name, feature_definitions=customer_feature_defs, record_identifier_feature_name=record_identifier_feature_name, event_time_feature_name="EventTime", role_arn=role, online_store_config=OnlineStoreConfig(enable_online_store=True), offline_store_config=OfflineStoreConfig( s3_storage_config=S3StorageConfig(s3_uri=f"s3://{s3_bucket_name}/{prefix}") ), ) FeatureGroup.create( feature_group_name=orders_feature_group_name, feature_definitions=order_feature_defs, record_identifier_feature_name=record_identifier_feature_name, event_time_feature_name="EventTime", role_arn=role, online_store_config=OnlineStoreConfig(enable_online_store=True), offline_store_config=OfflineStoreConfig( s3_storage_config=S3StorageConfig(s3_uri=f"s3://{s3_bucket_name}/{prefix}") ), )

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

customers_fg = FeatureGroup.get(feature_group_name=customers_feature_group_name)
orders_fg = FeatureGroup.get(feature_group_name=orders_feature_group_name)
sagemaker_session.boto_session.client('sagemaker', region_name=region).list_feature_groups() # We use the boto client to list FeatureGroups

ステップ 4: 特徴グループにデータを取り込む

特徴量グループを作成したら、特徴量グループにデータを取り込めます。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)
from sagemaker.mlops.feature_store import ingest_dataframe ingest_dataframe( feature_group_name=customers_feature_group_name, data_frame=customer_data, max_workers=3, wait=True )
ingest_dataframe( feature_group_name=orders_feature_group_name, 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: クリーンアップ

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

FeatureGroup(feature_group_name=customers_feature_group_name).delete() FeatureGroup(feature_group_name=orders_feature_group_name).delete()

ステップ 6:次のステップ

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

不正検出のユースケースで特徴量ストアを使用する方法の高度な例については、「Fraud Detection with Feature Store」を参照してください。

ステップ 7: プログラマー向けのサンプルコード

このノートブックでは、さまざまな 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()