异常检测
在本 notebook 中,我们将实现时间序列数据中的异常检测
先决条件
本教程假定您对 StatsForecast 有基本了解。有关最小示例,请访问快速入门
引言
异常检测是时间序列预测中的一项重要任务。它涉及识别不遵循预期数据集模式的异常观测值。异常,也称为离群值,可能由多种因素引起,例如数据收集过程中的错误、数据底层模式的突然变化或意外事件。它们可能对许多预测模型造成问题,因为它们会扭曲趋势、季节性模式或自相关估计。因此,异常可能对预测的准确性产生重大影响,正因为如此,识别它们至关重要。此外,异常检测在不同行业中有许多应用,例如检测金融数据中的欺诈、监控在线服务的性能或识别能源使用中的异常模式。
学完本教程后,您将很好地理解如何使用StatsForecast 的概率模型检测时间序列数据中的异常。
大纲
- 安装库
- 加载和探索数据
- 训练模型
- 恢复样本内预测并识别异常
重要提示
一旦识别出异常,我们必须决定如何处理它。例如,我们可以将其删除或替换为另一个值。正确的处理方式取决于上下文,并且超出了本 notebook 的范围。删除异常可能会提高预测的准确性,但也可能低估数据中的随机性。
提示
您可以使用 Colab 交互式地运行此 Notebook
安装库
我们假定您已安装 StatsForecast。如果尚未安装,请参阅此指南了解如何安装 StatsForecast 的说明。
使用 pip install statsforecast
安装必要的软件包
加载和探索数据
在本示例中,我们将使用M4 竞赛的每小时数据集。
unique_id | ds | y | |
---|---|---|---|
0 | H1 | 1 | 605.0 |
1 | H1 | 2 | 586.0 |
2 | H1 | 3 | 586.0 |
3 | H1 | 4 | 559.0 |
4 | H1 | 5 | 511.0 |
StatsForecast 的输入始终是采用长格式(long format)的数据框,包含三列:unique_id
、df
和 y
。
unique_id
:(字符串、整数或类别)序列的唯一标识符。ds
:(时间戳或整数)格式为 YYYY-MM-DD 或 YYYY-MM-DD HH:MM:SS 的时间戳,或表示时间的整数索引。y
:(数值)我们希望预测的度量值。
从此数据集中,我们将选择前 8 个时间序列以减少总执行时间。您可以通过更改 n_series
的值来选择任意数量。
我们可以使用来自 utilsforecast
包的 plot_series
函数绘制这些序列。此函数有多个参数,下面将解释在此 notebook 中生成图表所需的参数。
df
:一个 pandas 数据框,包含列 [unique_id, ds, y]。forecasts_df
:一个 pandas 数据框,包含列 [unique_id, ds] 和 models。ids
:包含我们要绘制的时间序列 ID 的列表。level
:要绘制的预测区间级别。plot_anomalies
:是否包含每个预测区间的异常值。
训练模型
为了生成预测,我们将使用MSTL 模型,它非常适合此处使用的低频数据。我们首先需要从 statsforecast.models
导入它,然后需要实例化它。由于我们使用每小时数据,我们有两个季节周期:每 24 小时一次(每小时)和每 24*7 小时一次(每天)。因此,我们需要设置 season_length = [24, 24*7]
。
要实例化新的 StatsForecast 对象,我们需要以下参数
models
:上一步中定义的模型列表。freq
:一个字符串或整数,指示数据的频率。请参阅pandas 的可用频率。n_jobs
:一个整数,指示并行处理中使用的任务数。使用 -1 选择所有核心。
现在我们将预测接下来的 48 小时。为此,我们将使用 forecast
方法,它需要以下参数
df
:包含训练数据的数据框。h
:预测范围。level
:预测区间的置信水平。fitted
:返回样本内预测。
重要的是我们要选择一个 level
并设置 fitted=True
,因为我们需要样本内预测及其预测区间来检测异常。
unique_id | ds | MSTL | MSTL-lo-99 | MSTL-hi-99 | |
---|---|---|---|---|---|
0 | H1 | 749 | 607.607223 | 587.173250 | 628.041196 |
1 | H1 | 750 | 552.364253 | 521.069710 | 583.658796 |
2 | H1 | 751 | 506.785334 | 465.894977 | 547.675691 |
3 | H1 | 752 | 472.906141 | 423.114088 | 522.698195 |
4 | H1 | 753 | 452.240231 | 394.064394 | 510.416067 |
我们可以使用之前提到的 plot_series
函数绘制预测结果。
恢复样本内预测并识别异常
在本例中,**异常**是指给定置信水平下(此处我们选择了 99%)样本内预测的预测区间之外的任何观测值。因此,我们首先需要使用 forecast_fitted_values
方法恢复样本内预测。
unique_id | ds | y | MSTL | MSTL-lo-99 | MSTL-hi-99 | |
---|---|---|---|---|---|---|
0 | H1 | 1 | 605.0 | 605.098607 | 584.678408 | 625.518805 |
1 | H1 | 2 | 586.0 | 588.496673 | 568.076474 | 608.916872 |
2 | H1 | 3 | 586.0 | 585.586856 | 565.166657 | 606.007054 |
3 | H1 | 4 | 559.0 | 554.012377 | 533.592178 | 574.432576 |
4 | H1 | 5 | 511.0 | 510.153508 | 489.733309 | 530.573707 |
现在我们可以找到样本内预测的 99% 预测区间之上或之下的所有观测值。
unique_id | ds | y | MSTL | MSTL-lo-99 | MSTL-hi-99 | |
---|---|---|---|---|---|---|
42 | H1 | 43 | 613.0 | 649.404871 | 628.984672 | 669.825069 |
47 | H1 | 48 | 683.0 | 662.245526 | 641.825328 | 682.665725 |
48 | H1 | 49 | 687.0 | 655.382320 | 634.962122 | 675.802519 |
100 | H1 | 101 | 507.0 | 484.934230 | 464.514031 | 505.354428 |
110 | H1 | 111 | 451.0 | 474.899006 | 454.478808 | 495.319205 |
我们可以通过设置 plot_series
函数的 level
和 plot_anomalies
参数来绘制异常值。
如果想仔细查看,我们可以使用 ids
参数选择特定的时间序列,例如 H10
。
在此,我们使用 MSTL 模型识别了数据中的异常,但 StatsForecast 中的任何概率模型都可以使用。我们还选择了样本内预测的 99% 预测区间,但也可以使用其他置信水平。