python异常监测-ARIMA(自回归积分滑动平均模型)

系列文章目录

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

上一篇:Codeforces Round 982 (Div. 2) A-D1


下一篇:【Android】Kotlin教程(4)