1. 概览
本实验将引导您了解 AI Platform Notebooks 中的各种工具,以便探索数据和制作机器学习模型原型。
学习内容
您将了解如何:
- 创建和自定义 AI Platform Notebooks 实例
- 使用直接集成到 AI Platform Notebooks 中的 git 跟踪笔记本代码
- 在笔记本中使用 What-If 工具
在 Google Cloud 上运行此实验的总费用约为 1 美元 。如需了解 AI Platform Notebooks 价格的完整详情,请点击 此处。
2. 创建 AI Platform Notebooks 实例
您需要一个启用了结算功能的 Google Cloud Platform 项目才能运行此 Codelab。如需创建项目,请按照此处的 说明操作。
第 2 步:启用 Compute Engine API
前往 Compute Engine,然后选择 启用 (如果尚未启用)。您需要此 API 才能创建笔记本实例。
第 3 步:创建笔记本实例
前往 Cloud Console 的 AI Platform Notebooks 部分,然后点击 新建实例。然后,选择最新的 TensorFlow 2 企业版 实例类型 (不带 GPU):

为实例命名或使用默认名称。然后,我们将探索自定义选项。点击自定义 按钮:

AI Platform Notebooks 具有许多不同的自定义选项,包括:实例部署的区域、映像类型、机器大小、GPU 数量等。我们将使用区域和环境的默认设置。对于机器配置,我们将使用 n1-standard-8 机器:

我们不会添加任何 GPU,并且将使用启动磁盘、网络和权限的默认设置。选择创建 以创建实例。这需要几分钟才能完成。
创建实例后,您会在 Notebooks 界面中看到实例旁边有一个绿色对勾标记。选择打开 JupyterLab 以打开实例并开始制作原型:

打开实例后,创建一个名为 codelab 的新目录。这是我们将在本实验中使用的目录:

双击新创建的 codelab 目录,然后从启动器中选择 Python 3 笔记本,即可进入该目录:

将笔记本重命名为 demo.ipynb,或您想为其指定的任何名称。
第 4 步:导入 Python 软件包
在笔记本中创建一个新单元,然后导入我们将在本 Codelab 中使用的库:
import pandas as pd
import tensorflow as tf
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
import numpy as np
import json
from sklearn.model_selection import train_test_split
from sklearn.utils import shuffle
from google.cloud import bigquery
from witwidget.notebook.visualization import WitWidget, WitConfigBuilder
3. 将 BigQuery 数据连接到笔记本
BigQuery 是 Google Cloud 的大数据仓库,其中包含 许多公开提供的数据集 供您探索。AI Platform Notebooks 支持与 BigQuery 直接集成,无需进行身份验证。
在本实验中,我们将使用 natality 数据集。该数据集包含 40 年间美国几乎所有出生人口的数据,包括婴儿的出生体重以及婴儿父母的人口统计信息。我们将使用部分特征来预测婴儿的出生体重。
第 1 步:将 BigQuery 数据下载到笔记本
我们将使用 BigQuery 的 Python 客户端库将数据下载到 Pandas DataFrame 中。原始数据集为 21GB,包含 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。
第 2 步:准备用于训练的数据集
现在,我们将数据集作为 Pandas DataFrame 下载到笔记本中,接下来可以进行一些预处理,并将其拆分为训练集和测试集。
首先,我们从数据集中删除包含 null 值的行,然后对数据进行随机排序:
df = df.dropna()
df = shuffle(df, random_state=2)
接下来,将标签列提取到单独的变量中,并创建一个仅包含特征的 DataFrame。由于 is_male 是一个布尔值,因此我们会将其转换为整数,以便模型的所有输入都是数值:
labels = df['weight_pounds']
data = df.drop(columns=['weight_pounds'])
data['is_male'] = data['is_male'].astype(int)
现在,如果您运行 data.head() 来预览数据集,您应该会看到我们将用于训练的四个特征。
4. 初始化 git
AI Platform Notebooks 与 git 直接集成,因此您可以直接在笔记本环境中进行版本控制。这支持直接在笔记本界面中提交代码,或通过 JupyterLab 中提供的终端提交代码。在本部分中,我们将在笔记本中初始化 git 代码库,并通过界面进行首次提交。
第 1 步:初始化 git 代码库
在 JupyterLab 中,从 Codelab 目录中选择 Git ,然后从顶部菜单栏中选择 Init :

当系统询问您是否要将此目录设为 Git 仓库时,请选择是 。然后,选择左侧边栏中的 Git 图标,查看文件和提交的状态:

第 2 步:进行首次提交
在此界面中,您可以向提交添加文件、查看文件差异(稍后会介绍),以及提交更改。我们先来提交刚刚添加的笔记本文件。
选中 demo.ipynb 笔记本文件旁边的复选框,将其暂存以进行提交(您可以忽略 .ipynb_checkpoints/ 目录)。在文本框中输入提交消息,然后点击对勾标记以提交更改:

系统提示时,输入您的姓名和电子邮件地址。然后返回历史记录 标签页,查看您的首次提交:

请注意,由于本实验发布后进行了更新,因此屏幕截图可能与您的界面不完全一致。
5. 构建和训练 TensorFlow 模型
我们将使用已下载到笔记本中的 BigQuery natality 数据集来构建一个预测婴儿体重的模型。在本实验中,我们将重点介绍笔记本工具,而不是模型本身的准确性。
第 1 步:将数据拆分为训练集和测试集
在构建模型之前,我们将使用 Scikit Learn train_test_split 实用程序来拆分数据:
x,y = data,labels
x_train,x_test,y_train,y_test = train_test_split(x,y)
现在,我们可以构建 TensorFlow 模型了!
第 2 步:构建和训练 TensorFlow 模型
我们将使用 tf.keras Sequential 模型 API 构建此模型,该 API 可让我们将模型定义为层堆栈。构建模型所需的所有代码都在这里:
model = Sequential([
Dense(64, activation='relu', input_shape=(len(x_train.iloc[0]),)),
Dense(32, activation='relu'),
Dense(1)]
)
然后,我们将编译模型,以便对其进行训练。在这里,我们将选择模型的优化器、损失函数和我们希望模型在训练期间记录的指标。由于这是一个回归模型(预测数值),因此我们使用均方误差而不是准确率作为指标:
model.compile(optimizer=tf.keras.optimizers.RMSprop(),
loss=tf.keras.losses.MeanSquaredError(),
metrics=['mae', 'mse'])
您可以使用 Keras 的实用 model.summary() 函数来查看模型在每一层的形状和可训练参数的数量。
现在,我们可以训练模型了。我们需要做的就是调用 fit() 方法,并向其传递训练数据和标签。在这里,我们将使用可选的 validation_split 参数,该参数将保留部分训练数据,以便在每个步骤中验证模型。理想情况下,您希望看到训练损失和验证损失都减少。 但请注意,在此示例中,我们更关注模型和笔记本工具,而不是模型质量:
model.fit(x_train, y_train, epochs=10, validation_split=0.1)
第 3 步:针对测试示例生成预测
如需了解模型的表现,我们针对测试数据集中的前 10 个示例生成一些测试预测。
num_examples = 10
predictions = model.predict(x_test[:num_examples])
然后,我们将遍历模型的预测,并将其与实际值进行比较:
for i in range(num_examples):
print('Predicted val: ', predictions[i][0])
print('Actual val: ',y_test.iloc[i])
print()
第 4 步:使用 git diff 并提交更改
现在,您已对笔记本进行了一些更改,可以试用 Notebooks git 界面中提供的 git diff 功能。demo.ipynb 笔记本现在应位于界面中的“已更改”部分下。将鼠标悬停在文件名上,然后点击差异图标:

这样,您应该能够看到更改的差异,如下所示:

这次,我们将使用终端通过命令行提交更改。在 JupyterLab 顶部菜单栏的 Git 菜单中,选择 Git Command in Terminal。如果您在运行以下命令时打开了左侧边栏的 git 标签页,您将能够在 git 界面中看到所做的更改。
在新终端实例中,运行以下命令以暂存笔记本文件以进行提交:
git add demo.ipynb
然后运行以下命令以提交更改(您可以使用任何您喜欢的提交消息):
git commit -m "Build and train TF model"
然后,您应该会在历史记录中看到最新的提交:

6. 直接从笔记本中使用 What-If 工具
What-If 工具是一个交互式可视化界面,旨在帮助您直观呈现数据集,并更好地了解机器学习模型的输出。它是 Google PAIR 团队创建的开源工具。虽然它适用于任何类型的模型,但它的一些功能是专为 Cloud AI Platform 构建的。
What-If 工具预安装在带有 TensorFlow 的 Cloud AI Platform Notebooks 实例中。在这里,我们将使用它来了解模型的整体表现,并检查其在测试集中的数据点上的行为。
第 1 步:为 What-If 工具准备数据
为了充分利用 What-If 工具,我们将向其发送测试集中的示例以及这些示例的标准答案标签 (y_test)。这样,我们就可以将模型的预测结果与标准答案进行比较。运行以下代码行,以创建一个包含测试示例及其标签的新 DataFrame:
wit_data = pd.concat([x_test, y_test], axis=1)
在本实验中,我们将 What-If 工具连接到刚刚在笔记本中训练的模型。为此,我们需要编写一个函数,该工具将使用该函数将这些测试数据点运行到我们的模型中:
def custom_predict(examples_to_infer):
preds = model.predict(examples_to_infer)
return preds
第 2 步:实例化 What-If 工具
我们将通过向 What-If 工具传递刚刚创建的串联测试数据集 + 标准答案标签中的 500 个示例来实例化该工具。我们创建 WitConfigBuilder 的实例来设置该工具,并向其传递我们的数据、我们上面定义的自定义预测函数、目标(我们要预测的内容)和模型类型:
config_builder = (WitConfigBuilder(wit_data[:500].values.tolist(), data.columns.tolist() + ['weight_pounds'])
.set_custom_predict_fn(custom_predict)
.set_target_feature('weight_pounds')
.set_model_type('regression'))
WitWidget(config_builder, height=800)
加载 What-If 工具时,您应该会看到类似以下内容:

在 x 轴上,您可以看到测试数据点按模型的预测体重值 weight_pounds 分布。
第 3 步:使用 What-If 工具探索模型行为
您可以使用 What-If 工具执行许多很酷的操作。我们在这里仅探索其中的一些。首先,我们来看看数据点编辑器。您可以选择任何数据点来查看其特征,并更改特征值。首先点击任意数据点:

在左侧,您将看到所选数据点的特征值。您还可以将该数据点的标准答案标签与模型预测的值进行比较。在左侧边栏中,您还可以更改特征值并重新运行模型预测,以查看此更改对模型的影响。 例如,我们可以双击此数据点,然后重新运行预测,将 gestation_weeks 更改为 30:

使用 What-If 工具的绘图部分中的下拉菜单,您可以创建各种自定义可视化图表。例如,下图的 x 轴显示模型的预测体重,y 轴显示母亲的年龄,点按其推断错误着色(颜色越深表示预测体重与实际体重之间的差异越大)。在这里,看起来体重越轻,模型的错误就越大:

接下来,选中左侧的 Partial dependence plots (部分依赖关系图)按钮。这会显示每个特征如何影响模型的预测。例如,随着妊娠时间的增加,模型预测的婴儿体重也会增加:

如需了解有关 What-If 工具的更多探索想法,请查看本部分开头的链接。
7. 可选:将本地 git 仓库连接到 GitHub
最后,我们将学习如何将笔记本实例中的 git 仓库连接到 GitHub 账号中的仓库。如果您想执行此步骤,则需要一个 GitHub 账号。
第 1 步:在 GitHub 上创建新代码库
在 GitHub 账号中,创建一个新代码库。为其指定名称和说明,决定是否要将其设为公开,然后选择创建代码库 (您无需使用 README 进行初始化)。在下一页中,您将按照说明从命令行推送现有代码库。
打开终端窗口,然后将新代码库添加为远程代码库。将以下代码库网址中的 username 替换为您的 GitHub 用户名,并将 your-repo 替换为您刚刚创建的代码库的名称:
git remote add origin git@github.com:username/your-repo.git
第 2 步:在笔记本实例中向 GitHub 进行身份验证
接下来,您需要在笔记本实例中向 GitHub 进行身份验证。此过程因您是否在 GitHub 上启用了双重身份验证而异。
如果您不确定从何处开始,请按照 GitHub 文档中的步骤 创建 SSH 密钥 ,然后 将新密钥添加到 GitHub。
第 3 步:确保您已正确关联 GitHub 代码库
如需确保您已正确设置,请在终端中运行 git remote -v。您应该会看到新代码库列为远程代码库。看到 GitHub 代码库的网址并从笔记本向 GitHub 进行身份验证后,您就可以直接从笔记本实例推送到 GitHub 了。
如需将本地笔记本 git 仓库与新创建的 GitHub 仓库同步,请点击 Git 边栏顶部的云端上传按钮:

刷新 GitHub 代码库,您应该会看到笔记本代码以及之前的提交!如果其他人有权访问您的 GitHub 仓库,并且您想将笔记本的最新更改拉取下来,请点击云端下载图标以同步这些更改。
在 Notebooks git 界面的“历史记录”标签页中,您可以查看本地提交是否与 GitHub 同步。在此示例中,origin/master 对应于我们在 GitHub 上的代码库:

每当您进行新的提交时,只需再次点击云端上传按钮,即可将这些更改推送到 GitHub 代码库。
8. 恭喜!
您在本实验中做了很多工作👏👏👏
回顾一下,您学习了如何:
- 创建和自定义 AI Platform Notebook 实例
- 在该实例中初始化本地 git 代码库,通过 git 界面或命令行添加提交,在 Notebook git 界面中查看 git 差异
- 构建和训练简单的 TensorFlow 2 模型
- 在 Notebook 实例中使用 What-If 工具
- 将 Notebook git 仓库连接到 GitHub 上的外部仓库
9. 清理
如果您想继续使用此笔记本,建议您在不使用时将其关闭。在 Cloud Console 的 Notebooks 界面中,选择笔记本,然后选择 停止:

如果您想删除在本实验中创建的所有资源,只需删除笔记本实例,而不是停止它。
使用 Cloud Console 中的导航菜单,浏览到“存储空间”,然后删除您创建的用于存储模型资产的两个存储分区。