TODS:一款功能强大的多元时间序列异常检测工具

2023-12-04 05:59

本文主要是介绍TODS:一款功能强大的多元时间序列异常检测工具,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

TODS是一个全栈的自动化机器学习系统,主要针对多变量时间序列数据的异常检测。该系统可以处理三种常见的时间序列异常检测场景:点的异常检测(异常是时间点)、模式的异常检测(异常是子序列)、系统的异常检测(异常是时间序列的集合)。TODS提供了一系列相应的算法。

TODS具有如下特点:

  • 全栈式机器学习系统:支持从数据预处理、特征提取、到检测算法和人为规则每一个步骤并提供相应的接口。

  • 广泛的算法支持:包括 PyOD 提供的点的异常检测算法、最先进的模式的异常检测算法(例如 DeepLog, Telemanon ),以及用于系统的异常检测的集合算法。

  • 自动化的机器学习:旨在提供无需专业知识的过程,通过自动搜索所有现有模块中的最佳组合,基于给定数据构造最优管道。

技术交流

技术要学会分享、交流,不建议闭门造车。

本文技术由粉丝群小伙伴推荐分享汇总。有趣使用工具、源码、数据、技术交流提升,均可加交流群获取,群友已超过3000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友。

方式①、添加微信号:dkl88191,备注:来自CSDN +技术交流
方式②、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

概述

TODS 提供了详尽的用于构建基于机器学习的异常检测系统的模块,它们包括:数据处理(data processing),时间序列处理( time series processing),特征分析(feature analysis),检测算法(detection algorithms)和强化模块( reinforcement module)。这些模块所提供的功能包括常见的数据预处理、时间序列数据的平滑或变换,从时域或频域中抽取特征、多种多样的检测算法以及让人类专家来校准系统。

通过这些模块提供的功能包括:通用数据预处理、时间序列数据平滑/转换、从时域/频域中提取特征、各种检测算法,以及涉及人类专业知识来校准系统。可以时间序列数据执行三种常见的异常值检测场景:逐点检测(时间点作为异常值)、模式检测(子序列作为异常值)和系统检测(时间序列集作为异常值)。

当时间序列中存在潜在的系统故障或小故障时,通常会出现逐点异常值。这种异常值存在于全局(与整个时间序列中的数据点相比)或局部(与相邻点相比)的单个数据点上。全局异常值通常很明显,检测全局异常值的常见做法是获取数据集的统计值(例如,最小值/最大值/平均值/标准偏差)并设置检测异常点的阈值。

局部异常值通常出现在特定上下文中,具有相同值的数据点如果不在特定上下文中显示,则不会被识别为异常值。检测局部异常值的常用策略是识别上下文(通过季节性趋势分解、自相关),然后应用统计/机器学习方法(例如 AutoRegression、IsolationForest、OneClassSVM)来检测异常值。

当数据中存在异常行为时,通常会出现模式异常值。模式异常值是指与其他子序列相比其行为异常的时间序列数据的子序列(连续点)。检测模式异常值的常见做法,包括不和谐分析(例如,矩阵配置文件、HotSAX)和子序列聚类。

Discords 分析利用滑动窗口将时间序列分割成多个子序列,并计算子序列之间的距离(例如,欧几里德距离)以找到时间序列数据中的不一致。子序列聚类也将子序列分割应用于时间序列数据,并采用子序列作为每个时间点的特征,其中滑动窗口的大小为特征的数量。然后,采用无监督机器学习方法,例如聚类(例如,KMeans、PCA)或逐点异常值检测算法来检测模式异常值。

当许多系统之一处于异常状态时,系统异常值会不断发生,其中系统被定义为多元时间序列数据。检测系统异常值的目标是从许多类似的系统中找出处于异常状态的系统。例如,从具有多条生产线的工厂检测异常生产线。检测这种异常值的常用方法是执行逐点和模式异常值检测以获得每个时间点/子序列的异常值分数,然后采用集成技术为每个系统生成整体异常值分数以进行比较和检测。

Scikit-learn API

在构建机器学习管道的开始,需要进行大量实验来调整或分析算法。在 TODS 中,Scikit-learn 类似 API 可用于大多数模块,允许用户灵活地将单个函数调用到实验脚本中。这是一个调用矩阵配置文件的示例,用于使用 UCR 数据集识别模式异常值。

# !pip install -e git+https://github.com/datamllab/tods.git#egg=tods  
import numpy as np   
from tods.sk_interface.detection_algorithm.MatrixProfile_skinterface import MatrixProfileSKI   
from sklearn.metrics import precision_recall_curve   
from sklearn.metrics import accuracy_score   
from sklearn.metrics import confusion_matrix   
from sklearn.metrics import classification_report   # 数据准备  
data = np.loadtxt("./500_UCR_Anomaly_robotDOG1_10000_19280_19360.txt")   X_train = np.expand_dims(data[:10000], axis=1)   
X_test = np.expand_dims(data[10000:], axis=1)   transformer = MatrixProfileSKI()   
transformer.fit(X_train)   
prediction_labels_train = transformer.predict(X_train)   
prediction_labels = transformer.predict(X_test)   
prediction_score = transformer.predict_score(X_test)   y_true = prediction_labels_train   
y_pred = prediction_labels   print('Accuracy Score: ', accuracy_score(y_true, y_pred))   confusion_matrix(y_true, y_pred)   
print(classification_report(y_true, y_pred))

结果如下:

Accuracy Score: 0.89   
precision recall f1-score support   
0 0.90 0.98 0.94 9005   
1 0.21 0.04 0.06 995   accuracy 0.89 10000   
macro avg 0.55 0.51 0.50 10000   
weighted avg 0.83 0.89 0.85 10000

自动模型发现

TODS 还利用 TODS API 提供自动模型发现。自动模型发现的目标旨在根据验证集中的标签信息和给定的计算时间限制搜索最佳管道。

import pandas as pd   
from axolotl.backend.simple import SimpleRunner   
from tods import generate_dataset, generate_problem   
from tods.searcher import BruteForceSearch   table_path = 'yahoo_sub_5.csv'   
target_index = 6 # what column is the target   
time_limit = 30 # How many seconds you wanna search   metric = 'F1_MACRO' # F1 on label 1   # Read data and generate dataset and problem   
df = pd.read_csv(table_path)   
dataset = generate_dataset(df, target_index=target_index)   
problem_description = generate_problem(dataset, metric)   # Start backend   
backend = SimpleRunner(random_seed=0)   # Start search algorithm   
search = BruteForceSearch(problem_description=problem_description,   
backend=backend)   # Find the best pipeline   
best_runtime, best_pipeline_result = search.search_fit(input_data=[dataset], time_limit=time_limit)   
best_pipeline = best_runtime.pipeline best_output = best_pipeline_result.output   
# Evaluate the best pipeline   
best_scores = search.evaluate(best_pipeline).scores

print('Search History:')   
for pipeline_result in search.history:   print('-' * 52)   print('Pipeline id:', pipeline_result.pipeline.id)   print(pipeline_result.scores)

print('Best pipeline:')   
print('-' * 52)   
print('Pipeline id:', best_pipeline.id)   
print('Pipeline json:', best_pipeline.to_json())   
print('Output:')   
print(best_output)   
print('Scores:')   
print(best_scores)

管道搜索完成后,用户可以通过管道id访问所有搜索到的管道,并保存任何管道描述文件以供后续使用。

这篇关于TODS:一款功能强大的多元时间序列异常检测工具的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/452389

相关文章

Feign Client超时时间设置不生效的解决方法

《FeignClient超时时间设置不生效的解决方法》这篇文章主要为大家详细介绍了FeignClient超时时间设置不生效的原因与解决方法,具有一定的的参考价值,希望对大家有一定的帮助... 在使用Feign Client时,可以通过两种方式来设置超时时间:1.针对整个Feign Client设置超时时间

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

Java异常架构Exception(异常)详解

《Java异常架构Exception(异常)详解》:本文主要介绍Java异常架构Exception(异常),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. Exception 类的概述Exception的分类2. 受检异常(Checked Exception)

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

Java报NoClassDefFoundError异常的原因及解决

《Java报NoClassDefFoundError异常的原因及解决》在Java开发过程中,java.lang.NoClassDefFoundError是一个令人头疼的运行时错误,本文将深入探讨这一问... 目录一、问题分析二、报错原因三、解决思路四、常见场景及原因五、深入解决思路六、预http://www

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

一文带你深入了解Python中的GeneratorExit异常处理

《一文带你深入了解Python中的GeneratorExit异常处理》GeneratorExit是Python内置的异常,当生成器或协程被强制关闭时,Python解释器会向其发送这个异常,下面我们来看... 目录GeneratorExit:协程世界的死亡通知书什么是GeneratorExit实际中的问题案例

Python如何获取域名的SSL证书信息和到期时间

《Python如何获取域名的SSL证书信息和到期时间》在当今互联网时代,SSL证书的重要性不言而喻,它不仅为用户提供了安全的连接,还能提高网站的搜索引擎排名,那我们怎么才能通过Python获取域名的S... 目录了解SSL证书的基本概念使用python库来抓取SSL证书信息安装必要的库编写获取SSL证书信息

Java捕获ThreadPoolExecutor内部线程异常的四种方法

《Java捕获ThreadPoolExecutor内部线程异常的四种方法》这篇文章主要为大家详细介绍了Java捕获ThreadPoolExecutor内部线程异常的四种方法,文中的示例代码讲解详细,感... 目录方案 1方案 2方案 3方案 4结论方案 1使用 execute + try-catch 记录