在时间序列预测中处理真实世界的数据¶
来自真实世界的时间序列数据通常不完善,存在缺失、重复或不对齐的时间步。预测和异常检测 ML 函数包括以下预处理功能,可帮助您使用真实世界的数据来训练可做出有用预测的模型:
您可以指定事件频率来替换模型自动推断的频率。
该模型可以推断缺失时间步的数据并在一个时间步内聚合多个值。您可以指定如何为每个特征或每种特征类型进行聚合,也可以让 ML 函数自动为您完成聚合。
即使您的训练数据存在常见的一致性问题,这些功能也能让您训练出有用的模型。通常,数据一致性越好,预测模型就越准确,但数量相对较少的此类调整不会明显影响模型的准确性。
指定事件频率¶
模型训练使用启发式方法推断训练数据中时间步的频率,但极少数情况下会选择错误的频率。为了避免这种风险,或者纠正错误的推断,您可以在启动训练时使用 CONFIG_OBJECT 参数 frequency
选择性指定所需的频率。此参数以类似于 '1 day'
或 '2 weeks'
的形式指定时间段。
时间间隔指定必须用单引号引起来,因为它是一个字符串。
支持的时间间隔包括秒、分钟、小时、天、周、月、季度和年。
使用完整的间隔名称。可以使用复数。(“Second”或“seconds”,而不是“sec”)。
以下示例显示如何使用一天的频率训练预测模型。
CREATE SNOWFLAKE.ML.FORECAST model1(
INPUT_DATA => TABLE(v1),
TIMESTAMP_COLNAME => 'date',
TARGET_COLNAME => 'sales',
CONFIG_OBJECT => {'frequency': '1 day'}
);
如果您未指定事件频率,训练过程将推断最接近的匹配事件频率。
填充缺失时间步的值¶
没有目标值的时间戳使用以下方法填充:
如果目标值聚合行为是 SUM(请参阅 在一个时间步中处理多个值),则使用零填充
所有其他情况下,使用附近的值的线性插值进行填充
不会填充缺失的特征值,而是替换为 NULL 值。模型训练会忽略这些值。
在一个时间步中处理多个值¶
当一个时间步中存在多个事件时,预处理可以采用各种方式汇合它们的值。例如,如果事件的频率是每小时一次,则可以对每小时节奏之外发生的值取平均值,以得出最接近的规范每小时时间戳的值。
下表总结了可用的聚合行为。
值的种类 |
可用行为 |
默认行为 |
---|---|---|
数字 |
|
MEAN |
分类(字符串或布尔) |
|
MODE |
小技巧
将 SUM 方法用于计数数据,例如已售出的商品数量。MEAN 适用于大多数其他数值。
所有行为都忽略 NULL 值并应用于要插值或聚合的时间段。例如,按每小时节奏对值执行 SUM 是以标准时间戳为中心的一小时内的值之和。
您可以通过两种方式替换列的默认行为:
按值类型(目标、数字或分类)
按确切的列名称
如果您以两种方式替换行为,则列名替换优先。
按值的类型替换¶
在函数的 CONFIG_OBJECT 参数在设置以下选项以替换特定类型值:分类、数字和目标。这些行为如 先前定义。
选项 |
可能的值 |
---|---|
|
MODE、 FIRST、 LAST |
|
MEAN、MEDIAN、MODE、MIN、MAX、SUM、FIRST、LAST |
|
MEAN、MEDIAN、MODE、MIN、MAX、SUM、FIRST、LAST |
备注
如果未指定 aggregation_target
,目标聚合将使用通过:code:aggregate_numeric
指定的行为(如果有)。否则,将会使用默认的 MEAN。
以下示例显示如何设置分类和数字特征的聚合行为。
CREATE SNOWFLAKE.ML.FORECAST model1(
INPUT_DATA => TABLE(v1),
TIMESTAMP_COLNAME => 'date',
TARGET_COLNAME => 'sales',
CONFIG_OBJECT => {
'frequency': '1 day',
'aggregation_categorical': 'MODE',
'aggregation_numeric': 'MEDIAN'}
);
小技巧
即使使用默认值,也请考虑指定所有这些值。这样一来,您不需要知道默认行为是什么就可以理解该语句要做什么,并且如果您以后想要更改该行为,则不需要查找参数名称。
按列名替换¶
CONFIG_OBJECT 中的 aggregation_column
选项是将行为映射到列名的对象。这些行为将替换使用上面描述的参数指定的任何行为。
备注
目标值的聚合行为不能通过列名指定。改用 aggregation_target
选项。
建议的更改 例如,以下 SQL 语句使用 aggregation_column
选项指定两个不同列的聚合行为。
CREATE SNOWFLAKE.ML.FORECAST model1(
INPUT_DATA => TABLE(v1),
TIMESTAMP_COLNAME => 'date',
TARGET_COLNAME => 'sales',
CONFIG_OBJECT => {
'frequency': '1 day',
'aggregation_target': 'MEDIAN',
'aggregation_column': {
'temperature': 'MEDIAN',
'employee_id': 'FIRST'
}
}
);