在 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 控制台的 AI Platform 模型部分,然后点击“启用”(如果尚未启用)。

d0d38662851c6af3.png

第 2 步:启用 Compute Engine API

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

第 3 步:创建 AI Platform Notebooks 实例

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

a81c82876c6c16f9.png

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

第 4 步:安装 XGBoost

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

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

28dcf2790ce77c96

然后运行以下命令,安装 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 已公开提供许多数据集,供您探索。在本实验中,我们将使用出生率数据集。其中包含美国 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()

其中显示了数字列的平均、标准差、最小值及其他指标。最后,让我们在指示婴儿性别的布尔值列中获取一些数据。我们可以通过 Pandasvalue_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 控制台中的存储浏览器,确认文件已复制:

31e2567fa0117214

第 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 控制台的 Notebooks 界面中,选择相应笔记本,然后选择停止

879147427150b6c7

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

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