在 Cloud AI Platform 上构建、训练和部署 XGBoost 模型

1. 概览

在本实验中,您将了解如何在 GCP 上完成机器学习工作流。您将从 Cloud AI Platform Notebooks 环境中注入 BigQuery 公共数据集中的数据,构建和训练 XGBoost 模型,并将该模型部署到 AI Platform 以进行预测。

学习内容

您将了解如何:

  • 在 AI Platform Notebooks 中提取和分析 BigQuery 数据集
  • 构建 XGBoost 模型
  • 将 XGBoost 模型部署到 AI Platform 并获取预测结果

在 Google Cloud 上运行此实验的总费用约为 1 美元

2. 设置环境

您需要一个启用了结算功能的 Google Cloud Platform 项目才能运行此 Codelab。如需创建项目,请按照此处的 说明操作

第 1 步:启用 Cloud AI Platform Models API

前往 Cloud Console 的 AI Platform Models 部分,然后点击“启用”(如果尚未启用)。

d0d38662851c6af3.png

第 2 步:启用 Compute Engine API

前往 Compute Engine,然后选择 启用 (如果尚未启用)。您需要启用此 API 才能创建笔记本实例。

第 3 步:创建 AI Platform Notebooks 实例

前往 Cloud Console 的 AI Platform Notebooks 部分,然后点击 新建实例。然后选择最新的 Python 实例类型:

a81c82876c6c16f9.png

使用默认选项,然后点击创建 。创建实例后,选择打开 JupyterLab

第 4 步:安装 XGBoost

打开 JupyterLab 实例后,您需要添加 XGBoost 软件包。

为此,请从启动器中选择“终端”:

28dcf2790ce77c96.png

然后运行以下命令,安装 AI Platform 支持的最新版 XGBoost:

pip3 install xgboost==0.82

完成后,从启动器中打开 Python 3 笔记本实例。现在,您可以在笔记本中开始操作了!

第 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 提供了 许多公开数据集 供您探索。在本实验中,我们将使用 natality 数据集。该数据集包含美国近 40 年来的几乎所有出生数据,包括婴儿的出生体重以及婴儿父母的人口统计信息。我们将使用部分特征来预测婴儿的出生体重。

第 1 步:将 BigQuery 数据下载到笔记本

我们将使用适用于 BigQuery 的 Python 客户端库将数据下载到 Pandas DataFrame 中。原始数据集的大小为 21 GB,包含 1.23 亿行。为简单起见,我们将仅使用数据集中的 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()

这会显示数值列的均值、标准差、最小值和其他指标。最后,我们来获取一些有关布尔列的数据,该列指示婴儿的性别。我们可以使用 Pandas 的 value_counts 方法来完成此操作:

df['is_male'].value_counts()

看起来,该数据集按性别划分的比例几乎为 50/50。

4. 准备数据以用于训练

在本部分中,我们将把数据划分为训练集和测试集,以便为训练模型做准备。

第 1 步:提取标签列

首先,从数据集中删除包含 null 值的行,然后对数据进行随机排序:

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 步:将数据拆分为训练集和测试集

我们将使用 Scikit Learn 的 train_test_split 实用程序(我们在笔记本开头导入的实用程序)将数据拆分为训练集和测试集:

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

现在,我们可以构建和训练模型了!

5. XGBoost 快速入门

XGBoost 是一种机器学习框架,它使用 决策树梯度提升 来构建预测模型。它的工作原理是根据树中不同叶节点的相关分数将多个决策树集成在一起。

下图是集成树网络的简化可视化图,该网络用于评估某人是否喜欢特定的电脑游戏(来自 XGBoost 文档):

fb061cd8c8f69999.png

为什么我们为此模型使用 XGBoost?虽然传统神经网络在图像和文本等非结构化数据上的表现最好,但决策树在结构化数据(例如我们将在本 Codelab 中使用的抵押贷款数据集)上的表现通常非常好。

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. 将模型部署到 Cloud AI Platform

我们的模型可以在本地运行,但如果我们能够从任何位置(而不仅仅是此笔记本!)对其进行预测,那就更好了。在此步骤中,我们将模型部署到云端。

第 1 步:为模型创建 Cloud Storage 存储分区

首先,我们来定义一些环境变量,这些变量将在本 Codelab 的其余部分中使用。请使用您的 Google Cloud 云项目的名称、您要创建的 Cloud Storage 存储分区的名称(必须是全局唯一的)以及模型第一个版本的版本名称填写以下值:

# 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 步:将模型文件复制到 Cloud Storage

接下来,我们将 XGBoost 保存的模型文件复制到 Cloud Storage。运行以下 gsutil 命令:

!gsutil cp ./model.bst $MODEL_BUCKET

前往 Cloud Console 中的存储浏览器,确认文件已复制:

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. 清理

如果您想继续使用此笔记本,建议您在不使用时将其关闭。在 Cloud Console 的 Notebooks 界面中,选择笔记本,然后选择 停止

879147427150b6c7.png

如果您想删除在本实验中创建的所有资源,只需删除笔记本实例,而不是停止它。

使用 Cloud Console 中的导航菜单,浏览到“存储空间”,然后删除您创建的用于存储模型资产的两个存储分区。