时间序列分类的特征提取

机器算法验证 机器学习 时间序列 支持向量机 特征工程 信号处理
2022-04-15 03:18:28

我将电信号表示为 2(内部)d 数据。每个数据点的格式为(<timestamp>, <power_value>)我希望能够区分信号窗口可以属于的 4 种不同状态。

为了让您更好地理解,这里有一个信号看起来如何的例子

原始功率数据

在这里,我们可以看到代表的所有 4 个不同的状态。

  • 关闭- 信号完全静止并且在这种情况下其幅度低于标准偏差。你可以在剧情结束前看到一小部分

  • 空闲- 当信号静止但其幅度接近平均水平时。就像在剧情的开始。

  • 待机- 信号有一些明显变化的区域,例如在第二个尖峰之后。

  • - 变化多且频率高的区域

我希望能够确定指定长度窗口(长度也是必须讨论的)属于哪些状态。

到目前为止,我所做的非常简单,而且有点业余。我只使用两个特征训练了一个随机森林,一个窗口的平均值和一个窗口的方差。为了运行分类,我在滑动窗口上应用分类,并且每次标记第一个数据点。

我开始这样做是因为起初分类必须能够区分 3 种状态(关闭、空闲、开启),即使使用这些简单的统计特征也很容易。我什至可以纠正一个简单的 if-then-else 而不是训练决策树,结果将同样准确,因为这三个状态对于这些特征具有非常不同的值。但是随着添加第四个状态,分类器会失败很多。这很正常。在上面的图片中可能没有很好地描述它,但Stand-ByOn,在特定区域,有一些共同的方差和平均值。

我对采用模式匹配方法不感兴趣,尽管这可以有力地解决所有这些问题,但这也意味着我必须创建一组参考模式,这会产生许多不同的含义。

我正在寻找的是一组功能,使我能够有效地区分这些状态。首先,您认为这可能吗?

我的理解告诉我,也许一组频域特征可以提高准确性。我只使用过一次这样的功能(MFCC),用于音频分类,但这不适用于这种情况。

如果您认为这是可能的,您能否推荐一组可以尝试的功能,或者向我指出您认为非常适合这种情况的研究?

更新

在 MikeP 的建议之后,我使用 Octavespecgram和默认参数创建了一个频谱图

这是信号的一个实例 在此处输入图像描述

这是光谱图 在此处输入图像描述

更新2

在解决这个问题几天后,我设法取得了一些进展。我尝试了不同的功能集并添加了一些新功能。

我所做的是通过添加偏度和峰度来扩展我的统计特征。我还通过添加与参考模式(每个状态之一)的 dtw 距离来转向更多模式匹配方法。最后一步大大改善了滑动窗口分类的结果。

我的问题仍然在于我用于分类的滑动技术,因为每次窗口落入中间(也未标记)情况时,分类器都很难断定它看到的是什么。

我现在要做的是使用 SVM 而不是带有多项式内核(4 级)的 RandomForests。我正在使用scikit-learn实现。问题是分类器总是将数据分类为state_3我想我在施加某种偏见,但我不知道为什么以及如何。你有什么想法可能会出错吗?

为了了解标记的外观,这里有一些标记的信号实例

在此处输入图像描述

更新3

我没有使用多项式内核,而是为 SVM 使用了线性内核,并且分类器工作正常。实际上,我得到了迄今为​​止最好的结果。我可能需要额外工作以使整个分类管道更高效,因为 svm 和额外的特征提取使一切变得非常缓慢

1个回答

根据我的经验,通常对不同特征的大量计算以及随后对其重要性的检查可以产生有趣的见解。您可以使用 python 包tsfresh自动提取大量特征并根据它们的重要性过滤它们。

您描述了您计算了频域、偏度和峰度特征。这些也包含在 tsfresh 中。但是还有大量其他时间序列特征也可以用作音频分类的潜在特征。有简单的特征,例如平均值、时间序列相关的特征,例如 AR 模型的系数,或高度复杂的特征,例如增强的 dickey fuller 假设检验的检验统计量。

因此,关于您的问题:您可以在此处找到有关 tsfresh 计算功能的文档中有关其他功能的灵感

免责声明:我是 tsfresh 的作者之一。