В предыдущей статье мы получили доступ к данным, хранящимся в S3, из SageMaker и подготовили их для машинного обучения.

В этой статье демонстрируется применение линейной регрессии к данным.

Все данные, для которых будет применяться линейная регрессия, должны быть числовыми. Поскольку единственным нечисловым параметром является информация о дате, в качестве первого шага мы делаем информацию о дате числовой.

from sklearn.preprocessing import OrdinalEncoder
ord_enc = OrdinalEncoder()
model_data['data_numeric'] = ord_enc.fit_transform(model_data['date'])
model_data = model_data.drop(['date'], axis = 1)

Я всегда проверяю результат.

print(model_data)

Значение, для которого мы хотим получить оценку, — это среднесуточная температура, которая в этом наборе данных называется «mean_temp». Мы сохраняем данные в переменной X без столбца «mean_temp». Мы сохраняем столбец «mean_temp» в переменную Y. Мы конвертируем все значения в float32. Это связано с тем, что как текущие значения являются десятичными, так и получаемые оценочные значения также могут быть десятичными.

x = model_data.drop(['mean_temp'], axis = 1)
y = model_data['mean_temp']
x = np.array(x).astype('float32')
y = np.array(y).astype('float32')

Параметр должен быть оценен, а остальные данные должны быть разделены для машинного обучения. И следующий шаг — разделить их на данные для обучения и тестирования. Для линейной регрессии 70% данных зарезервировано для обучения и 30% для тестирования. Строки, которые будут распределены во время этого процесса, должны быть случайными. Использование библиотеки Python будет очень практичным.

from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(x, y, test_size = 0.30)

Мы создаем сеанс Sagemaker и определяем имя корзины и путь к файлу.

sagemaker_session = sagemaker.Session()
bucket = "our-first-training-project"
prefix = "linear-learner"

role = sagemaker.get_execution_role()
print(role)

Мы готовим файлы в S3 для использования в обучающих и тестовых данных и загружаем данные с помощью библиотеки Sagemaker boto3.

import io 
import sagemaker.amazon.common as smac 
import os

buf = io.BytesIO()
smac.write_numpy_to_dense_tensor(buf, X_train, y_train)
buf.seek(0) 

key = 'linear-train-data'
#Upload training data to S3
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))


buf = io.BytesIO() 
smac.write_numpy_to_dense_tensor(buf, X_test, y_test)
buf.seek(0)

#Upload test data to S3
key = 'linear-test-data'
boto3.resource('s3').Bucket(bucket).Object(os.path.join(prefix, 'test', key)).upload_fileobj(buf)
s3_test_data = 's3://{}/{}/test/{}'.format(bucket, prefix, key)
print('uploaded training data location: {}'.format(s3_test_data))

output_location = 's3://{}/{}/output'.format(bucket, prefix)
print('Training artifacts will be uploaded to: {}'.format(output_location))

Мы используем оценщик для генерации прогнозов.

from sagemaker.amazon.amazon_estimator import image_uris
container = image_uris.retrieve('linear-learner', boto3.Session().region_name)

linear = sagemaker.estimator.Estimator(container,
                                       role, 
                                       instance_count = 1, 
                                       instance_type = 'ml.c4.xlarge',
                                       output_path = output_location,
                                       sagemaker_session = sagemaker_session)

Обратите внимание на значение «feature_dim» здесь. Это значение должно быть равно количеству параметров, оставшихся после вычитания значения, которое вы хотите предсказать из ваших данных.

linear.set_hyperparameters(feature_dim = 9,
                           predictor_type = 'regressor',
                           mini_batch_size = 30,
                           epochs = 10,
                           #num_models = 10,
                           loss = 'absolute_loss')

Машинное обучение начинается с команды linear.fit. Обучение может занять несколько минут в зависимости от размера данных.

linear.fit({'train': s3_train_data})

Мы столкнулись с ошибкой «Найдены отсутствующие (NaN) значения». В данных не должно быть пропущенных значений для применения машинного обучения.

Чтобы очистить строки с отсутствующими значениями в данных, мы возвращаемся к шагу, где мы получили данные из S3, и запускаем следующий код.

model_data = model_data.dropna()

Повторяем все последующие шаги и при запуске команды linear.fit получаем результат как на изображении.

Мы готовим linear_regression для генерации прогнозов.

linear_regressor = linear.deploy(initial_instance_count = 1,
                                          instance_type = 'ml.m4.xlarge')

from sagemaker.predictor import csv_serializer, json_deserializer
linear_regressor.serializer = csv_serializer
linear_regressor.deserializer = json_deserializer

Мы графически отображаем сравнение расчетных значений, полученных с фактическими значениями. Тот факт, что точки расположены близко к оси x = y, свидетельствует о высокой точности предсказаний.

import matplotlib.pyplot as plt

result = linear_regressor.predict(X_test)
result #should be a JSON

#Iterate the result JSON to get an NP array of all the predictions so we can compare to Y test
predictions = np.array([res['score'] for res in result['predictions']])
predictions #should now be an numpy array

#Visualize how accurate predictions are relative to y_test
plt.scatter(y_test, predictions)

Поздравляем! Используя S3 и Sagemaker, вы научились применять машинное обучение к набору данных и наблюдать за сгенерированными прогнозами с помощью графиков.

Хорошо знать

Каждый раз, когда запускается машинное обучение, в файле, который мы указали в S3, создается новый подфайл.

Точность предсказаний также можно рассчитать разными способами. Вы можете просмотреть методы в среде AWS, чтобы применить другие методы машинного обучения или выполнить другие расчеты точности.

https://docs.aws.amazon.com/sagemaker/latest/dg/whatis.html

Вы также можете запускать методы, которых нет в документации AWS, в Sagemaker, написав собственный код и используя другие библиотеки.

Важное примечание: не забудьте остановить и удалить образцы, созданные вами в SageMaker, когда вы закончите свою работу. Пока они открыты, с вас будет взиматься плата.