在 AI Platform Notebooks 中进行模型的原型设计

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,然后选择启用(如果尚未启用)。您需要此信息才能创建笔记本实例。

第 3 步:创建笔记本实例

前往 Cloud 控制台的 AI Platform Notebooks 部分,然后点击新建实例。然后,选择最新的不带 GPU 的 TensorFlow 2 企业版实例类型:

9f2bb4dec1ba4f4f.png

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

63be602ba45ca7c9.png

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

27101d232f765a17.png

我们不会添加任何 GPU,并将使用默认的启动磁盘、网络和权限。选择创建以创建实例。这需要几分钟才能完成。

实例创建完毕后,您会在“笔记本”界面中看到实例旁边显示一个绿色对勾。选择打开 JupyterLab 以打开实例并开始进行原型设计:

3598f414887ea9a8.png

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

c16a821546acd92.png

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

4390b1614ae8eae4.png

将该记事本重命名为 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 数据连接到您的笔记本

Google Cloud 的大数据仓库 BigQuery 提供了许多数据集供您探索。AI Platform Notebooks 支持与 BigQuery 直接集成,无需进行身份验证。

在本实验中,我们将使用 natality 数据集。该数据集包含 40 年内美国几乎每例出生的相关数据,包括婴儿的出生体重以及婴儿父母的人口统计信息。我们将使用部分特征来预测婴儿的出生体重。

第 1 步:将 BigQuery 数据下载到我们的记事本

我们将使用 BigQuery 的 Python 客户端库将数据下载到 Pandas DataFrame。原始数据集为 21GB,包含 1.23 亿行。为简单起见,我们将仅使用该数据集中的 1 万行数据。

使用以下代码构建查询并预览生成的 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 的顶部菜单栏中,依次选择代码库目录中的 GitInit

d9f1729358f18e58.png

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

1648d6828f11a6db.png

第 2 步:进行首次提交

在此界面中,您可以向提交添加文件、查看文件差异(稍后会介绍),以及提交更改。首先,我们要提交刚才添加的笔记本文件。

选中 demo.ipynb 记事本文件旁边的复选框,将其暂存以进行提交(您可以忽略 .ipynb_checkpoints/ 目录)。在文本框中输入提交消息,然后点击对勾标记以提交更改:

fe7366522a3a268f.png

出现提示时,输入您的姓名和电子邮件地址。然后,返回历史记录标签页查看您的第一个提交:

d03567c3592afb77.png

请注意,由于本实验发布后发生了更新,因此屏幕截图可能与您的界面不完全一致。

5. 构建和训练 TensorFlow 模型

我们将使用下载到记事本中的 BigQuery 出生率数据集构建一个用于预测婴儿体重的模型。在本实验中,我们将重点介绍 Notebook 工具,而不是模型本身的准确性。

第 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 并提交更改

现在,您对该记事本进行了一些更改,接下来可以试用“记事本”Git 界面中的 git diff 功能。demo.ipynb 记事本现在应位于界面中的“已更改”部分下。将光标悬停在文件名上,然后点击差异图标:

a370facb3632fb32.png

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

461c502bd3ab910e.png

这次,我们将使用终端通过命令行提交更改。在 JupyterLab 顶部菜单栏的 Git 菜单中,选择 Git Command in Terminal(在终端中执行 Git 命令)。如果您在运行以下命令时打开了左侧边栏的 git 标签页,则会看到您的更改反映在 git 界面中。

在新终端实例中,运行以下命令以将笔记本文件暂存起来以供提交:

git add demo.ipynb

然后,运行以下命令以提交更改(您可以使用任何提交消息):

git commit -m "Build and train TF model"

然后,您应该会在历史记录中看到最新的提交:

a4b44045e97cb7a7.png

6. 直接在记事中使用 What-If 工具

What-If 工具是一种交互式可视化界面,旨在帮助您直观呈现数据集并更好地了解机器学习模型的输出。它是由 Google 的 PAIR 团队创建的开源工具。虽然它适用于任何类型的模型,但它还具有一些专为 Cloud AI Platform 构建的功能。

假设分析工具已预安装在搭载 TensorFlow 的 Cloud AI Platform Notebooks 实例中。在这里,我们将使用它来查看模型的整体表现,并检查它对测试集数据点的行为。

第 1 步:为“假设分析”工具准备数据

为了充分利用“假设分析”工具,我们将向其发送测试集中的示例以及这些示例的标准答案标签 (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 步:实例化“假设分析”工具

我们将通过将我们刚刚创建的串联测试数据集和标准答案标签中的 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)

加载“假设分析”工具后,您应该会看到如下内容:

fcdc1cb7ed8e364e.png

在 x 轴上,您可以看到测试数据点按模型的预测权重值 weight_pounds 分布。

第 3 步:使用 What-If 工具探索模型行为

您可以使用 What-If 工具执行许多很酷的操作。我们将在此处仅介绍其中的几个。首先,我们来看看数据点编辑器。您可以选择任何数据点来查看其特征,并更改特征值。首先,点击任意数据点:

2ba944f16240ff4b.png

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

aaa6a937c66758cf.png

您可以使用“假设分析”工具图表部分中的下拉菜单,创建各种自定义可视化图表。例如,下图的 x 轴显示了模型的预测体重,y 轴显示了母亲的年龄,而点的颜色则取决于推理误差(颜色越深,预测体重与实际体重之间的差异就越大)。从图表中可以看出,随着权重的降低,模型的误差略有增加:

cd2ce527a9044e7b.png

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

1fec2a64fb03f432.png

如需了解有关使用 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 步:在您的 Notebooks 实例中向 GitHub 进行身份验证

接下来,您需要在笔记本实例中对 GitHub 进行身份验证。此流程因您是否在 GitHub 上启用了双重身份验证而异。

如果您不确定从哪里开始,请按照 GitHub 文档中的步骤创建 SSH 密钥,然后将新密钥添加到 GitHub

第 3 步:确保您已正确关联 GitHub 代码库

为确保您已正确设置,请在终端中运行 git remote -v。您应该会看到新代码库列为远程代码库。看到 GitHub 代码库的网址并在笔记本中完成 GitHub 身份验证后,您就可以直接从笔记本实例中推送到 GitHub 了。

如需将本地笔记本 Git 代码库与新创建的 GitHub 代码库同步,请点击 Git 边栏顶部的云端上传按钮:

eec001587bb9cfb1.png

刷新您的 GitHub 代码库,您应该会看到包含之前提交内容的笔记本代码!如果其他人有权访问您的 GitHub 代码库,并且您想将最新的更改拉取到您的记事中,请点击云下载图标以同步这些更改。

在“Notebooks”的 Git 界面“History”(历史记录)标签页中,您可以查看本地提交内容是否已与 GitHub 同步。在此示例中,origin/master 对应于 GitHub 上的代码库:

2c3d1eb7cf95c24e.png

每次进行新提交时,只需再次点击云端上传按钮,即可将这些更改推送到您的 GitHub 代码库。

8. 恭喜!

您已在本实验中完成了很多工作 👏?👏?👏?

总的来说,您已学习如何:

  • 创建和自定义 AI Platform Notebooks 实例
  • 在该实例中初始化本地 git 代码库,通过 git 界面或命令行添加提交,在 Notebook git 界面中查看 git 差异
  • 构建和训练简单的 TensorFlow 2 模型
  • 在笔记本实例中使用 What-If 工具
  • 将您的笔记本 git 代码库连接到 GitHub 上的外部代码库

9. 清理

如果您想继续使用此手写板,建议您在不用时将其关闭。在 Cloud 控制台中的“Notebooks”界面中,选择相应 Notebook,然后选择 Stop

ba727f9a0aefbc30.png

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

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