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 部分,然后点击新建笔记本。然后选择最新的 TensorFlow 企业版 2.x 笔记本类型(不带 GPU):
使用默认选项,然后点击创建。创建实例后,选择打开 JupyterLab:
然后,通过 JupyterLab 创建一个 Python 3 笔记本:
第 3 步:下载实验资料
从 JupyterLab 界面创建新的终端窗口:File ->新建 ->终端。
然后,使用以下命令克隆源资料:
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 天的天气情况进行预测!我们可以看到下面返回的七行。预测结果还包括置信区间(默认为 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 Predictions 结合使用进行预测
第 1 步
在 Vertex AI Workbench 中,导航到 training-data-analyst/courses/ai-for-time-series/notebooks
并打开 03-cloud-training.ipynb
。
第 2 步
清除笔记本中的所有单元(“修改”>“清除所有输出项”),更改前几个单元中的区域、项目和存储分区设置,然后逐个运行单元。
第 3 步
在上一部分中,我们训练了一个模型并使用该模型进行预测,所有这些都在 Workbench 笔记本中完成。在本部分,我们演示了如何在笔记本中使用适用于 Vertex AI 的 Python SDK 来使用 Vertex AI 服务进行训练和部署。
8. 挑战
在本部分中,您将尝试将学到的概念应用于新的数据集!
我们不会提供详细说明,只是一些提示(如果您需要的话!)。
目标是预测来自纽约市的 311 个服务请求。这些非紧急请求包括噪音投诉、路灯问题等。
第 1 步
我们首先了解数据集。
首先,访问纽约市 311 服务请求数据集。
要更好地了解数据,请尝试数据集说明中列出的几个示例查询:
- 与冰淇淋车有关的 311 请求的数量是多少?
- 在哪些日子中,收到的与派对相关的 311 请求数量最多?
在 BigQuery 界面中,选择创建查询以了解如何访问数据集。请注意,select 语句从 bigquery-public-data.new_york_311.311_service_requests
进行查询。
第 2 步
我们已准备就绪。在本部分中,请修改 Explore and Visualize 笔记本以使用这些数据。
提示
- 复制
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,date 列为 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 控制台的 Workbench 界面中,选择笔记本,然后选择停止:
如果您想删除在本实验中创建的所有资源,只需删除 Workbench 笔记本,而无需将其停止。
使用 Cloud 控制台中的导航菜单,浏览到“存储空间”,并删除您为存储模型资产而创建的两个存储分区(警告:请仅在本实验中创建了新的存储分区时,才执行此操作)。