将来自传感器的时间序列数据用于 ML
您有用于测量加速度的时间序列数据。您确定机器何时处于其标称状态 (OFF) 和异常状态 (ON)。这个问题最好使用异常检测算法来解决。但是,有很多方法可以解决这个问题。
准备数据
所有方法都将依赖于您选择的特征提取方法。假设我们按照您的建议继续使用 3 个采样时间窗口。在此算法中,您将计算此标称状态的统计数据. 我会建议我假设你已经在做的平均值,取三个样本合成加速度的平均值。然后,您将在训练集中留下大量值定义为
在哪里是窗口中树样本的平均值。定义为
在哪里是你的样本观察和.
然后在机器处于活动状态时收集更多数据,以便.
现在您可以选择是否要在一类数据集上训练您的算法(纯异常检测)。有偏差的数据集(异常检测)或平衡良好的数据集。数据集的平衡是数据集中两个类之间的比率。2 类分类器的完美数据集是 1:1。50% 的数据属于每个类。假设您不想浪费大量电力,您似乎有一个有偏见的数据集。
请注意,没有什么能阻止您将相邻样本拆分为数据集中的实例。例如:
|
这将为为当前采样定义的特定输出创建一个 3 维输入空间。
有偏差的数据集
简单的解决方案
我建议的最简单的方法。假设您使用单个统计数据来定义整个 3 个示例窗口中发生的情况。从收集的数据中得到最大值你的名义点数() 和最小值你的异常点数()。然后取这两者之间的中间标记并将其用作您的阈值。
如果一个新的测试样本大于阈值然后分配.
您可以通过计算平均值来扩展它对于您所有的标称样品. 然后计算异常样本的平均值. 如果一个新样本更接近异常样本的平均值,则将其分类为.
但我想变得花哨!
您可以使用许多其他技术来完成这项确切的任务。
- 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]])