

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# SDK for Python (Boto3)을 이용한 특성 저장소 사용
<a name="feature-store-create-feature-group"></a>

특성 그룹은 Amazon SageMaker 특성 저장소에 저장된 기계 학습 (ML) 데이터 및 메타데이터를 포함하는 주요 특성 저장소 리소스입니다.특성 그룹은 특성과 레코드의 논리적 그룹입니다. 특성 그룹 정의는 온라인 및 오프라인 저장소의 구성과 레코드 값을 설명하는 데 사용되는 특성 정의 목록으로 구성됩니다. 특성 정의에는 레코드 식별자 이름과 이벤트 시간 이름이 포함되어야 합니다.특성 저장소 개념에 대한 자세한 내용은 [특성 저장소 개념](feature-store-concepts.md)섹션을 참고하세요.

특성 저장소를 사용하기 전에는 일반적으로 데이터세트를 로드하고, 변환을 실행하고, 수집할 특성을 설정합니다. 이 프로세스는 변동이 많고 데이터에 따라 크게 달라집니다. 다음 주제의 예제 코드는 각각 [특성 저장소 소개](https://sagemaker-examples.readthedocs.io/en/latest/sagemaker-featurestore/feature_store_introduction.html) 및 [Amazon SageMaker 특성 저장소를 통한 사기 탐지](https://sagemaker-examples.readthedocs.io/en/latest/sagemaker-featurestore/sagemaker_featurestore_fraud_detection_python_sdk.html) 예제 노트북을 참조합니다. 둘 다 AWS SDK for Python (Boto3)를 사용합니다. 추가 Feature Store 예시 및 리소스는 [Amazon SageMaker 특성 저장소 리소스](feature-store-resources.md) 섹션을 참조하세요.

특성 저장소는 `String`, `Fractional`(IEEE 64비트 부동 소수점 값), `Integral`(Int64 - 64비트 부호 있는 정수 값) 등의 특성 유형을 지원합니다. 기본값 유형은 `String`으로 설정됩니다. 즉, 데이터세트의 열이 `float`또는 `long`특성 유형이 아닌 경우 해당 열은 기본값으로 특성 저장소에 `String`으로 설정됩니다.

스키마를 사용하여 데이터의 열과 데이터 유형을 설명할 수 있습니다. 이 스키마를 `FeatureGroup`의 필수 파라미터인 `FeatureDefinitions`에 전달합니다. `load_feature_definitions` 함수를 사용할 때 자동으로 데이터 유형을 감지하는 Python용 SDK(Boto3)를 사용할 수 있습니다.

기존 레코드 ID를 사용하여 새 특성 레코드를 추가할 때의 기본 동작은 다음과 같습니다. 오프라인 저장소에서는 새 레코드가 추가됩니다. 온라인 저장소에서 새 레코드의 이벤트 시간이 기존 이벤트 시간보다 짧으면 아무 일도 일어나지 않지만 새 레코드의 이벤트 시간이 기존 이벤트 시간보다 크거나 같으면 레코드를 덮어씁니다.

새 특성 그룹을 생성할 때 다음 테이블 형식 중 하나를 선택할 수 있습니다.
+ AWS Glue (기본값)
+ Apache Iceberg

특히 스트리밍할 때 데이터를 수집하면 많은 수의 작은 파일이 오프라인 저장소에 보관될 수 있습니다. 이는 필요한 파일 작업 수가 많아져 쿼리 성능에 부정적인 영향을 미칠 수 있습니다. 잠재적인 성능 문제를 방지하려면 새 특성 그룹 생성 시 Apache Iceberg 테이블 형식을 사용하세요. Iceberg를 사용하면 작은 데이터 파일을 파티션에 있는 더 적은 수의 큰 파일로 압축하여 쿼리 속도를 크게 높일 수 있습니다. 이 압축 작업은 동시에 수행되며 특성 그룹에서 진행 중인 읽기 및 쓰기 작업에는 영향을 주지 않습니다. 새 특성 그룹을 생성할 때 Iceberg 옵션을 선택하면 Amazon SageMaker 특성 저장소는 Parquet 파일 형식을 사용하여 Iceberg 테이블을 생성하고 테이블을 AWS Glue Data Catalog에 등록합니다.

**중요**  
Iceberg 테이블 형식의 특성 그룹의 경우 이벤트 시간 값으로 `String`을 지정해야 한다는 점에 유의하세요. 다른 유형을 지정하면 특성 그룹을 성공적으로 생성할 수 없습니다.

다음은 사용 가능한 특성 저장소 관리 리소스 몇 가지를 보여줍니다.

**Topics**
+ [특성 저장소 소개 예제 노트북](feature-store-introduction-notebook.md)
+ [특성 저장소를 통한 사기 탐지 예제 노트북](feature-store-fraud-detection-notebook.md)

# 특성 저장소 소개 예제 노트북
<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)에는 해당 리소스를 만드는 동안 태그를 추가할 수 있는 권한이 이미 포함되어 있습니다.

이 페이지의 예제 코드는 [특성 저장소 소개](https://sagemaker-examples.readthedocs.io/en/latest/sagemaker-featurestore/feature_store_introduction.html) 예제 노트북을 참조합니다. Studio Classic, 노트북 인스턴스 또는 JupyterLab에서 이 노트북을 실행하는 것을 권장합니다.이 가이드의 코드는 개념적이며 복사할 경우 제대로 작동하지 않기 때문입니다.

다음을 사용하여 예시 노트북이 포함된 [aws/amazon-sagemaker-examples](https://github.com/aws/amazon-sagemaker-examples) GitHub 리포지토리를 복제합니다.
+ **Studio Classic의 경우**

  Studio Classic을 시작합니다. Studio 또는 Studio Classic이 기본 환경으로 활성화된 경우 Studio Classic을 열 수 있습니다. Studio Classic을 여는 방법에 관한 지침은 [Amazon SageMaker AI 콘솔을 사용하여 Amazon SageMaker Studio Classic 시작](studio-launch.md#studio-launch-console) 섹션을 참조하세요.

  [Amazon SageMaker Studio Classic에서 Git 리포지토리 복제](studio-tasks-git.md)의 단계에 따라 [aws/amazon-sagemaker-examples](https://github.com/aws/amazon-sagemaker-examples) GitHub 리포지토리를 Studio Classic에 복제합니다.
+ **Amazon SageMaker 노트북 인스턴스의 경우**

  [노트북 인스턴스에 액세스](howitworks-access-ws.md)의 지침에 따라 SageMaker 노트북 인스턴스를 시작합니다.

이제 SageMaker AI 예시 노트북이 있으므로 `amazon-sagemaker-examples/sagemaker-featurestore` 디렉터리로 이동하여 [Introduction to 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())
```

다음 다이어그램은 Feature Store에 데이터가 수집되기 전에 거치는 단계를 보여줍니다. 이 노트북에서는 여러 소스의 데이터가 존재하고 이를 Feature Store에 독립적으로 저장하려는 경우의 사용 사례를 보여줍니다. 이 예에서는 데이터 웨어하우스의 데이터(고객 데이터)와 실시간 스트리밍 서비스의 데이터(주문 데이터를 고려합니다.

![\[이 예시 노트북에 대한 Feature Store의 특성 그룹 만들기 및 데이터 수집\]](http://docs.aws.amazon.com/ko_kr/sagemaker/latest/dg/images/feature-store/feature-store-intro-diagram.png)


## 3단계: 특성 그룹 생성
<a name="feature-store-set-up-feature-groups-introduction"></a>

먼저 customer\$1data 및 orders\$1data에 대한 특성 그룹 이름을 만드는 것으로 시작합니다. 그런 다음 두 개의 특성 그룹을 만듭니다. 하나는 `customer_data`용, 다른 하나는 `orders_data`용입니다.

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

다음은 두 개의 특성 그룹, `customers_feature_group` 및 `orders_feature_group` 각각을 만들기 위해 `create`를 직접 호출합니다.

```
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` 및 `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
)
```

임의의 고객 레코드 ID인 573291을 사용하여 데이터가 특성 그룹에 수집되었는지 `get_record`를 사용하여 확인합니다.

```
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>

이 예시 노트북에서는 Feature Store를 빠르게 시작하고, 특성 그룹을 만들며, 여기에 데이터를 수집하는 방법을 배웠습니다.

Feature Store를 사기 감지에 사용하는 방법에 대한 고급 예시는 [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 내에서만 존재합니다. Feature Store 객체에서 곧바로 SageMaker Python SDK API를 간접적으로 호출할 수 있지만 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()
```

 **Boto3 API 직접 호출** 

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

# 특성 저장소를 통한 사기 탐지 예제 노트북
<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에서 이 노트북을 실행하는 것을 권장합니다.이 가이드의 코드는 개념적이며 복사할 경우 제대로 작동하지 않기 때문입니다.

다음을 사용하여 예시 노트북이 포함된 [aws/amazon-sagemaker-examples](https://github.com/aws/amazon-sagemaker-examples) GitHub 리포지토리를 복제합니다.
+ **Studio Classic의 경우**

  먼저 Studio Classic을 시작합니다. Studio 또는 Studio Classic이 기본 환경으로 활성화된 경우 Studio Classic을 열 수 있습니다. Studio Classic을 열려면 [Amazon SageMaker AI 콘솔을 사용하여 Amazon SageMaker Studio Classic 시작](studio-launch.md#studio-launch-console) 섹션을 참조하세요.

  [Amazon SageMaker Studio Classic에서 Git 리포지토리 복제](studio-tasks-git.md)의 단계에 따라 [aws/amazon-sagemaker-examples](https://github.com/aws/amazon-sagemaker-examples) GitHub 리포지토리를 Studio Classic에 복제합니다.
+ **Amazon SageMaker 노트북 인스턴스의 경우**

  먼저 [노트북 인스턴스에 액세스](howitworks-access-ws.md)의 지침에 따라 SageMaker 노트북 인스턴스를 시작합니다.

  그런 다음, [Amazon SageMaker AI 계정에 Git 리포지토리 추가](nbi-git-resource.md)의 지침을 따르세요.

이제 SageMaker AI 예시 노트북이 있으므로 `amazon-sagemaker-examples/sagemaker-featurestore` 디렉터리로 이동하여 [Fraud Detection with Amazon SageMaker Feature Store](https://sagemaker-examples.readthedocs.io/en/latest/sagemaker-featurestore/sagemaker_featurestore_fraud_detection_python_sdk.html) 예시 노트북을 엽니다.

## 1단계: Feature Store 세션 설정
<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)
```

예를 들어, 사기 탐지 예제에서 두 특성 그룹은 `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`을 사용하여 ID 특성과 트랜잭션 특성을 각각 로드하며, 이 함수는 각 데이터 열의 데이터 유형을 자동으로 감지합니다. 자동 탐지 대신 스키마를 사용하는 개발자의 경우, [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"])
```

사기 탐지 예제의 다음 코드는 생성 중인 두 특성 그룹 각각에 대한 최소 `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)
+ [하이브 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'},
...
```

### 하이브 DDL 명령 생성
<a name="feature-store-generate-hive-ddl-commands-feature-group"></a>

SageMaker Python SDK의 `FeatureStore`클래스는 하이브 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>

특성 저장소는 특성 그룹을 생성할 때 AWS Glue 데이터 카탈로그를 자동으로 빌드하며 원하는 경우이 기능을 끌 수 있습니다. 다음은 이 주제의 앞부분에서 만든 ID 및 트랜잭션 특성 그룹 모두의 특성 값을 사용하여 단일 훈련 데이터세트를 만드는 방법을 설명합니다. 또한 다음은 Amazon Athena 쿼리를 실행하여 ID 및 트랜잭션 특성 그룹 모두에서 오프라인 저장소에 저장된 데이터를 조인하는 방법을 설명합니다.

먼저 `athena_query()`를 ID 및 트랜잭션 특성 그룹 모두에 사용하여 Athena 쿼리를 생성합니다. `table\$1name`은 특성 저장소에서 자동으로 생성되는 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()
```

자세한 내용은 [Delete a feature group API](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DeleteFeatureGroup.html)를 참조하세요.