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/452390

相关文章

从基础到进阶详解Pandas时间数据处理指南

《从基础到进阶详解Pandas时间数据处理指南》Pandas构建了完整的时间数据处理生态,核心由四个基础类构成,Timestamp,DatetimeIndex,Period和Timedelta,下面我... 目录1. 时间数据类型与基础操作1.1 核心时间对象体系1.2 时间数据生成技巧2. 时间索引与数据

Python主动抛出异常的各种用法和场景分析

《Python主动抛出异常的各种用法和场景分析》在Python中,我们不仅可以捕获和处理异常,还可以主动抛出异常,也就是以类的方式自定义错误的类型和提示信息,这在编程中非常有用,下面我将详细解释主动抛... 目录一、为什么要主动抛出异常?二、基本语法:raise关键字基本示例三、raise的多种用法1. 抛

Java空指针异常NullPointerException的原因与解决方案

《Java空指针异常NullPointerException的原因与解决方案》在Java开发中,NullPointerException(空指针异常)是最常见的运行时异常之一,通常发生在程序尝试访问或... 目录一、空指针异常产生的原因1. 变量未初始化2. 对象引用被显式置为null3. 方法返回null

利用Python实现时间序列动量策略

《利用Python实现时间序列动量策略》时间序列动量策略作为量化交易领域中最为持久且被深入研究的策略类型之一,其核心理念相对简明:对于显示上升趋势的资产建立多头头寸,对于呈现下降趋势的资产建立空头头寸... 目录引言传统策略面临的风险管理挑战波动率调整机制:实现风险标准化策略实施的技术细节波动率调整的战略价

redis在spring boot中异常退出的问题解决方案

《redis在springboot中异常退出的问题解决方案》:本文主要介绍redis在springboot中异常退出的问题解决方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴... 目录问题:解决 问题根源️ 解决方案1. 异步处理 + 提前ACK(关键步骤)2. 调整Redis消费者组

springboot项目redis缓存异常实战案例详解(提供解决方案)

《springboot项目redis缓存异常实战案例详解(提供解决方案)》redis基本上是高并发场景上会用到的一个高性能的key-value数据库,属于nosql类型,一般用作于缓存,一般是结合数据... 目录缓存异常实践案例缓存穿透问题缓存击穿问题(其中也解决了穿透问题)完整代码缓存异常实践案例Red

Java内存区域与内存溢出异常的详细探讨

《Java内存区域与内存溢出异常的详细探讨》:本文主要介绍Java内存区域与内存溢出异常的相关资料,分析异常原因并提供解决策略,如参数调整、代码优化等,帮助开发者排查内存问题,需要的朋友可以参考下... 目录一、引言二、Java 运行时数据区域(一)程序计数器(二)Java 虚拟机栈(三)本地方法栈(四)J

解决Java异常报错:java.nio.channels.UnresolvedAddressException问题

《解决Java异常报错:java.nio.channels.UnresolvedAddressException问题》:本文主要介绍解决Java异常报错:java.nio.channels.Unr... 目录异常含义可能出现的场景1. 错误的 IP 地址格式2. DNS 解析失败3. 未初始化的地址对象解决

python利用backoff实现异常自动重试详解

《python利用backoff实现异常自动重试详解》backoff是一个用于实现重试机制的Python库,通过指数退避或其他策略自动重试失败的操作,下面小编就来和大家详细讲讲如何利用backoff实... 目录1. backoff 库简介2. on_exception 装饰器的原理2.1 核心逻辑2.2

Python日期和时间完全指南与实战

《Python日期和时间完全指南与实战》在软件开发领域,‌日期时间处理‌是贯穿系统设计全生命周期的重要基础能力,本文将深入解析Python日期时间的‌七大核心模块‌,通过‌企业级代码案例‌揭示最佳实践... 目录一、背景与核心价值二、核心模块详解与实战2.1 datetime模块四剑客2.2 时区处理黄金法