

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# “Feature Store 简介”示例笔记本
<a name="feature-store-introduction-notebook"></a>

**重要**  
允许 Amazon SageMaker Studio 或 Amazon SageMaker Studio Classic 创建亚马逊 SageMaker资源的自定义 IAM 策略还必须授予向这些资源添加标签的权限。之所以需要为资源添加标签的权限，是因为 Studio 和 Studio Classic 会自动为创建的任何资源添加标签。如果 IAM 策略允许 Studio 和 Studio Classic 创建资源但不允许标记，则在尝试创建资源时可能会出现 AccessDenied “” 错误。有关更多信息，请参阅 [提供标记 A SageMaker I 资源的权限](security_iam_id-based-policy-examples.md#grant-tagging-permissions)。  
[AWS 亚马逊 A SageMaker I 的托管策略](security-iam-awsmanpol.md)授予创建 SageMaker 资源的权限已经包括在创建这些资源时添加标签的权限。

本页上的示例代码是指 [Feature Store 简介](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 的说明，请参阅 [使用亚马逊 A SageMaker I 控制台启动 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 经典版中克隆 Git 存储库](studio-tasks-git.md)
+ **适用于 Amazon SageMaker 笔记本实例**

  按照中的说明启动 SageMaker 笔记本实例[访问笔记本实例](howitworks-access-ws.md)。

现在，您已拥有 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>

要开始使用功能存储，请创建 A SageMaker I 会话。然后，设置要用于功能的 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/zh_cn/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)
```

下面调用 `create` 分别创建两个特征组 `customers_feature_group` 和 `orders_feature_group`：

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

```
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 适用于 Python (Boto3) 的 AWS SDK，请使用 `ingest` API 调用。如果您使用的是 Python SDK (Boto3)，那么请使用 `PutRecord` API。应用程序接口。这两个选项都只需不到 1 分钟就能摄取数据。此示例使用适用于 Python 的 SageMaker AI SDK (Boto3)，因此它使用了 API 调用：`ingest`

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

在本示例笔记本中，您将学习如何开始使用特征存放区、创建特征组并将数据导入其中。

有关如何将特征存放区用于欺诈检测使用场景的高级示例，请参阅[使用特征存放区进行欺诈检测](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 调用，而要调用 Boto3 中存在的 API 调用，则必须先通过 Boto3 和 SageMaker AI 会话访问 Boto3 客户端：例如。`sagemaker_session.boto_session.client()`

以下是本笔记本的 API 调用列表。这些调用存在于 SDK for Python 中，也存在于 Boto3 中，供您参考：

 **SDK for Python (Boto3) API Calls** 

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

 **Boto3 API 调用** 

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