将来自传感器的时间序列数据用于 ML

数据挖掘 机器学习 时间序列 特征工程
2021-10-10 11:48:24

我有一个小项目的以下数据。它来自位于洗衣机/烘干机顶部的加速度计,我希望它告诉我机器何时完成。

数据

x 是输入数据(x/y/z 移动为一个值),y 是标签开/关

因为 y=1 和 y=0 的 x 值重叠,所以我正在考虑使用 x 和滚动 3 分钟窗口作为 SVM 的输入:

xyz60=res.xyz.resample("60S").max()
X["x"]=xyz60
X["max3"]=xyz60.rolling(window=3, min_periods=1).max()

数据

这是解决此类问题的好方法吗?是否有可能产生更好结果的替代方案?

1个回答

您有用于测量加速度的时间序列数据。您确定机器何时处于其标称状态 (OFF) 和异常状态 (ON)。这个问题最好使用异常检测算法来解决。但是,有很多方法可以解决这个问题。

准备数据

所有方法都将依赖于您选择的特征提取方法。假设我们按照您的建议继续使用 3 个采样时间窗口。在此算法中,您将计算此标称状态的统计数据是的=0. 我会建议我假设你已经在做的平均值,取三个样本合成加速度的平均值。然后,您将在训练集中留下大量值小号定义为

小号={s0,s1,...,sn}

在哪里s是窗口中树样本的平均值。s定义为

s一世=13ķ=一世-2一世Xķ

在哪里X是你的样本观察和一世2.

然后在机器处于活动状态时收集更多数据,以便是的=1.

现在您可以选择是否要在一类数据集上训练您的算法(纯异常检测)。有偏差的数据集(异常检测)或平衡良好的数据集。数据集的平衡是数据集中两个类之间的比率。2 类分类器的完美数据集是 1:1。50% 的数据属于每个类。假设您不想浪费大量电力,您似乎有一个有偏见的数据集。

请注意,没有什么能阻止您将相邻样本拆分为数据集中的实例。例如:

X一世 X一世-1 X一世-2 | 是的一世

这将为为当前采样定义的特定输出创建一个 3 维输入空间。


有偏差的数据集


简单的解决方案

我建议的最简单的方法。假设您使用单个统计数据来定义整个 3 个示例窗口中发生的情况。从收集的数据中得到最大值s你的名义点数(是的=0) 和最小值s你的异常点数(是的=1)。然后取这两者之间的中间标记并将其用作您的阈值。

如果一个新的测试样本s^大于阈值然后分配是的=1.

您可以通过计算平均值来扩展它s对于您所有的标称样品是的=0. 然后计算异常样本的平均值是的=1. 如果一个新样本更接近异常样本的平均值,则将其分类为是的=1.

但我想变得花哨!

您可以使用许多其他技术来完成这项确切的任务。

  • k-最近邻
  • 神经网络
  • 线性回归
  • 支持向量机

简而言之,几乎所有机器学习算法都非常适合此目的。这仅取决于您可以使用多少数据及其分布。


我真的很想用 SVM


如果是这种情况,请将三个样品完全分开。如上所述,您的训练矩阵将包含 3 列。然后你就会有你的输出是的. 在 python 中使用 SVM 非常简单:http ://scikit-learn.org/stable/modules/svm.html 。

from sklearn import svm

X = [[0, 0, 0], [1, 1, 1], ..., [1, 0, 1]] 
y = [0, 1, ..., 1]
clf = svm.SVC()
clf.fit(X, y)  

这会训练你的模型。然后你会想要预测一个新样本的结果。

clf.predict([[2., 2., 1]])