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

1. Обзор

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

Что вы узнаете

Вы узнаете, как:

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

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

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

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

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

Перейдите в раздел «Модели платформы AI» в облачной консоли и нажмите «Включить», если она еще не включена.

d0d38662851c6af3.png

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

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

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

Перейдите в раздел «Блокноты AI Platform» в облачной консоли и нажмите «Новый экземпляр» . Затем выберите последний тип экземпляра Python :

a81c82876c6c16f9.png

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

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

Как только ваш экземпляр JupyterLab откроется, вам нужно будет добавить пакет XGBoost.

Для этого выберите Терминал в лаунчере:

28dcf2790ce77c96.png

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

pip3 install xgboost==0.82

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

Шаг 5. Импортируйте пакеты Python

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

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 в свой блокнот.

Мы будем использовать клиентскую библиотеку Python для BigQuery для загрузки данных в DataFrame Pandas. Исходный набор данных имеет размер 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. Развертывание модели на облачной платформе AI.

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

Шаг 1. Создайте корзину Cloud Storage для нашей модели.

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

Пока это работает, проверьте раздел моделей на консоли AI Platform. Вы должны увидеть там развертывание новой версии:

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

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

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