AWS Sagemaker:传递给 Estimator 的数据格式是什么?

AWS Sagemaker: What data format to pass to Estimator?

我正在关注 Sagemaker 的 k_nearest_neighbors_covtype 示例,并且对他们将训练数据传递给模型的方式有一些疑问。

对于那些没有看到它的人,他们从互联网加载数据,运行 一些预处理,然后以某种二进制格式 (protobuf/recordIO) 将其保存到 S3 存储桶中。他们的代码如下:

import numpy as np
import boto3
import os
import sagemaker
import io
import sagemaker.amazon.common as smac

# preprocess
raw_data_file = os.path.join(data_dir, "raw", "covtype.data.gz")
raw = np.loadtxt(raw_data_file, delimiter=',')

# split into train/test with a 90/10 split
np.random.seed(0)
np.random.shuffle(raw)
train_size = int(0.9 * raw.shape[0])
train_features = raw[:train_size, :-1]
train_labels = raw[:train_size, -1]
test_features = raw[train_size:, :-1]
test_labels = raw[train_size:, -1]

# write to buffer
buf = io.BytesIO()
smac.write_numpy_to_dense_tensor(buf, train_features, train_labels)
buf.seek(0)

# upload to s3
bucket = sagemaker.Session().default_bucket()
prefix = 'knn-blog-2018-04-17'
key = 'recordio-pb-data'

boto3.resource('s3').Bucket(bucket).Object(os.path.join(prefix, 'train', key)).upload_fileobj(buf)
s3_train_data = 's3://{}/{}/train/{}'.format(bucket, prefix, key)
print('uploaded training data location: {}'.format(s3_train_data))

稍后,在调用 model.fit() 时,他们将 S3 存储桶路径作为训练数据集传递。

我无法理解这个例子中的数据需要如何构建,我也想知道是否有更简单的方法直接从 pandas 数据帧加载数据。

我的问题:

假设在预处理后我有一个 pandas 数据帧,格式如下(~10k 条记录):

type         brown   green   red     yellow
NAME                                       
awfulbrown     0.00   33.33   33.33   33.33
candyapple     0.00    0.00  100.00    0.00
grannysmith    2.96   95.19    0.00    0.72

我想将其传递给最近的邻居,并根据 type(颜色)权重让它 map/cluster,每个点都用 NAME 标记。例如,点 candyapple 将位于 red 轴上的 100,greenyellow 上的 0.00。然后意图传递一组新的颜色坐标(例如 red: 90.09, yellow: 0.33, green: 9.58 将 return candyapple)和 return 到该点的单个最近邻居(那些最接近的近似值)我们存储在记录中的值)。

  1. 在将此数据帧传递给 Sagemaker 的 KNN 模型之前,我需要对其执行哪些进一步的预处理?

  2. 传递数据帧最简单的方法是什么?有没有办法直接传递给模型?

您不能将数据帧直接传递给内置的 KNN 算法。它支持两种输入训练格式:CSV 或 RecordIO protobuf:https://docs.aws.amazon.com/sagemaker/latest/dg/kNN-in-formats.html.

后者效率更高,推荐使用后者

在您的情况下,您只需要使用 to_numpy() 将数据框转换为 numpy 数组,然后您就可以在笔记本中重用代码。

import pandas as pd
index = [1, 2, 3, 4]
a = ['a', 'b', 'c', 'd']
b = [1, 2, 3, 4]
df = pd.DataFrame({'A': a, 'B': b}, index=index)
n = df.to_numpy()
print(n)
type(n)

您使用的笔记本实际上是在展示如何使用 KNN 进行分类。这个聚类例子可能更容易理解:https://data.solita.fi/machine-learning-building-blocks-in-aws-sagemaker/