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 模型部分,然后点击“启用”(如果尚未启用)。
第 2 步:启用 Compute Engine API
前往 Compute Engine,然后选择启用(如果尚未启用)。您需要用它来创建笔记本实例。
第 3 步:创建 AI Platform Notebooks 实例
前往 Cloud 控制台的 AI Platform Notebooks 部分,然后点击新建实例。然后选择最新的 Python 实例类型:
使用默认选项,然后点击创建。创建实例后,选择打开 JupyterLab:
第 4 步:安装 XGBoost
打开 JupyterLab 实例后,您需要添加 XGBoost 软件包。
为此,请从启动器中选择终端:
然后运行以下命令,安装 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 文档):
为什么要为此模型使用 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 控制台中的存储浏览器,确认文件已复制:
第 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 控制台的模型部分。您应该会看到新版本正在部署中:
部署成功完成后,您将在加载旋转图标的位置看到一个绿色的对勾标记。部署过程将需要 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 界面中,选择相应笔记本,然后选择停止:
如果您想删除在本实验中创建的所有资源,只需删除该笔记本实例,而无需停止该实例。
使用 Cloud 控制台中的导航菜单,浏览到“存储空间”,然后删除您为存储模型资产而创建的两个存储分区。