Создание, обучение и развертывание моделей машинного обучения

с помощью Amazon SageMaker

Из этого руководства вы узнаете, как использовать Amazon SageMaker для создания, обучения и развертывания модели машинного обучения. Для этого упражнения мы воспользуемся популярным алгоритмом машинного обучения XGBoost. Amazon SageMaker – это полностью управляемый модульный сервис машинного обучения, который помогает разработчикам и специалистам по работе с данными создавать, обучать и развертывать модели машинного обучения в любом масштабе.

Процесс создания моделей машинного обучения от составления концепции до внедрения в рабочую среду обычно сложен и занимает много времени. Необходимо управлять большими объемами данных для обучения модели, выбрать оптимальный алгоритм, контролировать вычислительные ресурсы во время обучения, а затем развернуть модель в рабочей среде. Amazon SageMaker снижает сложность, значительно упрощая создание и развертывание моделей машинного обучения. После выбора подходящих алгоритмов и платформ из широкого ассортимента этот сервис управляет всей базовой инфраструктурой, чтобы обучить модель с помощью нескольких петабайтов данных и развернуть ее в рабочей среде.

В этом примере вы берете на себя обязанности разработчика решений машинного обучения, который работает на банк. Вам была поручена разработка модели машинного обучения, которая прогнозирует, будет ли клиент регистрироваться для получения депозитного сертификата (CD). Модель будет обучена по набору маркетинговых данных, содержащему демографическую информацию о клиентах, отзывы о маркетинговых мероприятиях и сведения о внешних факторах.

Данные маркированы для вашего удобства, а в отдельном столбце набора данных указывается, зарегистрирован ли клиент для получения банковского продукта. Версия этого набора данных находится в открытом доступе в репозитории машинного обучения, курируемом Калифорнийским университетом в Ирвайне. В этом руководстве описывается реализация контролируемой модели машинного обучения, так как данные маркированы. (Неконтролируемое обучение выполняется, если наборы данных не маркированы.)

В этом руководстве рассматриваются следующие темы:

  1. Создание инстанса блокнота
  2. Подготовка данных
  3. Настройка модели для обучения на данных
  4. Развертывание модели
  5. Оценка производительности модели машинного обучения
 
Ресурсы, создаваемые и используемые в этом руководстве, поддерживаются на уровне бесплатного пользования AWS. Не забудьте выполнить действия с шага 7 и удалить ресурсы. Если ваш аккаунт активно использовал эти ресурсы дольше двух месяцев, с него будет взята плата на сумму менее 0,50 USD.
 

Для работы с этим руководством необходим аккаунт AWS

Ресурсы, которые вы создаете в рамках обучения по этому пособию, доступны для уровня бесплатного пользования. 

Подробнее об уровне бесплатного пользования >>


Шаг 1. Вход в консоль Amazon SageMaker

Откройте консоль Amazon SageMaker.


Щелкните здесь, и в новом окне откроется Консоль управления AWS. При этом пошаговое руководство останется открытым. Начните вводить SageMaker в строке поиска и выберите Amazon SageMaker, чтобы открыть консоль сервиса.

build-train-deploy-machine-learning-model-sagemaker-1

(Щелкните, чтобы увеличить изображение.)


Шаг 2. Создание инстанса блокнота Amazon SageMaker

На этом этапе мы создадим инстанс блокнота Amazon SageMaker. 


2a. На панели управления Amazon SageMaker выберите Notebook instances (Инстансы блокнотов). 

build-train-deploy-machine-learning-model-sagemaker-2a

(Щелкните, чтобы увеличить изображение.)


2b. На странице Create notebook instance (Создание инстанса блокнота) введите имя в поле Notebook instance name (Имя инстанса блокнота). В этом руководстве используется имя инстанса MySageMakerInstance, но вы можете указать другое.

В данном примере можно оставить в поле Notebook instance type (Тип инстанса блокнота) выбранный по умолчанию тип ml.t2.medium.

Чтобы инстанс блокнота мог считывать и безопасно загружать данные в Amazon S3, необходимо указать роль IAM. В поле IAM role (Роль IAM) выберите Create a new role (Создать новую роль), чтобы сервис Amazon SageMaker создал роль с необходимыми разрешениями и назначил ее вашему инстансу. Вы также можете выбрать для этой цели имеющуюся роль IAM из своего аккаунта.

build-train-deploy-machine-learning-model-sagemaker-2b

(Щелкните, чтобы увеличить изображение.)


2c. В поле Create an IAM role (Создать роль IAM) выберите пункт Any S3 bucket (Любая корзина S3). Благодаря этому инстанс Amazon SageMaker получит доступ ко всем корзинам S3 в вашем аккаунте. Далее в этом руководстве описывается создание новой корзины S3. Однако если у вас уже есть корзина, которую вы хотите использовать, выберите пункт Specific S3 buckets (Определенные корзины S3) и укажите ее имя.

Выберите Создать роль.

build-train-deploy-machine-learning-model-sagemaker-2c

(Щелкните, чтобы увеличить изображение.)


2d. Обратите внимание, что сервис Amazon SageMaker автоматически создал роль под названием AmazonSageMaker-ExecutionRole-***.

Для этого примера мы оставим в других полях значения по умолчанию. Нажмите Create notebook instance (Создать инстанс блокнота).

build-train-deploy-machine-learning-model-sagemaker-2d

(Щелкните, чтобы увеличить изображение.)


2e. На странице Notebook instances (Инстансы блокнотов) должен появиться новый инстанс блокнота MySageMakerInstance со статусом Pending (Ожидает).

Он должен измениться с Pending (Ожидает) на InService (Работает) менее чем за две минуты.

build-train-deploy-machine-learning-model-sagemaker-2e

(Щелкните, чтобы увеличить изображение.)


Шаг 3. Подготовка данных

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


3a. Подождите, пока состояние инстанса MySageMakerInstance на странице Notebook instances (Инстансы блокнотов) не изменится с Pending (Ожидает) на InService (Работает).

Когда состояние изменится на InService, выберите инстанс MySageMakerInstance и откройте его с помощью раскрывающегося меню Actions (Действия) или нажмите Open Jupyter (Открыть Jupyter) рядом с надписью InService.

build-train-deploy-machine-learning-model-sagemaker-3a

(Щелкните, чтобы увеличить изображение.)

build-train-deploy-machine-learning-model-sagemaker-3a1

(Щелкните, чтобы увеличить изображение.)


3b. Когда откроется Jupyter, на вкладке Files (Файлы) нажмите New (Создать), а затем – conda_python3

build-train-deploy-machine-learning-model-sagemaker-3b

(Щелкните, чтобы увеличить изображение.)


3c. Чтобы подготовить данные, обучить модель машинного обучения и развернуть ее, необходимо импортировать некоторые библиотеки и определить несколько переменных в среде блокнотов Jupyter. Скопируйте приведенный ниже код в соответствующую ячейку инстанса и нажмите Run (Запустить).

Во время выполнения кода отображается символ * в квадратных скобках, как показано на первом снимке экрана справа. Спустя несколько секунд выполнение кода будет завершено, а символ * изменится на цифру 1, и вы увидите сообщение об успешном выполнении, как показано на втором снимке экрана справа. 

# import libraries
import boto3, re, sys, math, json, os, sagemaker, urllib.request
from sagemaker import get_execution_role
import numpy as np                                
import pandas as pd                               
import matplotlib.pyplot as plt                   
from IPython.display import Image                 
from IPython.display import display               
from time import gmtime, strftime                 
from sagemaker.predictor import csv_serializer   

# Define IAM role
role = get_execution_role()
prefix = 'sagemaker/DEMO-xgboost-dm'
containers = {'us-west-2': '433757028032.dkr.ecr.us-west-2.amazonaws.com/xgboost:latest',
              'us-east-1': '811284229777.dkr.ecr.us-east-1.amazonaws.com/xgboost:latest',
              'us-east-2': '825641698319.dkr.ecr.us-east-2.amazonaws.com/xgboost:latest',
              'eu-west-1': '685385470294.dkr.ecr.eu-west-1.amazonaws.com/xgboost:latest'} # each region has its XGBoost container
my_region = boto3.session.Session().region_name # set the region of the instance
print("Success - the MySageMakerInstance is in the " + my_region + " region. You will use the " + containers[my_region] + " container for your SageMaker endpoint.")
build-train-deploy-machine-learning-model-sagemaker-3c-1

(Щелкните, чтобы увеличить изображение.)

build-train-deploy-machine-learning-model-sagemaker-3c-2

(Щелкните, чтобы увеличить изображение.)


3d. На этом этапе мы создадим корзину S3, в которой будут храниться данные для этого учебного пособия.

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

Нажмите Run (Запустить). Если сообщение об успешном выполнении не появляется, измените имя корзины и повторите попытку.

 

bucket_name = 'your-s3-bucket-name' # <--- CHANGE THIS VARIABLE TO A UNIQUE NAME FOR YOUR BUCKET
s3 = boto3.resource('s3')
try:
    if  my_region == 'us-east-1':
      s3.create_bucket(Bucket=bucket_name)
    else: 
      s3.create_bucket(Bucket=bucket_name, CreateBucketConfiguration={ 'LocationConstraint': my_region })
    print('S3 bucket created successfully')
except Exception as e:
    print('S3 error: ',e)
build-train-deploy-machine-learning-model-sagemaker-3d

(Щелкните, чтобы увеличить изображение.)


3e. Теперь необходимо скачать данные в инстанс Amazon SageMaker и загрузить их в кадр данных. Скопируйте и запустите следующий код:

try:
  urllib.request.urlretrieve ("https://d1.awsstatic.com/tmt/build-train-deploy-machine-learning-model-sagemaker/bank_clean.27f01fbbdf43271788427f3682996ae29ceca05d.csv", "bank_clean.csv")
  print('Success: downloaded bank_clean.csv.')
except Exception as e:
  print('Data load error: ',e)

try:
  model_data = pd.read_csv('./bank_clean.csv',index_col=0)
  print('Success: Data loaded into dataframe.')
except Exception as e:
    print('Data load error: ',e)
build-train-deploy-machine-learning-model-sagemaker-3e

(Щелкните, чтобы увеличить изображение.)


3f. Теперь мы перемешаем данные и разделим их на учебные и тестовые данные.

Учебные данные (70 % клиентов) будут использоваться в цикле обучения модели. Мы воспользуемся градиентной оптимизацией для итеративного уточнения параметров модели. Градиентная оптимизация – это способ определения параметров модели, которые сведут к минимуму количество ошибок, с использованием градиента функции потерь для этой модели.

Тестовые данные (остальные 30 % клиентов) будут использоваться для оценки производительности модели и определения того, насколько применима обученная модель к неизученным данным.

Скопируйте приведенный ниже код в новую ячейку кода и нажмите Run (Запустить), чтобы перемешать и разделить данные.

train_data, test_data = np.split(model_data.sample(frac=1, random_state=1729), [int(0.7 * len(model_data))])
print(train_data.shape, test_data.shape)
build-train-deploy-machine-learning-model-sagemaker-3f

(Щелкните, чтобы увеличить изображение.)


Шаг 4. Обучение модели по данным

На этом этапе мы обучим модель, используя набор учебных данных. 


4a. Чтобы использовать встроенную в Amazon SageMaker модель XGBoost, необходимо изменить формат заголовка и первого столбца учебных данных, а затем загрузить данные из корзины S3.

Скопируйте приведенный ниже код в новую ячейку кода и нажмите Run (Запустить), чтобы переформатировать и загрузить данные.

pd.concat([train_data['y_yes'], train_data.drop(['y_no', 'y_yes'], axis=1)], axis=1).to_csv('train.csv', index=False, header=False)
boto3.Session().resource('s3').Bucket(bucket_name).Object(os.path.join(prefix, 'train/train.csv')).upload_file('train.csv')
s3_input_train = sagemaker.s3_input(s3_data='s3://{}/{}/train'.format(bucket_name, prefix), content_type='csv')

4b. Теперь необходимо настроить сеанс Amazon SageMaker, создать инстанс модели XGBoost (средства прогнозирования) и определить гиперпараметры модели. Скопируйте приведенный ниже код в новую ячейку кода и нажмите Run (Запустить).

sess = sagemaker.Session()
xgb = sagemaker.estimator.Estimator(containers[my_region],role, train_instance_count=1, train_instance_type='ml.m4.xlarge',output_path='s3://{}/{}/output'.format(bucket_name, prefix),sagemaker_session=sess)
xgb.set_hyperparameters(max_depth=5,eta=0.2,gamma=4,min_child_weight=6,subsample=0.8,silent=0,objective='binary:logistic',num_round=100)

4c. Загрузив данные и настроив средство прогнозирования XGBoost, обучите модель методом градиентной оптимизации в инстансе ml.m4.xlarge, скопировав приведенный ниже код в следующую ячейку кода и нажав кнопку Run (Запустить).

Через несколько минут должны появиться генерируемые журналы обучения.

xgb.fit({'train': s3_input_train})
build-train-deploy-machine-learning-model-sagemaker-4c

(Щелкните, чтобы увеличить изображение.)


Шаг 5. Развертывание модели

На этом этапе мы развернем обученную модель по нужному адресу, переформатируем и загрузим данные CSV, а затем запустим модель для формирования прогнозов.


5a. Чтобы развернуть модель на сервере и создать доступный адрес, скопируйте приведенный ниже код в следующую ячейку кода и нажмите кнопку Run (Запустить).

xgb_predictor = xgb.deploy(initial_instance_count=1,instance_type='ml.m4.xlarge')
build-train-deploy-machine-learning-model-sagemaker-5a

(Щелкните, чтобы увеличить изображение.)


5b. Для прогнозирования того, зарегистрированы ли клиенты из тестовых данных для получения банковского продукта, скопируйте приведенный ниже код в следующую ячейку кода и нажмите кнопку Run (Запустить).

test_data_array = test_data.drop(['y_no', 'y_yes'], axis=1).values #load the data into an array
xgb_predictor.content_type = 'text/csv' # set the data type for an inference
xgb_predictor.serializer = csv_serializer # set the serializer type
predictions = xgb_predictor.predict(test_data_array).decode('utf-8') # predict!
predictions_array = np.fromstring(predictions[1:], sep=',') # and turn the prediction into an array
print(predictions_array.shape)
build-train-deploy-machine-learning-model-sagemaker-5b

(Щелкните, чтобы увеличить изображение.)


Шаг 6. Оценка производительности модели

На этом этапе мы оценим производительность и точность модели машинного обучения.


6a. Скопируйте и вставьте приведенный ниже код и нажмите кнопку Run (Запустить), чтобы сравнить фактические значения с прогнозируемыми в таблице, называемой матрицей несоответствий.

С учетом прогнозов можно сделать следующие выводы: мы точно предсказали, что клиент зарегистрируется для получения депозитного сертификата, в 90 % случаев из тестовых данных с точностью 65 % (278/429) для зарегистрированных и 90 % (10 785 / 11 928) для незарегистрированных клиентов.

cm = pd.crosstab(index=test_data['y_yes'], columns=np.round(predictions_array), rownames=['Observed'], colnames=['Predicted'])
tn = cm.iloc[0,0]; fn = cm.iloc[1,0]; tp = cm.iloc[1,1]; fp = cm.iloc[0,1]; p = (tp+tn)/(tp+tn+fp+fn)*100
print("\n{0:<20}{1:<4.1f}%\n".format("Overall Classification Rate: ", p))
print("{0:<15}{1:<15}{2:>8}".format("Predicted", "No Purchase", "Purchase"))
print("Observed")
print("{0:<15}{1:<2.0f}% ({2:<}){3:>6.0f}% ({4:<})".format("No Purchase", tn/(tn+fn)*100,tn, fp/(tp+fp)*100, fp))
print("{0:<16}{1:<1.0f}% ({2:<}){3:>7.0f}% ({4:<}) \n".format("Purchase", fn/(tn+fn)*100,fn, tp/(tp+fp)*100, tp))
build-train-deploy-machine-learning-model-sagemaker-6a

(Щелкните, чтобы увеличить изображение.)


Шаг 7. Удаление ресурсов

На этом этапе мы удалим ресурсы, связанные с Amazon SageMaker.

Важно! Удаление неиспользуемых ресурсов сокращает расходы и является рекомендованной мерой. Если не удалить ресурсы, может взиматься дополнительная плата.


7a. Чтобы удалить адрес Amazon SageMaker и объекты из корзины S3, скопируйте, вставьте и запустите следующий код:  

sagemaker.Session().delete_endpoint(xgb_predictor.endpoint)
bucket_to_delete = boto3.resource('s3').Bucket(bucket_name)
bucket_to_delete.objects.all().delete()
build-train-deploy-machine-learning-model-sagemaker-7a

(Щелкните, чтобы увеличить изображение.)


Поздравляем!

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


 

Подробнее

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

Больше информации

Вы можете использовать машинное обучение с автоматической настройкой моделей в Amazon SageMaker. Это дает возможность автоматически настраивать гиперпараметры в моделях для получения наилучших результатов. Ознакомьтесь с документацией по автоматической настройке моделей и этой записью блога, чтобы подробнее изучить эту возможность. 

Решение в действии

Для Amazon SageMaker доступны примеры блокнотов, которые иллюстрируют многие распространенные сценарии использования машинного обучения. Их можно найти на сайте GitHub.


Была ли полезной информация, представленная в этом учебном пособии?