Создайте, обучите и разверните модель XGBoost на платформе Cloud AI.

1. Обзор

В этой лабораторной работе вы пройдете полный рабочий процесс машинного обучения на платформе GCP. В среде Cloud AI Platform Notebooks вы будете загружать данные из общедоступного набора данных BigQuery, создавать и обучать модель XGBoost, а затем развертывать модель на платформе AI Platform для прогнозирования.

Чему вы научитесь

Вы научитесь:

  • Загрузка и анализ набора данных BigQuery в блокнотах AI Platform.
  • Создайте модель XGBoost.
  • Разверните модель XGBoost на платформе искусственного интеллекта и получайте прогнозы.

Общая стоимость запуска этой лабораторной работы в Google Cloud составляет около 1 доллара .

2. Настройте свою среду.

Для выполнения этого практического задания вам потребуется проект Google Cloud Platform с включенной функцией оплаты. Чтобы создать проект, следуйте инструкциям здесь .

Шаг 1: Включите API моделей облачной платформы ИИ.

Перейдите в раздел «Модели платформы ИИ» в консоли Cloud Console и нажмите «Включить», если эта функция еще не включена.

d0d38662851c6af3.png

Шаг 2: Включите API Compute Engine.

Перейдите в Compute Engine и выберите «Включить», если эта опция еще не включена. Она понадобится для создания экземпляра ноутбука.

Шаг 3: Создайте экземпляр AI Platform Notebooks.

Перейдите в раздел «Блокноты платформы ИИ» в консоли Cloud и нажмите «Создать экземпляр» . Затем выберите последний тип экземпляра Python :

a81c82876c6c16f9.png

Используйте параметры по умолчанию, а затем нажмите «Создать ». После создания экземпляра выберите «Открыть JupyterLab» :

Шаг 4: Установите XGBoost

После запуска экземпляра JupyterLab вам потребуется добавить пакет XGBoost.

Для этого выберите «Терминал» в меню запуска:

28dcf2790ce77c96.png

Затем выполните следующие действия, чтобы установить последнюю версию XGBoost, поддерживаемую платформой искусственного интеллекта:

pip3 install xgboost==0.82

После завершения этого процесса откройте экземпляр Python 3 Notebook из панели запуска. Теперь вы готовы начать работу в своем блокноте!

Шаг 5: Импорт пакетов Python

В первой ячейке вашего блокнота добавьте следующие импорты и запустите ячейку. Вы можете запустить её, нажав кнопку со стрелкой вправо в верхнем меню или нажав комбинацию клавиш Command+Enter:

import pandas as pd
import xgboost as xgb
import numpy as np

from sklearn.model_selection import train_test_split
from sklearn.utils import shuffle
from google.cloud import bigquery

3. Изучение набора данных BigQuery

BigQuery предоставил множество общедоступных наборов данных для изучения. Для этой лабораторной работы мы будем использовать набор данных о рождаемости . Он содержит данные почти о каждом рождении в США за 40-летний период, включая вес ребенка при рождении и демографическую информацию о родителях ребенка. Мы будем использовать подмножество этих данных для прогнозирования веса ребенка при рождении.

Шаг 1: Загрузите данные BigQuery в наш ноутбук.

Для загрузки данных в DataFrame Pandas мы будем использовать клиентскую библиотеку Python для BigQuery. Исходный набор данных имеет размер 21 ГБ и содержит 123 миллиона строк. Для простоты мы будем использовать только 10 000 строк из набора данных.

Сформируйте запрос и просмотрите полученный DataFrame с помощью следующего кода. Здесь мы получаем 4 признака из исходного набора данных, а также вес ребенка (то, что будет предсказывать наша модель). Набор данных охватывает много лет, но для этой модели мы будем использовать только данные после 2000 года:

query="""
SELECT
  weight_pounds,
  is_male,
  mother_age,
  plurality,
  gestation_weeks
FROM
  publicdata.samples.natality
WHERE year > 2000
LIMIT 10000
"""
df = bigquery.Client().query(query).to_dataframe()
df.head()

Чтобы получить сводку числовых характеристик в нашем наборе данных, выполните следующую команду:

df.describe()

Здесь отображаются среднее значение, стандартное отклонение, минимум и другие показатели для наших числовых столбцов. Наконец, давайте получим данные для нашего логического столбца, указывающего пол ребенка. Мы можем сделать это с помощью метода value_counts из библиотеки Pandas:

df['is_male'].value_counts()

Похоже, что в наборе данных гендерный баланс практически одинаков (50/50).

4. Подготовьте данные для обучения.

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

Шаг 1: Извлеките столбец с метками.

Сначала удалите из набора данных строки с нулевыми значениями и перемешайте данные:

df = df.dropna()
df = shuffle(df, random_state=2)

Далее, вынесите столбец с метками в отдельную переменную и создайте DataFrame, содержащий только наши признаки:

labels = df['weight_pounds']
data = df.drop(columns=['weight_pounds'])

Теперь, если вы просмотрите наш набор данных, запустив data.head() , вы увидите четыре признака, которые мы будем использовать для обучения.

Шаг 2: Преобразуйте категориальные признаки в целые числа.

Поскольку XGBoost требует, чтобы все данные были числовыми, нам нужно изменить способ представления данных в столбце is_male , который в настоящее время представляет собой строки True/False. Мы можем сделать это, просто изменив тип этого столбца:

data['is_male'] = data['is_male'].astype(int)

Шаг 3: Разделите данные на обучающую и тестовую выборки.

Для разделения данных на обучающую и тестовую выборки мы воспользуемся утилитой train_test_split из библиотеки Scikit Learn, которую мы импортировали в начале блокнота:

x,y = data,labels
x_train,x_test,y_train,y_test = train_test_split(x,y)

Теперь мы готовы создать и обучить нашу модель!

5. Краткое введение в XGBoost.

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

Приведённая ниже диаграмма представляет собой упрощённую визуализацию ансамблевой древовидной сети для модели, которая оценивает, понравится ли кому-либо определённая компьютерная игра (это из документации XGBoost ):

fb061cd8c8f69999.png

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

6. Создайте, обучите и оцените модель XGBoost.

Шаг 1: Определить и обучить модель XGBoost.

Создать модель в XGBoost очень просто. Для этого мы будем использовать класс XGBRegressor , и нам нужно лишь передать правильный objective параметр для нашей конкретной задачи. Здесь мы используем модель регрессии, поскольку прогнозируем числовое значение (вес ребенка). Если бы мы вместо этого разделяли данные на группы, чтобы определить, весит ли ребенок больше или меньше 6 фунтов, мы бы использовали модель классификации.

В данном случае мы будем использовать reg:squarederror в качестве целевой функции нашей модели.

Следующий код создаст модель XGBoost:

model = xgb.XGBRegressor(
    objective='reg:linear'
)

Вы можете обучить модель всего одной строкой кода, вызвав метод fit() и передав ему обучающие данные и метки.

model.fit(x_train, y_train)

Шаг 2: Оцените свою модель на тестовых данных.

Теперь мы можем использовать нашу обученную модель для генерации прогнозов на тестовых данных с помощью функции predict() :

y_pred = model.predict(x_test)

Давайте посмотрим, как модель показала себя на первых 20 значениях из нашего тестового набора. Ниже мы выведем прогнозируемый вес ребенка вместе с фактическим весом ребенка для каждого тестового примера:

for i in range(20):
    print('Predicted weight: ', y_pred[i])
    print('Actual weight: ', y_test.iloc[i])
    print()

Шаг 3: Сохраните свою модель

Для развертывания модели выполните следующий код, чтобы сохранить ее в локальный файл:

model.save_model('model.bst')

7. Разверните модель на облачной платформе искусственного интеллекта.

Наша модель работает локально, но было бы здорово, если бы мы могли делать прогнозы из любого места (а не только из этого ноутбука!). На этом этапе мы развернем ее в облаке.

Шаг 1: Создайте сегмент облачного хранилища для нашей модели.

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

# Update these to your own GCP project, model, and version names
GCP_PROJECT = 'your-gcp-project'
MODEL_BUCKET = 'gs://storage_bucket_name'
VERSION_NAME = 'v1'
MODEL_NAME = 'baby_weight'

Теперь мы готовы создать хранилище для файла нашей модели XGBoost. При развертывании мы укажем платформе Cloud AI Platform на этот файл.

Выполните следующую команду gsutil в своем ноутбуке, чтобы создать корзину:

!gsutil mb $MODEL_BUCKET

Шаг 2: Скопируйте файл модели в облачное хранилище.

Далее мы скопируем сохраненный файл модели XGBoost в облачное хранилище. Выполните следующую команду gsutil:

!gsutil cp ./model.bst $MODEL_BUCKET

Перейдите в браузер хранилища в вашей облачной консоли, чтобы убедиться, что файл скопирован:

31e2567fa0117214.png

Шаг 3: Создайте и разверните модель.

Следующая команда ai-platform gcloud создаст новую модель в вашем проекте. Мы назовем ее xgb_mortgage :

!gcloud ai-platform models create $MODEL_NAME

Теперь пришло время развернуть модель. Мы можем сделать это с помощью следующей команды gcloud:

!gcloud ai-platform versions create $VERSION_NAME \
--model=$MODEL_NAME \
--framework='XGBOOST' \
--runtime-version=1.15 \
--origin=$MODEL_BUCKET \
--python-version=3.7 \
--project=$GCP_PROJECT

Пока процесс выполняется, проверьте раздел «Модели» в консоли вашей платформы ИИ. Вы должны увидеть там развертывание вашей новой версии:

a431661f9c3e6cb2.png

После успешного завершения развертывания вы увидите зеленую галочку на месте индикатора загрузки. Развертывание должно занять 2-3 минуты .

Шаг 4: Тестирование развернутой модели

Чтобы убедиться в работоспособности развернутой модели, протестируйте ее с помощью gcloud для выполнения прогнозирования. Сначала сохраните JSON-файл с двумя примерами из нашего тестового набора:

%%writefile predictions.json
[0.0, 33.0, 1.0, 27.0]
[1.0, 26.0, 1.0, 40.0]

Протестируйте свою модель, сохранив вывод следующей команды gcloud в переменную и распечатав его:

prediction = !gcloud ai-platform predict --model=$MODEL_NAME --json-instances=predictions.json --version=$VERSION_NAME
print(prediction.s)

В выходных данных вы должны увидеть предсказание вашей модели. Фактический вес ребенка в этих двух примерах составляет 1,9 и 8,1 фунта соответственно.

8. Уборка

Если вы хотите продолжить использование этого блокнота, рекомендуется выключать его, когда он не используется. В интерфейсе блокнотов в вашей облачной консоли выберите блокнот, а затем выберите «Остановить» :

879147427150b6c7.png

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

В консоли Cloud Console, используя меню навигации, перейдите в раздел «Хранилище» и удалите оба сегмента, созданных для хранения ресурсов вашей модели.