如何使用Isolation Forest的时间序列数据的异常检测模型

752 阅读9分钟

使用隔离森林的时间序列数据的异常检测模型

时间序列是一连串的数据点,这些数据点随着时间的推移以连续的顺序出现。一个时间序列显示了数据集中随时间变化的所有变量。

时间序列数据的例子是公司的销售额、天气记录、Covid-19案件数量、外汇兑换价格和股票价格。时间序列数据可以是分钟、小时、天、周或年。

例如,在外汇方面,我们可以记录一周内欧元和美元(EUR/USD)的每日收盘汇率。然后,一个时间序列模型可以分析这些收盘汇率以确定模式。最终,该模型根据之前的历史/观察到的收盘价,预测未来的欧元/美元汇率。

在时间序列分析和建模期间,所使用的数据集可能包含异常点。异常值/离群值是不寻常的数据点或观察值,不遵循预期的数据集模式。

异常是时间序列数据集中的尖峰或下降。异常检测是识别时间序列数据集中的异常的过程。有异常的时间序列数据集会导致在预测过程中出现不一致的结果。

我们将使用隔离森林算法来训练一个时间序列模型。我们还将绘制一个折线图来显示我们数据集中的异常情况。

前提条件

读者应该熟悉以下内容。

  • [时间序列的概念]
  • [时间序列分析和建模]

为什么要进行异常检测?

异常检测有以下好处。

  • 它有助于欺诈检测。异常检测将识别时间序列中的异常和可疑事件。异常检测模型被应用于银行和其他金融机构以检测欺诈。异常检测模型将识别可疑的活动和交易。

  • 它可以检测到时间序列数据集中的突然尖峰和下降。异常检测将解释数据集中的突然尖峰和下降。我们也将能够从数据集中获得有价值的洞察力。在预测过程中,突然出现的尖峰和下降可能会导致不一致的结果。

  • 它可以识别数据集中的噪音。噪声是不需要的和错误的数据点。噪声数据具有无意义的信息,可能会破坏训练中的时间序列模型。去除噪音将确保我们有一个高质量的数据集。

  • 它有助于识别应用程序和设备中的故障/功能障碍。该模型可以识别记录设备和应用程序性能的时间序列数据的意外变化。这些意外的变化可能与设备故障或功能失常有关。

  • 它有助于网络入侵和网络异常情况的检测。监测网络流量的模型将检测网络流量的突然变化。这些突然变化可能是由于网络攻击和其他未经授权的访问。

数据集准备

我们将准备异常检测模型将使用的数据集。我们将使用纽约出租车数据集。该数据集显示了六个月内乘坐出租车的数量。它是以30分钟为间隔的。

它将使用隔离森林算法来训练异常检测模型。该模型将能够识别我们数据集中的所有异常情况。

读取数据集

我们将使用Pandas来读取数据集。

import pandas as pd

使用这段代码来读取数据。

df = pd.read_csv('taxi_rides.csv')

要看到数据集中的行和列,请运行这段代码。

df

输出。

Rows and columns

该数据集有timestampvalue 列。timestamp 列显示记录的时间。value 列包含乘坐出租车的次数。

转换 "时间戳 "列

我们将把timestamp 列转换为DateTime格式。DateTime将允许我们对该列进行时间序列分析和操作。

我们将使用datetime Python模块。

from datetime import datetime

运行这段代码来转换timestamp 列。

df['timestamp']=pd.to_datetime(df['timestamp'])

数据集重新取样

在我们的时间序列数据集中有许多数据点。绘制所有的数据点并使之可视化可能会很困难。

我们将对时间序列数据集进行重新取样,并将其汇总到每小时的间隔中。我们使用Pandasresample 方法将其聚合到每小时的时间间隔。

df=df.set_index('timestamp').resample("H").mean().reset_index()

使用这段代码可以看到新的聚合数据集。

df

聚合数据集的输出。

Aggregated dataset

从这个输出来看,数据集已经被聚合,并且有了每小时的时间间隔。

添加新的列

我们将为我们的时间序列数据集添加两个新闻列。这些列将持有特定的时间序列值,隔离森林算法将用于训练。

小时列这一列将保存时间序列数据集中的每小时时间戳。它将显示一天中每个小时的出租车乘车情况。

df['hour']=df.timestamp.dt.hour

平日栏这一栏将保存一周中每一天的出租车乘坐次数。它将显示一周内不同天数的出租车乘坐次数是如何变化的。

df['weekday']=pd.Categorical(df.timestamp.dt.strftime('%A'), categories=['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday', 'Sunday'], ordered=True)

使用这段代码可以看到添加了列的新数据集。

df

输出。

New columns

绘制折线图

我们将绘制两个折线图。第一个折线图将显示一周内每一天的出租车乘坐次数。第二个折线图将显示一天中每个小时的出租车乘车次数。我们将使用Matplotlib绘制折线图。

让我们导入Matplotlib。

import matplotlib as mpl
import matplotlib.pyplot as plt

第一张折线图

使用这个代码片断。

df[['value','weekday']].groupby('weekday').mean().plot()

线形图输出。

First line chart

上面的折线图显示了一周内每一天记录的出租车乘坐次数。从这个折线图来看,工作日(周一至周五)期间乘坐出租车的数量增加。这是因为大多数人都要去上班。在周末,乘车次数减少。大多数人都在家里,不需要乘坐出租车。

第二张线图

使用这个代码片断。

df[['value','hour']].groupby('hour').mean().plot()

线形图输出。

Second line chart

上面的折线图显示了一天中每个小时内记录的出租车乘车次数。在上午时段(5-10点),乘坐出租车的数量增加或更多。大多数人在这个时候要去上班。另外,在傍晚时分,乘车次数也较多,因为大多数人下班回家。

我们还将绘制一个详细的折线图来显示所有的数据点。

绘制详细的折线图

我们将使用Plotly Express库来绘制一个详细的折线图。它将显示聚合的时间序列数据集中的所有数据点。

让我们导入Plotly Express。

import plotly.express as px

要绘制折线图,请使用这个代码段。

fig = px.line(df.reset_index(), x='timestamp', y='value', title='TAXI RIDES')
fig.update_xaxes(
    rangeslider_visible=True,
)
fig.show()

详细的折线图输出。

Detailed line chart

我们已经准备好了我们的数据集并将数据点可视化。让我们开始使用Isolation Forest构建异常检测模型。

使用隔离森林构建异常检测模型

隔离森林是一种用于异常检测的无监督算法。它不需要标记的时间序列数据集来识别异常情况。

让我们导入一个隔离森林算法。

from sklearn.ensemble import IsolationForest

隔离森林(IF),与随机森林类似,是基于决策树建立的。一个IF算法在时间序列数据集中随机选择特征。然后,它使用一个基于树的结构对数据点进行子采样。

隔离森林建立多个决策树,以便决策树的每个叶子都能隔离时间序列数据集中的数据点。树的每一片叶子正好从数据集中隔离出一个观察点。

该数据点既可以是异常点,也可以不是异常点。让我们来初始化隔离森林算法。

初始化隔离森林算法

要初始化Isolation Forest算法,请使用以下代码。

model =  IsolationForest(contamination=0.004)

IsolationForest 有一个contamination 的参数。这个参数指定了我们的时间序列数据中的异常点的数量。它设定了我们数据中异常点的百分比。我们把这个值设置为0.004% 。它将决定数据集被异常点 "污染 "的程度。

让我们对时间序列数据拟合隔离森林模型。

拟合隔离森林模型

我们将使用fit 函数。

model.fit(df[['value']])

value 将训练隔离森林模型。它将学习并识别异常情况。

我们现在可以使用训练好的隔离森林模型来进行预测。该模型将识别时间序列数据集中的异常情况。

使用隔离森林模型进行预测

要使用训练好的隔离森林模型进行预测,请使用下面的代码片断。

df['outliers']=pd.Series(model.predict(df[['value']])).apply(lambda x: 'yes' if (x == -1) else 'no' )

上面的代码为数据集添加了一个新的outliers 列。该列将被标记为yesnoyes 将显示异常数据点。no 将显示正常数据点。

我们使用predict 函数来进行预测。让我们来显示所有的异常数据点。

异常数据点

我们使用query 方法来显示所有的异常数据点。

df.query('outliers=="yes"')

异常数据点输出。

Anomalous data points

上面显示的所有数据点都是异常的。让我们绘制一个线图来显示我们数据集中的异常点。

显示我们数据集中的异常点

我们将使用Plotly Express来显示我们数据集中的所有异常点。要显示异常情况,请运行这段代码。

fig = px.scatter(df.reset_index(), x='timestamp', y='value', color='outliers', hover_data=['weekday'], title='TAXI DRIVES')
fig.update_xaxes(
    rangeslider_visible=True,
)
fig.show()

Ploty Express diagram

上面的Ploty Express图显示了异常数据点/异常值(橙色点)和正常数据点(蓝色点)。

我们已经检测到了时间序列数据集中的异常点,并进行了绘制和可视化。

总结

在本教程中,我们学习了如何对时间序列数据进行异常检测。我们使用Isolation Forest算法创建了异常检测模型。我们讨论了异常检测的好处,以及它如何帮助解释数据集中的尖峰和下降。

我们准备了数据集,以便可以使用异常检测模型。最后,我们使用准备好的数据集来建立模型。使用本教程,你应该能够检测、绘制和可视化时间序列数据集中的异常情况。