nsakki55 のアウトプットブログ

MLエンジニアの技術周りの備忘録です

SageMaker Feature Store を使ってみる

SageMaker Feature Store の使用方法の一連の流れを解説します。
記事中での実行コード github.com

Feature Store とは

まずはML界隈で知られるFeature Store の概念について説明します。

Feature Store は「機械学習で使用される特徴量の一元管理を行うためのデータ管理システム」です。

似たような概念にData Lake や Data Warehouse があげられますが、それぞれ

  • Data Lake : 幅広い用途への利用を想定した、データの一元管理システム
  • Data Warehouse: 分析のために事前に定めたスキーマを持つ、構造化データ管理システム

といった役割を持ちます。

対して、Feature Store はMLで使用される特徴量の管理に特化した役割を持つことがポイントです。

Feature Storeの立ち位置
出典: Feature Stores: Components of a Data Science Factory [Guide] - neptune.ai

以下の記事でFeature Store の機能要件などをまとめてくださってます。 Feature Storeについてふんわり理解する - Re:ゼロから始めるML生活

Feature Store を利用することの利点として

  • 特徴量の保存・探索・更新・共有が容易になる
  • ストリーミング・バッチ両方でのデータの保存が可能
  • Offline・Online のFeature Store の使い分けが可能

があげられます

SageMaker Feature Store
出典: Amazon を使って特徴を作成、保存、共有する SageMaker Feature Store - Amazon SageMaker

Sagemaker Feature Store では以下のようなデータ取り込みの方法が検討できます

  • kafka, kinesis などのストリーミングソースからの取り込み
  • DataWrangler と連携した取り込み
  • Spark によるバッチデータ取り込み
  • SageMaker の Python SDK によるデータ取り込み

今回は、SageMaker Feature StoreのFeatureGroup 作成・データ登録・データ取得の一連の流れを実行します。

データ準備

kaggle のavazu-ctr-prediction のデータセットを今回は Feature Store へ登録します。

https://www.kaggle.com/c/avazu-ctr-prediction

Feature Store を使ってみる

Sagemaker Feature Store を利用する流れは以下のようになります

  • データ準備
  • Feature Group を作成
  • Feature Group にデータを登録
  • Feature Group からデータを取得

順番に実行していきましょう。

なお、記事中に出てくるコードは上から順番に実行していくことを想定しています。

データ準備

AWSの設定と、Feature Store を利用するのに必要なboto3 client の準備をします。

設定ファイルと、avazu-ctr-prediction のデータセットをローカルのPCに用意しておきます。

import yaml
import boto3

import sagemaker

# AWSの設定ファイル・データのあるフォルダのローカルパス
SETTING_FILE_PATH = "../config/settings.yaml"
DATASET_FOLDER_PATH = "./avazu-ctr-prediction"

with open(SETTING_FILE_PATH) as file:
    aws_info = yaml.safe_load(file)

    
sess = sagemaker.Session()
role = aws_info['aws']['sagemaker']['role']
bucket = aws_info['aws']['sagemaker']['s3bucket']
region = boto3.Session().region_name
sm = boto3.client('sagemaker', region_name=region)
featurestore_runtime = boto3.client("sagemaker-featurestore-runtime", region_name=region)

読み込んでいる settings.yamlは以下のようなyaml ファイルです

aws:
  sagemaker:
    role: "arn:aws:iam::{account_id}:role/service-role/AmazonSageMaker-ExecutionRole"
    s3bucket: "{bucket_name}"

データを読み込みます。train データサイズが6.3GBあり容量が大きいので、データ数を間引いています。

from pathlib import Path
import pandas as pd

dataset_folder = Path(DATASET_FOLDER_PATH)
df_train = pd.read_csv(dataset_folder / "train")
df_train_partial = df_train[df_train.index % 100 == 0] # データ数を減らします
df_train_partial.to_csv(dataset_folder / "train_partial", index=False)

df_train_partial = pd.read_csv(dataset_folder / "train_partial")
df_train_partial.head()
id click hour C1 banner_pos site_id site_domain site_category app_id app_domain app_category device_id device_ip device_model device_type device_conn_type C14 C15 C16 C17 C18 C19 C20 C21 event_time
0 1.000009e+18 0 14102100 1005 0 1fbe01fe f3845767 28905ebd ecad2386 7801e8d9 07d7df22 a99f214a ddd2926e 44956a24 1 2 15706 320 50 1722 0 35 -1 79 2022-05-11T09:22:24Z
1 1.001579e+19 0 14102100 1005 1 856e6d3f 58a89a43 f028772b ecad2386 7801e8d9 07d7df22 a99f214a 4375586d 5ec45883 1 0 19772 320 50 2227 0 687 100075 48 2022-05-11T09:22:24Z
2 1.002948e+18 0 14102100 1005 0 85f751fd c4e18dd6 50e219e0 1779deee 2347f47a f95efa07 a99f214a ab9a5222 2ee63ff8 1 0 20596 320 50 2161 0 35 -1 157 2022-05-11T09:22:24Z
3 1.004511e+19 0 14102100 1005 0 85f751fd c4e18dd6 50e219e0 51cedd4e aefc06bd 0f2161f8 a99f214a bbe53381 542422a7 1 0 19743 320 50 2264 3 427 100000 61 2022-05-11T09:22:24Z
4 1.005990e+19 0 14102100 1005 0 1fbe01fe f3845767 28905ebd ecad2386 7801e8d9 07d7df22 a99f214a 8a014cbb 04f5b394 1 0 15702 320 50 1722 0 35 -1 79 2022-05-11T09:22:24Z

Sagamker Feature Store では、Feature Group 作成時に以下の特徴名を渡す必要があります。

  • record_identifier_name: データの各レコードを一意に識別する特徴
  • event_time_feature_name: 各レコードの作成・更新時刻を表す特徴

Feature Store APIs — sagemaker 2.99.0 documentation
Amazon SageMaker Feature Store の使用を開始する - Amazon SageMaker

作成・更新時刻のデータ形式は、ISO-8601 文字列にする必要があります。

yyyy-MM-dd'T'HH:mm:ssZ と yyyy-MM-dd'T'HH:mm:ss.SSSZ の形式がサポートされています。

今回使用するデータに id , event_time 特徴を追加しましょう。 id はすでに存在しますが、簡単のためにindex番号に置き換えています。

# レコードの識別子
df_train_partial['id'] = df_train_partial.index

# レコードの生成時刻を表す列を追加
output_date = datetime.now().strftime("%Y-%m-%dT%H:%M:%SZ")
df_train_partial['event_time'] = output_date

Feature Store に保存する特徴は以下のカラムになります

record_identifier_name = "id"  # レコードの識別子
event_time_feature_name = "event_time"  # レコードの生成時刻

feature_names = [
    "click",
    "hour",
    "C1",
    "banner_pos",
    "site_id",
    "site_domain",
    "site_category",
    "app_id",
    "app_domain",
    "app_category",
    "device_id",
    "device_ip",
    "device_model",
    "device_type",
    "device_conn_type",
    "C14",
    "C15",
    "C16",
    "C17",
    "C18",
    "C19",
    "C20",
    "C21",
] + [record_identifier_name, event_time_feature_name]

Feature Group を作成

Feature Group のグループ名を準備します。同じグループ名で複数のFeature Group を作成することはできないので注意してください。

Ofiline Feature Store を作成する際のS3 bucket 中のprefix を用意しておきます

from sagemaker.feature_store.feature_definition import FeatureDefinition, FeatureTypeEnum
from sagemaker.feature_store.feature_group import FeatureGroup

feature_group_name = "ctr-prediction-group" + f"-{strftime('%d-%H-%M-%S', gmtime())}"
prefix = "ctr-prediction-feature-store"
print(feature_group_name) # ctr-prediction-group-11-15-00-25

Feature Group オブジェクトを作成する際、各特徴量のデータ型定義 feature_definitions を設定する必要があります。

Feature Store APIs — sagemaker 2.99.0 documentation

feature_definitions はFeatureDefinitionクラスのリストを受け取ります。FeatureDefinitionは特徴量名とFeatureTypeEnum をフィールドに持ちます。

Feature Store APIs — sagemaker 2.99.0 documentation

FeatureGroup では3つのデータ型があり、python のデータ型との対応は以下のようになっています

  • String : 文字列
  • Fractional : IEEE 64 ビット浮動小数点値
  • Integral : Int64-64 ビット符号付き整数値

デフォルトのデータ型はString となっているため、データセットの列がfloat or long 型でない場合、String 型として認識されます。

FeatureGroupへの feature_definitions の設定の方法には

  • load_feature_definitions を使用して Feature Definition のスキーマを自動で識別する
  • 自分で定義したFeature Definition のスキーマを使用する

2通りの方法があるので、2つの方法を試してみます。

load_feature_definitions を使用して Feature Definition のスキーマを自動で識別する

FeatureGroup クラスに feature_definitions を渡さず呼び出します.

feature_group_auto = FeatureGroup(name=feature_group_name, sagemaker_session=sess)

pandas DataFrame をそのまま load_feature_definitions メソッドに入力すると、ValueErrorが出てしまいます。

# pandas の DataFrameを直接入力すると ValueError がでる
try:
    feature_group_auto.load_feature_definitions(data_frame=df_train_partial)
except ValueError as e:
    print(e)

# Failed to infer Feature type based on dtype object for column site_id.

これは、pandas DataFrameの文字列object 型と、FeatureGroupの文字列型STRING が対応していないことが原因です。

df_train_partial.dtypes

# 出力
id                  float64
click                 int64
hour                  int64
C1                    int64
banner_pos            int64
site_id              object
site_domain          object
site_category        object
app_id               object
app_domain           object
app_category         object
device_id            object
device_ip            object
device_model         object
device_type           int64
device_conn_type      int64
C14                   int64
C15                   int64
C16                   int64
C17                   int64
C18                   int64
C19                   int64
C20                   int64
C21                   int64
event_time           object
dtype: object

手間ですが、object 型をFeatureGruopが認識できる string 型に明示的に変換します。

# Pandas の object 型を Feature Group が認識できる string 型に変換する
def cast_object_to_string(df: pd.DataFrame) -> pd.DataFrame:
    df_tmp = df.copy()
    for label in df_tmp.columns:
        if df_tmp.dtypes[label] == 'object':
            df_tmp[label] = df_tmp[label].astype("str").astype("string")
    return df_tmp

object 型が string 型に変換されていることを確認します

cast_object_to_string(df_train_partial).dtypes

# 出力
id                  float64
click                 int64
hour                  int64
C1                    int64
banner_pos            int64
site_id              string
site_domain          string
site_category        string
app_id               string
app_domain           string
app_category         string
device_id            string
device_ip            string
device_model         string
device_type           int64
device_conn_type      int64
C14                   int64
C15                   int64
C16                   int64
C17                   int64
C18                   int64
C19                   int64
C20                   int64
C21                   int64
event_time           string
dtype: object

load_feature_definitions メソッドを呼び出して、FeatureGroupに入力データのFeatureDenfinitions のスキーマを自動識別させます。

feature_group_auto.load_feature_definitions(data_frame=cast_object_to_string(df_train_partial))

# 出力
[FeatureDefinition(feature_name='id', feature_type=<FeatureTypeEnum.FRACTIONAL: 'Fractional'>),
 FeatureDefinition(feature_name='click', feature_type=<FeatureTypeEnum.INTEGRAL: 'Integral'>),
 FeatureDefinition(feature_name='hour', feature_type=<FeatureTypeEnum.INTEGRAL: 'Integral'>),
 FeatureDefinition(feature_name='C1', feature_type=<FeatureTypeEnum.INTEGRAL: 'Integral'>),
 FeatureDefinition(feature_name='banner_pos', feature_type=<FeatureTypeEnum.INTEGRAL: 'Integral'>),
 FeatureDefinition(feature_name='site_id', feature_type=<FeatureTypeEnum.STRING: 'String'>),
 FeatureDefinition(feature_name='site_domain', feature_type=<FeatureTypeEnum.STRING: 'String'>),
 FeatureDefinition(feature_name='site_category', feature_type=<FeatureTypeEnum.STRING: 'String'>),
 FeatureDefinition(feature_name='app_id', feature_type=<FeatureTypeEnum.STRING: 'String'>),
 FeatureDefinition(feature_name='app_domain', feature_type=<FeatureTypeEnum.STRING: 'String'>),
 FeatureDefinition(feature_name='app_category', feature_type=<FeatureTypeEnum.STRING: 'String'>),
 FeatureDefinition(feature_name='device_id', feature_type=<FeatureTypeEnum.STRING: 'String'>),
 FeatureDefinition(feature_name='device_ip', feature_type=<FeatureTypeEnum.STRING: 'String'>),
 FeatureDefinition(feature_name='device_model', feature_type=<FeatureTypeEnum.STRING: 'String'>),
 FeatureDefinition(feature_name='device_type', feature_type=<FeatureTypeEnum.INTEGRAL: 'Integral'>),
 FeatureDefinition(feature_name='device_conn_type', feature_type=<FeatureTypeEnum.INTEGRAL: 'Integral'>),
 FeatureDefinition(feature_name='C14', feature_type=<FeatureTypeEnum.INTEGRAL: 'Integral'>),
 FeatureDefinition(feature_name='C15', feature_type=<FeatureTypeEnum.INTEGRAL: 'Integral'>),
 FeatureDefinition(feature_name='C16', feature_type=<FeatureTypeEnum.INTEGRAL: 'Integral'>),
 FeatureDefinition(feature_name='C17', feature_type=<FeatureTypeEnum.INTEGRAL: 'Integral'>),
 FeatureDefinition(feature_name='C18', feature_type=<FeatureTypeEnum.INTEGRAL: 'Integral'>),
 FeatureDefinition(feature_name='C19', feature_type=<FeatureTypeEnum.INTEGRAL: 'Integral'>),
 FeatureDefinition(feature_name='C20', feature_type=<FeatureTypeEnum.INTEGRAL: 'Integral'>),
 FeatureDefinition(feature_name='C21', feature_type=<FeatureTypeEnum.INTEGRAL: 'Integral'>),
 FeatureDefinition(feature_name='event_time', feature_type=<FeatureTypeEnum.STRING: 'String'>)]

今回は自前で定義したスキーマのFeatureDefinitionsを使用するので、作成したFeatureGroupオブジェクトは削除しておきます

del feature_group_auto

自分で定義したFeature Definition のスキーマを使用する

自分で定義したFeatureDefinition を利用する場合、特徴名と対応するFeatureTypeEnumをフィールドにもつFeatureDefinitionのリストを作成します。

今回は全てSTRING型として扱います。

feature_definitions = [
    FeatureDefinition(feature_name=feature_name, feature_type=FeatureTypeEnum.STRING)
    for feature_name in feature_names
]

feature_group_original = FeatureGroup(name=feature_group_name, feature_definitions=feature_definitions, sagemaker_session=sess)
feature_group_original.feature_definitions

# 出力
[FeatureDefinition(feature_name='click', feature_type=<FeatureTypeEnum.STRING: 'String'>),
 FeatureDefinition(feature_name='hour', feature_type=<FeatureTypeEnum.STRING: 'String'>),
 FeatureDefinition(feature_name='C1', feature_type=<FeatureTypeEnum.STRING: 'String'>),
 FeatureDefinition(feature_name='banner_pos', feature_type=<FeatureTypeEnum.STRING: 'String'>),
 FeatureDefinition(feature_name='site_id', feature_type=<FeatureTypeEnum.STRING: 'String'>),
 FeatureDefinition(feature_name='site_domain', feature_type=<FeatureTypeEnum.STRING: 'String'>),
 FeatureDefinition(feature_name='site_category', feature_type=<FeatureTypeEnum.STRING: 'String'>),
 FeatureDefinition(feature_name='app_id', feature_type=<FeatureTypeEnum.STRING: 'String'>),
 FeatureDefinition(feature_name='app_domain', feature_type=<FeatureTypeEnum.STRING: 'String'>),
 FeatureDefinition(feature_name='app_category', feature_type=<FeatureTypeEnum.STRING: 'String'>),
 FeatureDefinition(feature_name='device_id', feature_type=<FeatureTypeEnum.STRING: 'String'>),
 FeatureDefinition(feature_name='device_ip', feature_type=<FeatureTypeEnum.STRING: 'String'>),
 FeatureDefinition(feature_name='device_model', feature_type=<FeatureTypeEnum.STRING: 'String'>),
 FeatureDefinition(feature_name='device_type', feature_type=<FeatureTypeEnum.STRING: 'String'>),
 FeatureDefinition(feature_name='device_conn_type', feature_type=<FeatureTypeEnum.STRING: 'String'>),
 FeatureDefinition(feature_name='C14', feature_type=<FeatureTypeEnum.STRING: 'String'>),
 FeatureDefinition(feature_name='C15', feature_type=<FeatureTypeEnum.STRING: 'String'>),
 FeatureDefinition(feature_name='C16', feature_type=<FeatureTypeEnum.STRING: 'String'>),
 FeatureDefinition(feature_name='C17', feature_type=<FeatureTypeEnum.STRING: 'String'>),
 FeatureDefinition(feature_name='C18', feature_type=<FeatureTypeEnum.STRING: 'String'>),
 FeatureDefinition(feature_name='C19', feature_type=<FeatureTypeEnum.STRING: 'String'>),
 FeatureDefinition(feature_name='C20', feature_type=<FeatureTypeEnum.STRING: 'String'>),
 FeatureDefinition(feature_name='C21', feature_type=<FeatureTypeEnum.STRING: 'String'>),
 FeatureDefinition(feature_name='id', feature_type=<FeatureTypeEnum.STRING: 'String'>),
 FeatureDefinition(feature_name='event_time', feature_type=<FeatureTypeEnum.STRING: 'String'>)]

create

作成したFeatureGroupオブジェクトの create メソッドを呼び出すことで、FeatureGroupをSagemaker上に作成します。

Feature Store APIs — sagemaker 2.99.0 documentation

  • s3_uri: Offline Feature Storeでのデータ保存先S3 URI. Falseで offine storeを無効化
  • record_identifier_name:
  • event_time_feature_name : データ中のレコードの生成・更新時刻に対応する特徴名
  • role_arn : FeatureGroup 作成時のRole
  • online_store_kms_key_id : online store のkms key id
  • enable_online_store: online store を有効化するか. default = False
  • offline_store_kms_key_id: offline store のkms key id
  • disable_glue_table_creation: Glue tableの作成有無
  • data_catalog_config: Metadata storeの設定
  • description: FeatureGroupの説明
  • tags: FeatureGroupのタグ
feature_group_original.create(
    s3_uri=f"s3://{bucket}/{prefix}", # offline feature store でデータを保存する S3 URI
    record_identifier_name=record_identifier_name, # レコード識別子のカラム名
    event_time_feature_name=event_time_feature_name, # レコード生成時刻のカラム名
    role_arn=role, 
    enable_online_store=True, # online feature store を作成するか. defualt = False
    description = "Feature Group For CTR Prediciton",
    tags = [{"Key":"author", "Value": "satsuki"},{"Key":"target", "Value": "click"} ]
)

SagaMeker Studio のFeature Store 画面から確認すると、登録されていることが分かります。

FeatureGroup の登録

Details にFeatureGroup 作成時に設定した値が入ってます。offline feature store を作成したので、Table name に自動的に作成されたAWS Glue のテーブル名が入っています。

Feature Group Details

AWS Glue で作成されたテーブルを確認してみます。

FeatureGroup 作成時に設定したS3 URI 以下に接続先のS3パスが登録されています。

AWS Glue

以下のメソッドでもFeatureGroupの詳細を確認することができます

feature_group_original.describe()
sm.list_feature_groups()['FeatureGroupSummaries'][0]

Feature Group にデータを登録

データの登録方法は

の2通の方法があります。

Scale ML feature ingestion using Amazon SageMaker Feature Store | AWS Machine Learning Blog

FeatureGroupのput_record を利用する場合、 FeatureValue クラスのリストを渡します。

Feature Store APIs — sagemaker 2.99.0 documentation

from sagemaker.feature_store.inputs import FeatureValue

record = [
    FeatureValue(feature_name="id", value_as_string=str("-1")),
    FeatureValue(feature_name="event_time", value_as_string=str("2022-05-12T00:00:21Z")),
    FeatureValue(feature_name="click", value_as_string=str("1")),
    FeatureValue(feature_name="C1", value_as_string=str("1005")),
    FeatureValue(feature_name="banner_pos", value_as_string=str("0")),
]
feature_group_original.put_record(record)

boto3 の sagemaker client のput_record を利用する場合は、FeatureName とValueAsString をkeyに持つ辞書型のリストをput_recordに渡す必要があります。

SageMakerFeatureStoreRuntime — Boto3 Docs 1.24.29 documentation

record = [
    {"FeatureName": "id", "ValueAsString": str("-2")},
    {"FeatureName": "event_time", "ValueAsString": str("2022-05-12T00:00:21Z")},
    {"FeatureName": "click", "ValueAsString": str("0")},
    {"FeatureName": "C1", "ValueAsString": str("1002")},
    {"FeatureName": "banner_pos", "ValueAsString": str("1")},
]

featurestore_runtime.put_record(FeatureGroupName=feature_group_name, Record=record)

ingest でpandas のDataFrame をFeatureGroup にまとめて登録することができます。

max_workers を指定することで、並列処理が可能となります。

feature_group_original.ingest(data_frame=df_train, max_workers=4, wait=True)

Feature Group からデータの取得

online feature store の場合はboto3 の sagemaker client の get_record でデータを取得することができます。

SageMakerFeatureStoreRuntime — Boto3 Docs 1.24.29 documentation

get_record では、FeatureGroup のグループ名と、FeatureGroup作成時に設定したレコード識別子の取得したいレコードの番号を渡します。

record_identifier_value = str(-1)
response = featurestore_runtime.get_record(FeatureGroupName=feature_group_name, RecordIdentifierValueAsString=record_identifier_value)
response

# 出力
{'ResponseMetadata': {'RequestId': '2f934a36-601f-4c09-b5d9-d2549372bfaa',
  'HTTPStatusCode': 200,
  'HTTPHeaders': {'x-amzn-requestid': '2f934a36-601f-4c09-b5d9-d2549372bfaa',
   'content-type': 'application/json',
   'content-length': '260',
   'date': 'Fri, 13 May 2022 06:20:10 GMT'},
  'RetryAttempts': 0},
 'Record': [{'FeatureName': 'click', 'ValueAsString': '1'},
  {'FeatureName': 'C1', 'ValueAsString': '-1005'},
  {'FeatureName': 'banner_pos', 'ValueAsString': '0'},
  {'FeatureName': 'id', 'ValueAsString': '-1'},
  {'FeatureName': 'event_time', 'ValueAsString': '2022-05-12T00:00:21Z'}]}

batch_get_record で、複数レコードの取得が可能です

record_identifier_values = ["1", "2", "3", "4"]
batch_response = featurestore_runtime.batch_get_record(Identifiers=[{"FeatureGroupName": feature_group_name, "RecordIdentifiersValueAsString": record_identifier_values}])
batch_response

offline feature store からデータを取得する場合、Athena クエリを利用します。

feature_store_query = feature_group_original.athena_query()
feature_store_table = feature_store_query.table_name
print(feature_store_table) # ctr-prediction-group-11-15-00-25-1652281250

試しに5行データを取得してみます

query_string = """
SELECT *
FROM "{}" LIMIT 5
""".format(
    feature_store_table
)

SQL を実行します。この際、結果の保存先S3パスを指定できます。

feature_store_query.run(query_string=query_string, output_location="s3://" + bucket + "/" + prefix + "/query_results/")
feature_store_query.wait()
dataset = feature_store_query.as_dataframe()
dataset
click hour c1 banner_pos site_id site_domain site_category app_id app_domain app_category device_id device_ip device_model device_type device_conn_type c14 c15 c16 c17 c18 c19 c20 c21 id event_time write_time api_invocation_time is_deleted
0 0 14102100.0 1005.0 0.0 1fbe01fe f3845767 28905ebd ecad2386 7801e8d9 07d7df22 a99f214a 52aa6971 8a4875bd 1.0 0.0 15706.0 320.0 50.0 1722.0 0.0 35.0 -1.0 79.0 10 2022-05-12T00:00:21Z 2022-05-11 15:09:56.893 2022-05-11 15:04:45.000 False
1 1 14102100.0 1005.0 0.0 1fbe01fe f3845767 28905ebd ecad2386 7801e8d9 07d7df22 a99f214a bc7f9471 8b1aa260 1.0 0.0 15705.0 320.0 50.0 1722.0 0.0 35.0 -1.0 79.0 8 2022-05-12T00:00:21Z 2022-05-11 15:17:17.810 2022-05-11 15:12:14.000 False
2 0 14102100.0 1005.0 0.0 3a66a5a5 9e328a4d f028772b ecad2386 7801e8d9 07d7df22 a99f214a e3510321 24f6b932 1.0 0.0 19666.0 300.0 250.0 2253.0 2.0 303.0 100026.0 52.0 12 2022-05-12T00:00:21Z 2022-05-11 15:09:56.642 2022-05-11 15:04:48.000 False
3 1 14102100.0 1005.0 0.0 1fbe01fe f3845767 28905ebd ecad2386 7801e8d9 07d7df22 a99f214a 0c8a8801 c144e605 1.0 0.0 15708.0 320.0 50.0 1722.0 0.0 35.0 -1.0 79.0 17 2022-05-12T00:00:21Z 2022-05-11 15:09:56.642 2022-05-11 15:04:48.000 False
4 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN -1 2022-05-12T00:00:21Z 2022-05-13 06:34:21.256 2022-05-13 06:29:27.000 False

指定したS3パスに結果が出力されていることを確認できます

Athena Query 結果の保存先

まとめ

SageMaker Feature Store の Feature Group の作成・登録・取得までの一連の流れを実行しました。今回はjupyter notebook 上での操作に止まりましたが、kinesis や DataWrangler と連携した操作も可能となっています。

参考