从多变量时间序列间隔检测罕见事件

Pet*_*ron 13 c# classification machine-learning time-series sequence

给定传感器状态间隔的时间序列,如何实现分类器,该分类器从监督的训练数据中学习以基于状态间隔序列来检测事件?为简化问题,传感器状态减少到truefalse.

更新:我发现本文(PDF)关于时间间隔的挖掘序列,它解决了类似的问题.关于采用多变量时间序列中的分层时间模式的另一篇论文(Google Docs)采用了一种新颖的方法,但处理分层数据.

示例培训数据

下面的数据是用于一个事件,表示为图形随着时间的推移,在一个训练样例/¯¯¯\表示true状态间隔和\___/一个false用于传感器状态的时间间隔.

 Sensor   |  Sensor State over time
          |  0....5....10...15...20...25...  // timestamp
 ---------|--------------------------------
 A        |  ¯¯¯¯¯¯¯¯¯¯¯¯\________/¯¯¯¯¯¯¯¯
 B        |  ¯¯¯¯¯\___________________/¯¯¯¯
 C        |  ______________________________  // no state change
 D        |  /¯\_/¯\_/¯\_/¯\_/¯\_/¯\_/¯\_/¯
 E        |  _________________/¯¯¯¯¯¯¯¯\___
Run Code Online (Sandbox Code Playgroud)

事件检测与序列标记与分类

我最初将我的问题概括为一个两类序列标签问题,但我的类别实际上代表了"正常操作"和罕见的"警报事件",因此我将我的问题重新定义为事件检测.训练数据可用于"正常操作"和"警报事件".

为了减少问题的复杂性,我将传感器事件离散化为布尔值,但不一定是这种情况.

可能的算法

隐马尔可夫模型似乎是一种可能的解决方案,但是它能够使用状态区间吗?如果序列标签不是解决此问题的最佳方法,则可以理解其他建议.

贝叶斯概率方法

传感器活动会随时间变化很大(早上很忙,晚上很安静).我最初的方法是在几天内测量正常的传感器状态,并按时间(小时)计算状态概率.传感器状态在不可能的一小时超过"不可能阈值"的组合概率将表明事件.但是,如果传感器有噪音,这似乎会引起误报.我还没有实现这个,但我相信这种方法是有价值的.

特征提取

矢量状态可以表示为在特定时间发生并持续特定持续时间的状态间隔变化.

struct StateInterval
{
    int sensorID;
    bool state;
    DateTime timeStamp;
    TimeSpan duration; 
}
Run Code Online (Sandbox Code Playgroud)

例如.进程表中的一些状态间隔:

[ {D, true, 0, 3} ]; [ {D, false, 4, 1} ]; ...
[ {A, true, 0, 12} ]; [ {B, true, 0, 6} ]; [ {D, true, 0, 3} ]; etc.
Run Code Online (Sandbox Code Playgroud)

一个好的分类器会考虑状态值区间和最近的状态变化,以确定状态变化的组合是否与一个类别的训练数据紧密匹配.

编辑:关于如何从多个传感器的报警数据中提取特征以及如何将其与以前的数据进行比较之后的一些想法...

首先计算每天每小时的每个传感器的以下数据:

  • 平均状态间隔长度(用于truefalse状态)
  • 状态变化之间的平均时间
  • 状态变化随时间变化

然后可以将每个传感器与矩阵中的每个其他传感器进行比较,其数据如下:

  • 传感器A完成后传感器B变为真状态所需的平均时间.如果平均值是60秒,那么1秒的等待比120秒的等待更有趣.
  • 传感器A处于一种状态时传感器B的平均状态变化次数

给定两组训练数据,分类器应该能够从这些特征集中确定哪个是最可能的分类类别.

这是一种明智的方法吗?比较这些功能的好算法是什么?


编辑:状态更改(false->truevs true-false)的方向很重要,因此任何功能都应考虑到这一点.

Amr*_*mro 7

一个简单的解决方案是折叠数据的时间方面,并将每个时间戳作为一个实例.在这种情况下,传感器的值被视为您的特征向量,其中每个时间步都标有类别A或B的类值(至少对于标记的训练数据):

   sensors      | class
A  B  C  D  E   |
------------------------- 
1  1  1  0  0   |  catA
1  0  0  0  0   |  catB
1  1  0  1  0   |  catB
1  1  0  0  0   |  catA
..
Run Code Online (Sandbox Code Playgroud)

此输入数据被馈送到通常的分类算法(ANN,SVM,...),目标是预测未标记时间序列的类别:

   sensors      | class
A  B  C  D  E   |
------------------------- 
0  1  1  1  1   |   ?
1  1  0  0  0   |   ?
..
Run Code Online (Sandbox Code Playgroud)

降维/特征提取的中间步骤可以改善结果.

显然,这可能不如对序列的时间动态建模一样好,特别是因为诸如隐马尔可夫模型(HMM)之类的技术考虑了各种状态之间的转换.


编辑

根据您在下面的评论,似乎获得目标类的较少暂时预测的最佳方法是在预测阶段结束时应用后处理规则,并将分类输出视为连续预测序列.

这种方法的工作方式是你可以计算类后验概率(即:一个实例属于每个类标签的概率分布,在二进制SVM的情况下很容易从决策函数中导出),然后给定一个指定的阈值,你检查预测类的概率是否高于该阈值:如果是,我们使用该类预测当前时间戳,如果不是,那么我们保持先前的预测,对于未来的实例也是如此.这具有向当前预测添加一定惯性的效果.