使用PyCaret对时间序列数据进行无监督异常检测的分步教程

介绍

这是有关使用PyCaret的无监督异常检测模块检测时间序列数据异常的循序渐进,入门者友好的教程。

本教程的学习目标

  • 什么是异常检测?异常检测的类型。
  • 业务中的异常检测用例。
  • 使用PyCaret训练和评估异常检测模型。
  • 标记异常并分析结果。

PyCaret

PyCaret是开放源代码,低代码的机器学习库和Python内置的端到端模型管理工具,用于自动化机器学习工作流程。它以其易用性,简单性以及快速高效地构建和部署端到端ML原型的能力而广受欢迎。

PyCaret是一个备用的低代码库,可用于仅用几行代码替换几百行代码。这使得实验周期成倍快速高效。

在PyCaret中执行的所有操作都顺序存储在完全自动化的管道中以进行部署。无论是输入缺失值,一键编码,转换分类数据,功能工程,甚至是超参数调整,PyCaret都能自动执行所有操作。

安装PyCaret

安装PyCaret非常容易,只需几分钟。强烈建议使用虚拟环境,以避免与其他库冲突。

PyCaret的默认安装是pycaret的超薄版本,仅安装此处列出的硬依赖项。

# 安装迷你版本 (默认)
pip install pycaret
# 安装完整版
pip install pycaret[full]

什么是异常检测

异常检测是一种用于识别稀有物品,事件或观察结果的技术,该发现与大多数数据有明显差异,从而引起怀疑。

通常,异常项将转换为某种问题,例如:

  • 银行欺诈,
  • 结构缺陷
  • 医疗问题
  • 错误等

异常检测算法可以大致分为以下几类:

A)监督的:当数据集具有标识哪些交易是异常交易和哪些交易是正常交易的标签时使用。(这类似于监督分类问题)

B)无监督:无监督意味着没有标签,并且模型对完整数据进行了训练,并假设大多数实例是正常的。

C)半监督:仅在正常数据上训练模型(没有任何异常)。当训练模型用于新数据点时,它可以预测新数据点是否正常(基于训练模型中数据的分布)。

PyCaret异常检测模块

PyCaret的异常检测模块是一种无监督的机器学习模块,用于识别稀有物品事件观察结果。它提供了15种以上的算法和多张图,以分析经过训练的模型的结果。

数据集

我将使用NYC出租车乘客数据集,其中包含2014年7月至2015年1月每半小时间隔的出租车乘客人数。您可以从此处下载数据集。

import pandas as pd
data = pd.read_csv('https://nyc_taxi.csv')
data['timestamp'] = pd.to_datetime(data['timestamp'])
data.head()
# 建立移动平均
data['MA48'] = data['value'].rolling(48).mean()
data['MA336'] = data['value'].rolling(336).mean()# plot
import plotly.express as px
fig = px.line(data, x="timestamp", y=['value', 'MA48', 'MA336'], title='NYC Taxi Trips', template = 'plotly_dark')
fig.show()

数据准备

由于算法无法直接使用日期或时间戳记数据,因此我们将从时间戳记中提取特征,并在训练模型之前删除实际的时间戳记列表。

# 删除移动平均列
data.drop(['MA48', 'MA336'], axis=1, inplace=True)
# 将时间戳设置为索引数据
data.set_index('timestamp', drop=True, inplace=True)
# 将时间序列重新采样为每小时
data = data.resample('H').sum()
# 数据中的生物特征
data['day'] = [i.day for i in data.index]
data['day_name'] = [i.day_name() for i in data.index]
data['day_of_year'] = [i.dayofyear for i in data.index]
data['week_of_year'] = [i.weekofyear for i in data.index]
data['hour'] = [i.hour for i in data.index]
data['is_weekday'] = [i.isoweekday() for i in data.index]
data.head()

实验设置

该setup功能是PyCaret中所有模块的共同点,是在PyCaret中启动任何机器学习实验的第一步,也是唯一的必需步骤。除了默认情况下执行一些基本处理任务外,PyCaret还提供了广泛的预处理功能

# init setup
from pycaret.anomaly import *
s = setup(data, session_id = 123)

每当您setup在PyCaret中初始化函数时,它都会剖析数据集并推断所有输入要素的数据类型。在这种情况下,您可以看到day_name并被is_weekday推断为分类的,而被推断为数字的。您可以按Enter继续。

模型训练

要检查所有可用算法的列表:

#检查可用模型的列表
models()

在本教程中,我使用的是Isolation Forest,但是您可以将下面代码中的ID“ iforest”替换为其他任何模型ID,以更改算法。

iforest = create_model('iforest', fraction = 0.1)
iforest_results = assign_model(iforest)
iforest_results.head()

请注意,添加了两个新列,即Anomaly 包含离群值1和离群值0,Anomaly_Score 这是一个连续值,也称为决策函数(在内部,该算法将计算得分,以此来确定异常)。

#检查异常
iforest_results [iforest_results ['Anomaly'] == 1] .head()

现在,我们可以在图形上绘制异常以可视化。

import plotly.graph_objects as go
#在y轴上绘制值,在x轴上绘制日期
fig = px.line(iforest_results, x=iforest_results.index, y="value", title='NYC TAXI TRIPS - UNSUPERVISED ANOMALY DETECTION', template = 'plotly_dark')
#创建outlier_dates的列表
outlier_dates = iforest_results[iforest_results['Anomaly'] == 1].index
#获取异常值的y值以绘制
y_values = [iforest_results.loc[i]['value'] for i in outlier_dates]
fig.add_trace(go.Scatter(x=outlier_dates, y=y_values, mode = 'markers',
                name = 'Anomaly',
                marker=dict(color='red',size=10)))

fig.show()

请注意,该模型在新年前夕的1月1日左右选择了几个异常。该模型还检测到了1月18日至1月22日之间的一些异常,

如果您在图表上搜索其他红色点附近的日期,则可能能够找到模型为何将这些点选为异常的线索(希望如此)

希望您会喜欢PyCaret的易用性和简单性。在短短的几行代码和几分钟的实验中,我训练了一个无监督的异常检测模型,并标记了数据集以检测时间序列数据上的异常。

(0)

相关推荐