系列文章目录
Python异常检测- Isolation Forest(孤立森林)
python异常检测 - 随机离群选择Stochastic Outlier Selection (SOS)
python异常检测-局部异常因子(LOF)算法
Python异常检测- DBSCAN
Python异常检测- 单类支持向量机(One-Class SVM)
Python异常检测-3Sigma
Python异常检测-K最近邻算法(KNN)
Python异常检测-主成分分析(PCA)
文章目录
- 系列文章目录
- 前言
- 一、时间序列数据
- 二、自回归积分滑动平均模型(ARIMA)
- 1. ARIMA组成部分
- 2. 重要参数
- 三、ARIMA模型检测异常
- 四、Python实现
前言
时间序列分析是一种非常实用且强大的技术,用于研究随时间变化的数据。异常检测是识别偏离数据正常趋势的值或事件的过程。
一、时间序列数据
时间序列数据(time series data)是在不同时间上收集到的数据,用于所描述现象随时间变化的情况。这类数据反映了某一事物、现象等随时间的变化状态或程度。
时间序列允许我们分析过去,理解现在,并预测未来。此外,时间序列帮助我们发现数据中的隐藏模式和趋势,这些可以用于改进决策和策略。
二、自回归积分滑动平均模型(ARIMA)
ARIMA模型结合了自回归(AR)、差分(I)和移动平均(MA)三种方法,能够对非平稳时间序列数据进行建模和预测,用于非平稳时间序列建模和预测。
1. ARIMA组成部分
-
自回归(AR):自回归(AR)部分用于描述当前值与前若干个历史值之间的线性关系。
-
差分(I):积分(I)部分通过对时间序列进行差分处理,以消除非平稳性,使其变为平稳时间序列。差分的次数由参数(d)表示,通常进行一阶差分,很少进行二阶差分。
-
移动平均(MA):移动平均(MA)部分使用过去的预测误差来修正预测
2. 重要参数
RIMA模型通常用三个参数(p, d, q)来表示,其中:
-
p 是自回归项的阶数,表示当前值与多少个过去值有关。
-
d 是差分的阶数,表示需要进行多少次差分操作。
-
q 是移动平均项的阶数,表示当前值与多少个过去的误差项有关。
三、ARIMA模型检测异常
ARIMA(自回归积分滑动平均模型)模型属于基于预测的异常值检测方法,核心思想是利用模型的预测能力来识别与预期值偏差较大的数据点,这些点往往被视为异常值。
利用ARIMA模型实现检测异常时,一般需要针对具体的应用场景和数据特点,根据历史经验或者领域知识选择适当的阈值方法,并进行实验和验证。可以采用以下几种阈值作为判断标准:
- 绝对阈值:绝对阈值是指在时间序列中设置一个固定的数值作为阈值,超过该数值的观测值被认为是异常值。这种方法简单直观,但需要根据具体情况选择合适的阈值。
- 相对阈值:相对阈值是指根据时间序列的统计特性,如均值、标准差等,设置一个相对的阈值来判断异常值。常用的相对阈值方法包括Z-score、百分位数等。
- 动态阈值:动态阈值是指根据时间序列的变化情况,自适应地调整阈值。常见的动态阈值方法包括滑动窗口、指数加权移动平均等。
下图以一组以三个标准差基于ARIMA进行异常值探测的数据可视化的结果。
四、Python实现
首先导入必要的库的代码,然后读取数据。然后定义了移动平均线异常检测的函数、ADF单位根检验的函数以及ARIMA模型进行异常检测的函数。最后,通过调用这些函数来检测读取到的数据中的异常。
(基于AI生成的python代码)
import pandas as pd
from statsmodels.tsa.arima_model import ARIMA
from statsmodels.tsa.stattools import adfuller
# 读取数据
data = pd.read_csv('data.csv', header=0, names=['value'])
# 移动平均线异常检测
def test_for_anomalies_with_sma(timeseries, threshold):
rol_mean = timeseries.rolling(window=2).mean()
rol_std = timeseries.rolling(window=2).std()
lower_bound = rol_mean - (threshold * rol_std)
upper_bound = rol_mean + (threshold * rol_std)
fig = plt.figure(figsize=(12, 6))
ax = fig.add_subplot(111)
timeseries.plot(ax=ax, color='blue', label='Original')
ax.plot(lower_bound, color='red', label='Lower Bound')
ax.plot(upper_bound, color='green', label='Upper Bound')
ax.legend(loc='best')
plt.title('Anomaly Detection with Moving Standard Deviations')
plt.show()
# ADF单位根检验
def perform_unit_root_test(timeseries):
print('ADF Test Statistic: %f' % adfuller(timeseries)[0])
print('p-value: %f' % adfuller(timeseries)[1])
if adfuller(timeseries)[1] <= 0.05:
print('Series is not stationary')
else:
print('Series is stationary')
# ARIMA模型异常检测
def detect_anomalies_using_arima_model(timeseries):
# 模型拟合
model = ARIMA(timeseries, order=(0, 1, 1))
model_fit = model.fit()
# 对拟合的模型进行预测
y_pred = model_fit.predict(start=0, end=len(timeseries)-1, dynamic=True)
# 绘制原始数据和预测数据
fig = plt.figure(figsize=(12, 6))
ax = fig.add_subplot(111)
timeseries.plot(ax=ax, color='blue', label='Original')
ax.plot(y_pred, color='red', label='Prediction')
ax.legend(loc='best')
plt.title('Anomaly Detection with ARIMA Model')
plt.show()
# 调用函数
test_for_anomalies_with_sma(data['value'], 3)
perform_unit_root_test(data['value'])
detect_anomalies_using_arima_model(data['value'])
参考
时间序列数据
时间序列分析的异常检测综述
使用ARIMA模型检测异常时应采用哪个阈值
数据预处理之基于预测的(线性,ARIMA)异常值检测#matlab