В предыдущей статье мы получили доступ к данным, хранящимся в 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, когда вы закончите свою работу. Пока они открыты, с вас будет взиматься плата.