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
....
我建立了一个非常简单的模型,只有一个时间序列和一个始终为 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 | .... |