BigQuery ML.DETECT_ANOMALIES 模型 'arima_plus' returns 只有空值

BigQuery ML.DETECT_ANOMALIES with model 'arima_plus' returns only nulls

我建立了一个非常简单的模型,只有一个时间序列和一个始终为 1 的数据字段来查找异常。

CREATE OR REPLACE MODEL `mytest.dummy`
OPTIONS(
    model_type='arima_plus',
    TIME_SERIES_DATA_COL='cnt',
    TIME_SERIES_TIMESTAMP_COL='ts',
    DATA_FREQUENCY='HOURLY',
    DECOMPOSE_TIME_SERIES=TRUE
)
AS
select ts, 1 cnt 
from UNNEST(GENERATE_TIMESTAMP_ARRAY('2022-05-01', '2022-05-02', INTERVAL 1 HOUR)) as ts;

模型工作正常,除非我使用自定义 select 查询来查找异常。即使查询与用于创建模型的查询完全相同。

SELECT * 
FROM ML.DETECT_ANOMALIES(
    MODEL `mytest.dummy`,
    STRUCT (0.9 AS anomaly_prob_threshold),
    (select ts, 1 cnt 
     from UNNEST(GENERATE_TIMESTAMP_ARRAY('2022-05-01', '2022-05-02', INTERVAL 1 HOUR)) as ts)
)

结果

Row ts cnt is_anomaly lower_bound upper_bound anomaly_probability
1 2022-05-01 00:00:00 UTC 1.0 null null null null
2 2022-05-01 01:00:00 UTC 1.0 null null null null
3 ....

有谁知道我需要做什么才能获得 is_anomaly = false 的预期结果。

在仔细研究 documentation 之后,我发现异常检测仅在训练范围之外起作用——至少对于新查询是这样,并且仅在 HORIZON 范围内(通过写入时默认为1.000).

历史数据也可以分类,但只能不查询,且参数DECOMPOSE_TIME_SERIES设置为true

上面的例子看起来像这样:

CREATE OR REPLACE MODEL `mytest.dummy`
OPTIONS(
    model_type='arima_plus',
    TIME_SERIES_DATA_COL='cnt',
    TIME_SERIES_TIMESTAMP_COL='ts'
)
AS
select ts, 1 cnt 
from UNNEST(GENERATE_TIMESTAMP_ARRAY('2022-05-01', '2022-05-02', INTERVAL 1 HOUR)) as ts;

接下来几天的查询

SELECT * 
FROM ML.DETECT_ANOMALIES(
    MODEL `mytest.dummy`,
    STRUCT (0.9 AS anomaly_prob_threshold),
    (select ts, 1 cnt 
     from UNNEST(GENERATE_TIMESTAMP_ARRAY('2022-05-03', '2022-05-04', INTERVAL 1 HOUR)) as ts)
)

结果

Row ts cnt is_anomaly lower_bound upper_bound anomaly_probability
1 2022-05-03 00:00:00 UTC 1.0 false 1.0 1.0 0.0
2 2022-05-04 01:00:00 UTC 1.0 false 1.0 1.0 0.0
3 ....