首页 > 编程语言 >用Python实现时间序列模型实战——Day 19: 时间序列中的异常检测与处理

用Python实现时间序列模型实战——Day 19: 时间序列中的异常检测与处理

时间:2024-09-13 13:19:58浏览次数:8  
标签:plt 19 异常 ts Value Python 序列 data 缺失

一、学习内容
1. 时间序列中的异常检测方法

在时间序列分析中,异常检测 是识别时间序列中不同于正常行为的点。这些异常点可能是由于数据记录错误、极端事件或系统故障引起的,常见的异常检测方法包括:

  • 基于统计的方法

    • Z-score:计算每个数据点与其均值的标准差距离,判断其是否为异常值。
    • IQR(四分位距):基于数据分布的中位数和四分位数检测异常点。
  • 基于机器学习的方法

    • 孤立森林 (Isolation Forest):一种基于决策树的无监督学习方法,通过随机选择特征和划分区间,识别孤立点作为异常值。
    • DBSCAN:一种基于密度的聚类方法,低密度区域中的点可以被认为是异常点。
2. 异常值对模型的影响与处理方法

异常值 对时间序列模型的拟合效果和预测性能产生负面影响。常见的处理方法包括:

  • 删除异常值:适用于异常点占比较小的情况。
  • 插值替换:使用前后正常点的均值或线性插值代替异常值。
  • 平滑方法:使用移动平均等平滑技术处理异常点。
3. 时间序列中的数据缺失处理

时间序列中的数据缺失是常见问题,处理方法包括:

  • 前向填充 (forward fill):用前一个时间点的值填充缺失点。
  • 线性插值 (linear interpolation):根据前后数据点线性插值填充缺失值。
  • 回归插值:基于周围数据点拟合模型,预测缺失值。
二、实战案例

我们将使用 pandasscikit-learn 库来处理一个时间序列数据集中的异常值和缺失值,检测异常值并处理缺失数据。

1. 数据生成与异常点/缺失点插入

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats
from sklearn.ensemble import IsolationForest
from sklearn.impute import SimpleImputer

# 生成模拟的时间序列数据
np.random.seed(42)
n_obs = 200
time = pd.date_range(start='2000-01-01', periods=n_obs, freq='M')
data = 0.5 * np.arange(n_obs) + np.random.normal(0, 1, n_obs)

# 插入一些异常值
data[20] = 50
data[150] = -30

# 插入一些缺失值
data[40:45] = np.nan

# 创建数据框
ts_data = pd.DataFrame({'Date': time, 'Value': data})
ts_data.set_index('Date', inplace=True)

# 绘制原始时间序列
plt.figure(figsize=(10, 6))
plt.plot(ts_data['Value'], label='Original Data')
plt.title('Time Series with Anomalies and Missing Values')
plt.legend()
plt.show()

代码解释:

  • 我们生成了一个带有线性趋势的模拟时间序列,并手动插入两个异常点和一段连续的缺失数据。

结果输出:

2. 异常检测
### 异常检测:基于 Z-score 的统计方法
z_scores = np.abs(stats.zscore(ts_data['Value'].dropna()))
threshold = 3  # 设定Z-score阈值
anomalies_zscore = np.where(z_scores > threshold)[0]

# 绘制异常点
plt.figure(figsize=(10, 6))
plt.plot(ts_data['Value'], label='Original Data')
plt.scatter(ts_data.iloc[anomalies_zscore].index, ts_data.iloc[anomalies_zscore]['Value'], color='red', label='Anomalies (Z-score)')
plt.title('Anomaly Detection using Z-score')
plt.legend()
plt.show()

### 异常检测:基于孤立森林的方法
iso_forest = IsolationForest(contamination=0.02, random_state=42)
ts_data['anomaly'] = iso_forest.fit_predict(ts_data[['Value']].fillna(0))
anomalies_iso = ts_data[ts_data['anomaly'] == -1]

# 绘制孤立森林检测出的异常点
plt.figure(figsize=(10, 6))
plt.plot(ts_data['Value'], label='Original Data')
plt.scatter(anomalies_iso.index, anomalies_iso['Value'], color='red', label='Anomalies (Isolation Forest)')
plt.title('Anomaly Detection using Isolation Forest')
plt.legend()
plt.show()

代码解释:

  • Z-score 方法:计算每个数据点的 Z-score 并检测异常点。Z-score 大于设定阈值(3)的点被认为是异常值。
  • 孤立森林:使用 IsolationForest 模型进行异常检测,输出异常点的位置。

结果输出:

3. 数据缺失处理
### 数据缺失处理
# 使用前向填充处理缺失值
ts_data_ffill = ts_data['Value'].fillna(method='ffill')

# 使用线性插值处理缺失值
ts_data_interpolate = ts_data['Value'].interpolate()

# 使用均值插值处理缺失值
imputer = SimpleImputer(strategy='mean')
ts_data_mean_impute = pd.Series(imputer.fit_transform(ts_data[['Value']]).flatten(), index=ts_data.index)

代码解释:

  • 前向填充:使用 fillna(method='ffill') 用前一个有效值填充缺失点。
  • 线性插值:使用 interpolate() 方法进行线性插值,估计缺失值。
  • 均值插值:使用 SimpleImputer 进行均值填充处理缺失值。
4. 可视化
# 绘制不同缺失值处理方法的效果
plt.figure(figsize=(10, 6))
plt.plot(ts_data['Value'], label='Original Data with Missing Values')
plt.plot(ts_data_ffill, label='Forward Fill', linestyle='--')
plt.plot(ts_data_interpolate, label='Linear Interpolation', linestyle='--')
plt.plot(ts_data_mean_impute, label='Mean Imputation', linestyle='--')
plt.title('Handling Missing Data in Time Series')
plt.legend()
plt.show()

代码解释:

  • 对比 Z-score 和孤立森林方法检测出的异常点,并可视化不同缺失值处理方法的效果。

结果输出:

三、结果分析
  1. 异常检测结果

    • Z-score 方法:识别出两个异常点,分别在索引 20 和 150 处。Z-score 方法能够有效地检测离群点,但其依赖于全局分布,因此不适用于局部异常检测。
    • 孤立森林方法:同样检测出了这两个异常点,孤立森林是一种无监督学习方法,不依赖于全局分布,可以有效处理复杂的异常检测任务。
  2. 缺失值处理结果

    • 前向填充:使用最近的非空值填充缺失点,适用于短期数据缺失但不适合长期缺失。
    • 线性插值:根据前后的值进行线性估计,适用于平滑的时间序列数据。
    • 均值插值:使用全局均值进行填充,简单但可能会降低模型的精度。
四、总结

通过不同的方法,我们可以有效检测时间序列中的异常值,并通过多种插值技术处理缺失数据。基于异常检测结果,我们可以决定是删除异常点还是进行插值处理。缺失值的处理方式应根据具体业务场景选择,线性插值通常能提供更平滑的补全结果,而前向填充适用于快速波动的数据。

标签:plt,19,异常,ts,Value,Python,序列,data,缺失
From: https://blog.csdn.net/qq_41698317/article/details/142059175

相关文章

  • [极客大挑战 2019]BabySQL
    启动靶机熟悉的界面测试发现or被过滤且输入#号无法起到注释作用猜测本靶机考点过滤查询关键词语句or,union,select,and,by和注释符#测试后查询关键词发现过滤只是单次过滤可以使用aandnd,oorr,uunionnion等绕过过滤而#则可以用urlencode编码格式变成%23绕过,接下来我们进行......
  • Python 虚拟环境管理
    在另外一篇文章已经讲了Python版本管理。本文主要讲Python虚拟环境管理。有了这两个方面的工具,就可以实现在Python的不同版本不同虚拟环境间方便地切换。pyenv-virtualenv一般会随pyenv一起安装,也可以通过下文方式独立安装。什么是虚拟环境一种采用协作式隔离的运......
  • CTF/5/利用python自动请求网页
    最后编辑时间:2024-09-1309:23:09星期五利用python自动请求网页(面向CTF)前置知识:PythonHTMLBurp(或者任何一个你趁手的抓包软件)VSCode(或者任何一个你熟悉的编辑器)浏览器开发者模式(F12)POST请求和GET请求shell/cmd使用搭建web服务器基础为什么我们需要利用python来进......
  • Python与Go语言中的哈希算法实现及对比分析
    哈希算法是一种将任意大小的数据输入转化为固定大小的输出(通常为一个散列值)的算法,在密码学、数据完整性验证以及数据索引等场景中广泛应用。本文将详细介绍Python和Go语言如何实现常见的哈希算法,包括MD5、SHA-1、SHA-256等。文章不仅提供代码示例,还会详细解释每个算法的特点、应用......
  • Python 基础语法 06 包 模块
    模块概述模块是Python中一个包含Python代码的文件,通常以.py为扩展名。模块可以包含函数、类和变量,也可以包含可执行的代码。模块的主要作用是组织和封装代码,以便于重用和维护。导入模块的5种方式import模块名导入模块下所有的功能(函数、类等),但必须通过模块名.功能名()的......
  • 22319 Business Analysis (Capstone)
    22319 BusinessAnalysis(Capstone)Spring2024SubjectdescriptionTheaimofthissubject istodemonstrateand apply a framework for business analysis and valuation using both    financialandnon-financialdata.Theemphasisofthesubject......
  • 快速编写一款python漏洞批量检测工具
    一、前言以下列检测脚本示列:importrequestsimporturllib3importre,string,randomfromurllib.parseimporturljoinimportargparseimporttimeimportsslssl._create_default_https_context=ssl._create_unverified_contexturllib3.disable_warnings(ur......
  • Python容器二之列表
    文章目录1.列表的基本使用1.1列表的定义1.2实例11.3访问列表元素和长度1.4实例22.列表的遍历2.1使用for遍历列表2.2使用while遍历列表3.操作列表3.1添加元素3.2删除元素3.3修改元素3.4查找元素3.5排序操作1.列表的基本使用1.1列表的定义列表类型......
  • KAN专家混合模型在高性能时间序列预测中的应用:RMoK模型架构探析与Python代码实验
    Kolmogorov-Arnold网络(KAN)的提出为深度学习领域带来了重要突破,它作为多层感知器(MLP)的一种替代方案,展现了新的可能性。MLP作为众多深度学习模型的基础构件,包括目前最先进的预测方法如N-BEATS、NHiTS和TSMixer,已经在各个领域得到广泛应用。但是我们在使用KAN、MLP、NHiTS和NBEATS进......
  • python 生成器
    一、可迭代对象、迭代器、生成器的区别可迭代对象:只要实现__iter__方法或者实现__getitem__方法而且其参数从0开始索引,那么该对象就是可迭代对象。可以用for循环遍历,常见的有string,list,tuple,dict,set。迭代器:实现了__iter__方法和__next__方法的对象。__iter......