SageMaker Feature Store の使用方法の一連の流れを解説します。
記事中での実行コード
github.com
Feature Store とは
まずはML界隈で知られるFeature Store の概念について説明します。
Feature Store は「機械学習で使用される特徴量の一元管理を行うためのデータ管理システム」です。
似たような概念にData Lake や Data Warehouse があげられますが、それぞれ
- Data Lake : 幅広い用途への利用を想定した、データの一元管理システム
- Data Warehouse: 分析のために事前に定めたスキーマを持つ、構造化データ管理システム
といった役割を持ちます。
対して、Feature Store はMLで使用される特徴量の管理に特化した役割を持つことがポイントです。
出典: Feature Stores: Components of a Data Science Factory [Guide] - neptune.ai
以下の記事でFeature Store の機能要件などをまとめてくださってます。 Feature Storeについてふんわり理解する - Re:ゼロから始めるML生活
Feature Store を利用することの利点として
- 特徴量の保存・探索・更新・共有が容易になる
- ストリーミング・バッチ両方でのデータの保存が可能
- Offline・Online の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 となっているため、データセットの列が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 画面から確認すると、登録されていることが分かります。
Details にFeatureGroup 作成時に設定した値が入ってます。offline feature store を作成したので、Table name に自動的に作成されたAWS Glue のテーブル名が入っています。
AWS Glue で作成されたテーブルを確認してみます。
FeatureGroup 作成時に設定したS3 URI 以下に接続先のS3パスが登録されています。
以下のメソッドでも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パスに結果が出力されていることを確認できます
まとめ
SageMaker Feature Store の Feature Group の作成・登録・取得までの一連の流れを実行しました。今回はjupyter notebook 上での操作に止まりましたが、kinesis や DataWrangler と連携した操作も可能となっています。
参考
- Amazon を使って特徴を作成、保存、共有する SageMaker Feature Store - Amazon SageMaker
- Feature Storeについてふんわり理解する - Re:ゼロから始めるML生活
- Feature Stores: Components of a Data Science Factory [Guide] - neptune.ai
- Amazon を使って特徴を作成、保存、共有する SageMaker Feature Store - Amazon SageMaker
- Scale ML feature ingestion using Amazon SageMaker Feature Store | AWS Machine Learning Blog