AWS Sagemaker: Какой формат данных передать в Оценщик? - PullRequest
0 голосов
/ 22 января 2020

Я следую примеру k_nearest_neighbors_covtype Sagemaker и у меня возникли вопросы о том, как они передают свои тренировочные данные в модель.

Для тех, кто их не видел, они загружают данные из inte rnet, запустите некоторую предварительную обработку, затем сохраните ее в корзину S3 в некотором двоичном формате (protobuf / recordIO). Их код выглядит следующим образом:

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 dataframe.

Мой вопрос:

Давайте скажем, после предварительной обработки у меня есть pandas фрейм данных в следующем формате (~ 10 тыс. записей):

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 (цвет ) веса, с каждой точкой, помеченной NAME. Например, точка candyapple будет расположена на 100 на оси red, на 0,00 на green и yellow. Намерение затем передать новый набор цветовых координат (например, red: 90.09, yellow: 0.33, green: 9.58 вернет candyapple) и вернуть единственного ближайшего соседа к этой точке (самое близкое приближение тех значений, которые мы сохранили в наших записях).

  1. Какую дополнительную предварительную обработку мне нужно выполнить на этом фрейме данных, прежде чем передать его в модель KNN Sagemaker?

  2. Что самый простой способ передачи данных? Есть ли способ передать его непосредственно на модель?

1 Ответ

1 голос
/ 23 января 2020

Нельзя передавать данные непосредственно во встроенный KNN al go. Он поддерживает два формата обучения ввода: CSV или протокол записи RecordIO: https://docs.aws.amazon.com/sagemaker/latest/dg/kNN-in-formats.html.

Последний более эффективен, поэтому мы рекомендуем его.

В вашем В этом случае вам просто нужно преобразовать ваш фрейм данных в массив numpy с помощью to_ 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/

...