什么是滞后阈值?
滞后阈值是一种从时间序列数据中识别异常值的方法。其思想是通过比较当前时刻的观察值与过去一段时间内的观察值的平均值加上一个标准差的乘积来决定是否将当前观察值标记为异常值。
具体而言,滞后阈值方法可以分为以下几个步骤:
- 计算过去一段时间内的观察值的平均值和标准差;
- 根据平均值和标准差构建阈值:阈值为平均值加上一个标准差的乘积;
- 对于当前时刻的观察值,如果其大于阈值,则将其标记为异常值。
通常,为了让滞后阈值方法更加精确,我们需要在计算平均值和标准差的时候采用移动平均和移动标准差的方法,即每次只考虑最近的一段时间内的观察值。
下面我们将使用Python中的scikit-learn库来实现滞后阈值方法。
阅读更多:Python 教程
如何使用Python中的scikit-learn实现滞后阈值?
数据准备
在实现滞后阈值方法之前,我们首先需要准备数据。在本文中,我们将使用UCI Machine Learning Repository上的一组日期数据来演示如何实现滞后阈值方法。
这组数据包含了从1985年到1994年每天的平均温度和空气湿度数据。我们将使用pandas库来载入这组数据。
import pandas as pd
df = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/00374/energydata_complete.csv')
读入数据之后,我们可以查看数据的前几行:
df.head()
输出:
date time ... Tdewpoint Energy
0 1/1/2016 00:00:00 ... 5.3 60
1 1/1/2016 00:10:00 ... 5.2 60
2 1/1/2016 00:20:00 ... 5.1 50
3 1/1/2016 00:30:00 ... 5.0 50
4 1/1/2016 00:40:00 ... 4.9 60
[5 rows x 29 columns]
其中,‘date’和‘time’列分别表示日期和时间,‘T_out’和‘RH_out’列分别表示户外温度和空气湿度,‘Energy’列表示能源消耗量。
在本文中,我们将只关注‘T_out’列和‘Energy’列。
计算滞后阈值
计算滞后阈值的代码如下所示:
import numpy as np
from sklearn.preprocessing import StandardScaler
lookback = 24 * 6 # 每天有24小时,每小时有6个时间步,所以lookback为24*6
threshold = 5.0
# 计算移动平均和移动标准差
rolling_mean = df['Energy'].rolling(window=lookback).mean()
rolling_std = df['Energy'].rolling(window=lookback).std()
# 标准化观察值
scaler = StandardScaler()
scaled_values = scaler.fit_transform(df[['Energy']])[lookback:]
scaled_values = scaled_values.flatten()
# 计算阈值
upper_threshold = rolling_mean + threshold * rolling_std
lower_threshold = rolling_mean - threshold * rolling_std
上述代码中,我们首先设定滞后阈值方法的参数:lookback
表示滞后阈值方法考虑的时间窗口大小,这里我们将其设定为24小时*6个时间步;threshold
表示阈值系数,这里我们将其设定为5.0。
接着,我们分别计算了能源消耗量数据的移动平均和移动标准差,并使用scikit-learn的StandardScaler
将能源消耗量数据进行标准化。
最后,我们根据平均值和标准差计算出了上限和下限阈值,下一步将使用这些阈值来识别异常值。
检测异常值
我们可以使用以下代码来检测具体的异常值:
outliers = []
for i in range(lookback, len(df)):
# 检查是否超过阈值范围
if df['Energy'][i] > upper_threshold[i-lookback] or \
df['Energy'][i] < lower_threshold[i-lookback]:
outliers.append(i)
上述代码中,我们遍历了整个时间序列数据,并检查每个时间步的能源消耗量是否超过了预先计算的上限或下限阈值。如果超过了阈值,我们将该时间步的索引存入outliers
列表中。
可视化结果
最后,我们可以使用matplotlib库将结果可视化:
import matplotlib.pyplot as plt
# 绘制能源消耗量数据
plt.plot(df['Energy'])
# 绘制上限和下限阈值
plt.plot(upper_threshold, color='r')
plt.plot(lower_threshold, color='r')
# 绘制异常值
plt.plot(outliers, df['Energy'][outliers], 'o', color='r')
plt.show()
上述代码中,我们首先绘制了能源消耗量数据,然后将上限和下限阈值以红色线条的形式绘制在图像上,最后将异常值以大红点的形式标记在图像上。
从上图可以看出,在2016年2月15日到17日之间,能源消耗量出现了明显的异常值。根据这些异常值,我们可以进一步分析出现异常值的原因,并采取相应的措施来减少能源消耗。
结论
滞后阈值方法是一种简单但有效的时间序列异常检测方法。通过计算移动平均和移动标准差,并根据设定的阈值系数计算出上限和下限阈值,我们可以识别时间序列数据中的异常点。在本文中,我们使用Python中的scikit-learn库实现了滞后阈值方法,并将其应用于能源消耗量数据的异常检测。通过可视化结果,我们发现在某些时间段内存在明显的异常点,这些异常点可能反映出了特定的能源消耗情况,需要进一步分析处理。