使用 Vertex AI 和 BigQuery ML 进行时序预测

1. 概览

在本实验中,您将学习如何使用 TensorFlow 构建时间序列预测模型,然后学习如何使用 Vertex AI 部署这些模型。

学习内容

您将了解如何:

  • 转换数据,以便在机器学习模型中使用
  • 直观呈现和探索数据
  • 使用 BigQuery ML 创建时序预测模型
  • 使用 LSTM 和 CNN 架构通过 TensorFlow 构建时序预测模型

2. 时序预测简介

此 Codelab 的重点是介绍如何使用 Google Cloud Platform 应用时序预测技术。虽然这不是一般的时间序列预测课程,但简要介绍相关概念可能对我们的用户有所帮助。

时序数据

首先,什么是时序?它是一种以固定时间间隔记录数据的数据集。时序数据集包含时间以及至少一个随时间变化的变量。

85af6a1ff05c69f2.png

组件

时间序列可以分解为以下组成部分:

  • 趋势:以可合理预测的模式上升或下降
  • 季节性:在特定时间段(例如天、周、月、季节等)内重复。
  • 随机:残差波动

季节性变化可能有多层。例如,呼叫中心可能会发现,每周的某些天以及某些月份的来电量存在某种规律。除了时间之外,其他变量或许也能解释残差。

6e8d45bbbbc388ec.png

平稳性

为获得最佳预测效果,时间序列数据应为平稳数据,即平均值和方差等统计属性随时间推移保持不变。差分和去趋势等技术可应用于原始数据,使其更平稳。

例如,下图所示的二氧化碳浓度呈现出重复的年度模式,并呈上升趋势。(来源

ab82857e2e7d0b89.png

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

c936381ab1095528.png

使用时间序列数据进行机器学习

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

d667a941dbd470f5.png

现在,我们已经介绍了一些基础知识,接下来开始探索数据和进行预测!

3. 设置笔记本环境

现在,我们已经简要介绍了数据,接下来设置模型开发环境。

第 1 步:启用 API

BigQuery 连接器使用 BigQuery Storage API。在控制台中搜索 BigQuery Storage API,如果该 API 目前处于停用状态,请将其启用。

9895a2fd3cdf8f8c.png

第 2 步:创建 Vertex AI Workbench 笔记本

前往 Cloud 控制台的 Vertex AI Workbench 部分,然后点击新建笔记本。然后选择最新的不带 GPUTensorFlow 企业版 2.x 笔记本类型:

4e7b73eabf2bc061.png

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

18c9f3c462aafaee.png

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

58523671a252b95a.png

第 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 步

在本部分中,您已导入数据,并直观呈现了数据的各个维度。现在,您对数据有了更清晰的了解,接下来就可以使用这些数据进行机器学习建模了。

55839e7bc0427915.png

5. 使用 BigQuery 时序预测创建模型

在此部分中,您将完成以下各项:

  • 将时序输入数据导入到 BigQuery 表中
  • 使用 BQML 语法创建时序模型
  • 了解如何评估模型参数和准确率
  • 使用模型进行预测

第 1 步

我们将使用刚刚探索过的 CSV 中的原始数据创建一个 BigQuery 表。我们先从笔记本环境中下载 CSV 文件。

training-data-analyst/courses/ai-for-time-series/notebooks/data 目录中,右键点击 cta_ridership.csv,然后将其下载到本地环境。

第 2 步

接下来,我们将这些数据上传到 BigQuery 表中。

在控制台中前往 BigQuery(通过搜索或使用此链接):

649e7ab1c44b75e8.png

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

281b97020cd52f29.png

选择您喜欢的名称(例如 demo),接受默认设置,然后继续。

选择相应数据集后,选择右下角的创建表以创建新表。

ad47810d44cfb289.png

对于表格创建选项,请选择:

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

213e4177e9e79544.png

第 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`

下面我们来了解一下语法中的关键元素:

CREATE OR REPLACE MODEL
demo.cta_ridership_model

此语句用于创建模型。此语句有多种变体,例如 CREATE MODEL,但我们在此处选择替换具有相同名称的现有模型。

OPTIONS(MODEL_TYPE=‘ARIMA' ... )

在此示例中,我们定义了模型选项,其中第一个选项是模型类型。选择 ARIMA 将创建时序预测模型。

TIME_SERIES_TIMESTAMP_COL=‘service_date'

包含日期/时间信息的列

TIME_SERIES_DATA_COL=‘total_rides'

数据列

HOLIDAY_REGION=‘us'

此可选参数可让我们将节假日纳入模型中。由于我们在上一步中的数据探索表明,节假日期间的客流量较低,并且数据来自美国伊利诺伊州芝加哥,因此我们将美国节假日纳入模型中。

AS SELECT ... FROM ...

此部分用于选择我们将用于训练模型的输入数据。

您还可以向查询中添加许多其他选项,例如,如果您有多个时序,可以定义列,或者选择是否自动发现 ARIMA 模型参数。如需了解详情,请参阅用于时间序列模型的 CREATE MODEL 语句语法参考。

第 4 步

我们来详细了解一下我们的模型。训练完成后,我们再运行一个查询,如果需要,请再次替换 demo

SELECT
  *
FROM
  ML.EVALUATE(MODEL `demo.cta_ridership_model`)

我们来解读一下结果。在每一行中,您都会看到一个候选模型及其参数和评估统计信息。结果会按 AIC(即 Akaike 信息准则)升序返回,该指标可相对指示模型质量。因此,第一行中的模型具有最低的 AIC,它被视为最佳模型。

您将能够看到 ARIMA 模型的 p、d 和 q 参数,以及模型中发现的季节性。在这种情况下,最佳模型同时包含每周和每年的季节性。

5b5b1e129c70a340.png

第 5 步

现在,我们可以使用 ML.FORECAST 函数进行预测了!

粘贴/输入以下内容(如果需要,请替换 demo):

SELECT
  *
FROM
  ML.FORECAST(MODEL `demo.cta_ridership_model`,
    STRUCT(7 AS horizon))

此查询仅使用我们的模型预测未来 7 天!我们可以看到下方返回了 7 行。预测还包括置信区间,默认值为 0.95,但可在查询中进行配置。

b8a7f22657dc2d27.png

做得好:我们仅使用几个 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 和统计模型。对于每个模型,您都可以查看模型在测试数据上的表现:

a528df58f4e6d372.png

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 服务进行训练和部署。

a3f6b5dc895a24fb.png

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_colts_col 参数,以与新数据集匹配。
  • 更新模型参数:
  • 将频次更改为每月(月份开始的代码为“MS”)
  • 输入步数:12(回溯期为 12 个月)
  • 输出步数:3(预测未来 3 个月)
  • 季节数:12(季节性为 12 个月)
  • 如果您在之前的笔记本中更改了输入文件名,请相应地更改此处的输入文件名。
  • 如果您在月中运行此查询,则最后一个月的月度总计会远低于预期。因此,为了完成本实验,我们使用以下代码从数据集中移除最后一个月的数据:df = df[:-1]
  • 数据中似乎没有明显的离群值,因此请跳过或注释掉这些单元格。
  • 针对此新模型调整 LSTM 单元、CNN 过滤条件和内核大小。

9. 清理

如果您想继续使用此笔记本电脑,建议您在不使用时将其关闭。在 Cloud 控制台的工作区界面中,选择笔记本,然后选择停止

57213ef2edad9257.png

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

使用 Cloud 控制台中的导航菜单,浏览到“存储空间”,然后删除您创建的用于存储模型资产的两个存储分区(警告:仅当您专门为本实验创建了新存储分区时,才可执行此操作)。