1. 概览
在本实验中,您将学习如何使用 TensorFlow 构建时间序列预测模型,然后学习如何使用 Vertex AI 部署这些模型。
学习内容
您将了解如何:
- 转换数据,以便在机器学习模型中使用
- 直观呈现和探索数据
- 使用 BigQuery ML 创建时序预测模型
- 使用 LSTM 和 CNN 架构通过 TensorFlow 构建时序预测模型
2. 时序预测简介
此 Codelab 的重点是介绍如何使用 Google Cloud Platform 应用时序预测技术。虽然这不是一般的时间序列预测课程,但简要介绍相关概念可能对我们的用户有所帮助。
时序数据
首先,什么是时序?它是一种以固定时间间隔记录数据的数据集。时序数据集包含时间以及至少一个随时间变化的变量。

组件
时间序列可以分解为以下组成部分:
- 趋势:以可合理预测的模式上升或下降
- 季节性:在特定时间段(例如天、周、月、季节等)内重复。
- 随机:残差波动
季节性变化可能有多层。例如,呼叫中心可能会发现,每周的某些天以及某些月份的来电量存在某种规律。除了时间之外,其他变量或许也能解释残差。

平稳性
为获得最佳预测效果,时间序列数据应为平稳数据,即平均值和方差等统计属性随时间推移保持不变。差分和去趋势等技术可应用于原始数据,使其更平稳。
例如,下图所示的二氧化碳浓度呈现出重复的年度模式,并呈上升趋势。(来源)

移除线性趋势后,数据更适合用于预测,因为它现在具有恒定的平均值。

使用时间序列数据进行机器学习
若要在机器学习问题中使用时序数据,需要对其进行转换,以便使用之前的值来预测未来的值。下表展示了如何创建滞后变量来帮助预测目标。

现在,我们已经介绍了一些基础知识,接下来开始探索数据和进行预测!
3. 设置笔记本环境
现在,我们已经简要介绍了数据,接下来设置模型开发环境。
第 1 步:启用 API
BigQuery 连接器使用 BigQuery Storage API。在控制台中搜索 BigQuery Storage API,如果该 API 目前处于停用状态,请将其启用。

第 2 步:创建 Vertex AI Workbench 笔记本
前往 Cloud 控制台的 Vertex AI Workbench 部分,然后点击新建笔记本。然后选择最新的不带 GPU 的 TensorFlow 企业版 2.x 笔记本类型:
使用默认选项,然后点击创建。创建实例后,选择打开 JupyterLab:

然后,从 JupyterLab 创建 Python 3 笔记本:

第 3 步:下载实验材料
通过 JupyterLab 界面创建一个新的终端窗口:依次选择“File”(文件)->“New”(新建)->“Terminal”(终端)。
然后,使用以下命令克隆源素材:
git clone https://github.com/GoogleCloudPlatform/training-data-analyst
4. 探索和直观呈现数据
在此部分中,您将完成以下各项:
- 创建将数据分组为时序的查询
- 填充缺失值
- 直观呈现数据
- 将时间序列分解为趋势和季节性组成部分
第 1 步
在 Vertex AI Workbench 中,前往 training-data-analyst/courses/ai-for-time-series/notebooks 并打开 01-explore.ipynb。
第 2 步
清除笔记本中的所有单元(“修改”>“清除所有输出项”),更改前几个单元格中的区域、项目和存储分区设置,然后逐个运行这些单元格。
第 3 步
在本部分中,您已导入数据,并直观呈现了数据的各个维度。现在,您对数据有了更清晰的了解,接下来就可以使用这些数据进行机器学习建模了。

5. 使用 BigQuery 时序预测创建模型
在此部分中,您将完成以下各项:
- 将时序输入数据导入到 BigQuery 表中
- 使用 BQML 语法创建时序模型
- 了解如何评估模型参数和准确率
- 使用模型进行预测
第 1 步
我们将使用刚刚探索过的 CSV 中的原始数据创建一个 BigQuery 表。我们先从笔记本环境中下载 CSV 文件。
在 training-data-analyst/courses/ai-for-time-series/notebooks/data 目录中,右键点击 cta_ridership.csv,然后将其下载到本地环境。
第 2 步
接下来,我们将这些数据上传到 BigQuery 表中。
在控制台中前往 BigQuery(通过搜索或使用此链接):

您可以将该表添加到新的或现有的数据集(用于对相关表进行分组)。如果您尚未创建数据集,可以点击左下角的项目,然后选择右下角的创建数据集。

选择您喜欢的名称(例如 demo),接受默认设置,然后继续。
选择相应数据集后,选择右下角的创建表以创建新表。

对于表格创建选项,请选择:
- 基于以下数据源创建表:上传
- 选择文件:cta_ridership.csv
- 表名称:cta_ridership
- 架构:勾选相应复选框以自动检测架构和输入参数

第 3 步
现在可以创建模型了!BigQuery ML 提供类似于 SQL 的简单语法,可让您创建各种类型的模型。
在查询编辑器中,粘贴/输入以下查询,并根据需要在两个位置将 demo 替换为您的数据集名称:
CREATE OR REPLACE MODEL
`demo.cta_ridership_model` OPTIONS(MODEL_TYPE='ARIMA',
TIME_SERIES_TIMESTAMP_COL='service_date',
TIME_SERIES_DATA_COL='total_rides',
HOLIDAY_REGION='us') AS
SELECT
service_date, total_rides
FROM
`demo.cta_ridership`
下面我们来了解一下语法中的关键元素:
| 此语句用于创建模型。此语句有多种变体,例如 |
| 在此示例中,我们定义了模型选项,其中第一个选项是模型类型。选择 ARIMA 将创建时序预测模型。 |
| 包含日期/时间信息的列 |
| 数据列 |
| 此可选参数可让我们将节假日纳入模型中。由于我们在上一步中的数据探索表明,节假日期间的客流量较低,并且数据来自美国伊利诺伊州芝加哥,因此我们将美国节假日纳入模型中。 |
| 此部分用于选择我们将用于训练模型的输入数据。 |
您还可以向查询中添加许多其他选项,例如,如果您有多个时序,可以定义列,或者选择是否自动发现 ARIMA 模型参数。如需了解详情,请参阅用于时间序列模型的 CREATE MODEL 语句语法参考。
第 4 步
我们来详细了解一下我们的模型。训练完成后,我们再运行一个查询,如果需要,请再次替换 demo:
SELECT * FROM ML.EVALUATE(MODEL `demo.cta_ridership_model`)
我们来解读一下结果。在每一行中,您都会看到一个候选模型及其参数和评估统计信息。结果会按 AIC(即 Akaike 信息准则)升序返回,该指标可相对指示模型质量。因此,第一行中的模型具有最低的 AIC,它被视为最佳模型。
您将能够看到 ARIMA 模型的 p、d 和 q 参数,以及模型中发现的季节性。在这种情况下,最佳模型同时包含每周和每年的季节性。

第 5 步
现在,我们可以使用 ML.FORECAST 函数进行预测了!
粘贴/输入以下内容(如果需要,请替换 demo):
SELECT
*
FROM
ML.FORECAST(MODEL `demo.cta_ridership_model`,
STRUCT(7 AS horizon))
此查询仅使用我们的模型预测未来 7 天!我们可以看到下方返回了 7 行。预测还包括置信区间,默认值为 0.95,但可在查询中进行配置。

做得好:我们仅使用几个 BQML 查询就创建了一个时间序列模型。
6. 构建自定义预测模型
在此部分中,您将完成以下各项:
- 从数据中移除离群值
- 执行多步预测
- 在时间序列模型中纳入其他特征
- 了解用于时间序列预测的神经网络架构:LSTM 和 CNN
- 了解统计模型,包括 Holt-Winters 指数平滑
- 集成学习模型
第 1 步
在 Vertex AI Workbench 中,前往 training-data-analyst/courses/ai-for-time-series/notebooks 并打开 02-model.ipynb。
第 2 步
清除笔记本中的所有单元(“修改”>“清除所有输出项”),更改前几个单元格中的区域、项目和存储分区设置,然后逐个运行这些单元格。
第 3 步
在笔记本中,您现在已经探索了多种模型架构:LSTM、CNN 和统计模型。对于每个模型,您都可以查看模型在测试数据上的表现:

7. 在云端进行训练和预测
在此部分中,您将完成以下各项:
- 准备数据和模型以在云端进行训练
- 使用 AI Platform Training 训练模型并监控作业进度
- 使用 AI Platform Prediction 通过模型进行预测
第 1 步
在 Vertex AI Workbench 中,前往 training-data-analyst/courses/ai-for-time-series/notebooks 并打开 03-cloud-training.ipynb。
第 2 步
清除笔记本中的所有单元(“修改”>“清除所有输出项”),更改前几个单元格中的区域、项目和存储分区设置,然后逐个运行这些单元格。
第 3 步
在上一部分中,我们训练了一个模型并使用该模型进行了预测,所有操作都在 Workbench 笔记本中完成。在本部分中,我们演示了如何从笔记本中使用 Python 版 Vertex AI SDK 来使用 Vertex AI 服务进行训练和部署。

8. 挑战
在本部分中,您将尝试将所学概念应用于新数据集!
我们不会提供详细说明,只会提供一些提示(如果您需要的话!)。
目标是预测纽约市的 311 服务请求。这些非紧急请求包括噪音投诉、路灯问题等。
第 1 步
我们先来了解一下数据集。
首先,访问纽约市 311 服务请求数据集。
为了更好地了解数据,请尝试运行数据集说明中列出的一些示例查询:
- 与冰淇淋车有关的 311 请求的数量是多少?
- 在哪些日子中,收到的与派对相关的 311 请求数量最多?
在 BigQuery 界面中,选择创建查询,了解如何访问数据集。请注意,选择语句是从 bigquery-public-data.new_york_311.311_service_requests 进行查询。
第 2 步
我们已准备好开始。在本部分中,您将修改探索和直观呈现笔记本,以处理此数据。
提示
- 复制
01-explore.ipynb笔记本,然后开始使用复制的笔记本。 - 如需探索数据,请尝试以下查询:
from google.cloud import bigquery as bq
sql = """
SELECT * FROM `bigquery-public-data.new_york_311.311_service_requests` LIMIT 5
"""
client = bq.Client(project=PROJECT)
df = client.query(sql).to_dataframe()
df.head()
- 如需按月获取事件数量,请使用以下查询:
SELECT
COUNT(unique_key) as y,
DATE_TRUNC(DATE(created_date), month) as ds
FROM `bigquery-public-data.new_york_311.311_service_requests`
GROUP by ds ORDER BY ds asc
- 更新常量部分中的列变量。在上面的查询中,目标列为 y,日期列为 ds。没有其他功能。
- 请考虑更改您导出数据以用于下一个实验的文件名。
- 使用以下命令导出数据:
df.to_csv(YOUR-EXPORT-FILENAME, index=False)
第 3 步
现在,我们来创建使用月度数据的时序模型。
提示:
- 复制
02-model.ipynb笔记本,然后开始使用复制的笔记本。 - 更新数据集参数:
- 更新
target_col和ts_col参数,以与新数据集匹配。 - 更新模型参数:
- 将频次更改为每月(月份开始的代码为“MS”)
- 输入步数:12(回溯期为 12 个月)
- 输出步数:3(预测未来 3 个月)
- 季节数:12(季节性为 12 个月)
- 如果您在之前的笔记本中更改了输入文件名,请相应地更改此处的输入文件名。
- 如果您在月中运行此查询,则最后一个月的月度总计会远低于预期。因此,为了完成本实验,我们使用以下代码从数据集中移除最后一个月的数据:
df = df[:-1] - 数据中似乎没有明显的离群值,因此请跳过或注释掉这些单元格。
- 针对此新模型调整 LSTM 单元、CNN 过滤条件和内核大小。
9. 清理
如果您想继续使用此笔记本电脑,建议您在不使用时将其关闭。在 Cloud 控制台的工作区界面中,选择笔记本,然后选择停止:

如果您想删除在本实验中创建的所有资源,只需删除工作台笔记本,而不是停止它。
使用 Cloud 控制台中的导航菜单,浏览到“存储空间”,然后删除您创建的用于存储模型资产的两个存储分区(警告:仅当您专门为本实验创建了新存储分区时,才可执行此操作)。
