时间序列是一种特殊的生物。
当我开始我的机器学习职业生涯时,我之所以这样做是因为我喜欢物理(一个奇怪的机器学习开始原因)并且从物理中我了解到我也非常喜欢编程和数据科学。我并不真的关心数据的类型。我想要的只是每天坐在电脑前编写 1 万行代码。
事实是,即使你不关心(我仍然真的很不关心),你的职业生涯也会将你引导到某些类型的数据,而不是其他类型的数据。
如果你工作在SpaceX,你可能不会做很多 NLP,但你将做很多信号处理。如果你在Netflix工作,你可能会与大量的NLP和推荐系统打交道。如果你在Tesla工作,你肯定会成为一名计算机视觉专家,并处理图像。
当我开始作为物理学家时,然后继续攻读工程学博士学位,我立刻被投入到了信号的世界。这正是工程的自然世界:每次你有一个设置并从中提取信息,最终,你都是在处理信号。请别误会,工程并不是唯一一个信号成为明星的世界。另一个非常著名的例子是金融和股票价格时间序列。这也是信号(时间与价格)的另一个例子。但如果你出于任何原因在处理信号,你应该记住这篇博客的第一句话:
时间序列是一种特殊的生物。
这意味着,你用表格数据或图像所做的许多转换/操作/处理技术对于时间序列来说可能有不同的意义(如果它们甚至有意义)。以特征提取为例。
“特征提取”的想法是在我们拥有的数据上工作,确保我们提取了所有可能的有意义特征,以便下一步(通常是机器学习应用)能够从中受益。换句话说,这是一种“帮助”机器学习步骤的方法,通过提供重要的特征并过滤掉所有不那么重要的特征。
这是完整的特征提取过程:
作者制作的照片
现在,当我们考虑特征提取器,比如表格数据和信号时,我们正在玩两种完全不同的运动。
例如,峰值和谷值的概念、傅里叶变换或小波变换的想法,以及独立成分分析(ICA)的概念,只有在处理信号时才有意义。我之所以进行这些谈话和展示,只是为了让你相信存在一套特征提取技术,这些技术只属于信号。
现在有两大类方法用于特征提取:
-
基于数据驱动的方法:这些方法旨在通过仅仅观察信号来提取特征。我们忽略机器学习步骤及其目标(例如分类、预测或回归),我们只观察信号,对其工作,并从中提取信息。
-
基于模型的方法:这些方法审视整个流程,旨在找到解决特定问题的特征。
数据驱动方法的优点是它们通常计算简单,不需要相应的目标输出。它们的缺点是特征并不特定于你的问题。例如,对信号进行傅里叶变换并将其作为特征使用,可能不如使用在端到端模型中训练的特定特征更优。
为了这篇博客文章的目的,我们将只讨论数据驱动方法。特别是,我们将讨论基于特定领域的方法、基于频率的方法、基于时间的方法和基于统计的方法。让我们开始吧!
1. 特定领域特征提取
我将要描述的第一个方法稍微有点故意模糊。现实是,提取特征的最佳方式是考虑你面临的特定问题。例如,假设你正在处理一个来自工程实验的信号,你非常关心t = 6s 后的幅度。这些是特征提取在一般情况下并不真正有意义(对于随机情况,t=6s 可能并不比 t=10s 更特殊)但对你来说实际上极其相关的情况。这就是我们所说的特定领域特征提取。我知道这并不是很多数学和编码,但这就是它的含义,因为它极其依赖于你的具体情况。
2. 基于频率的特征提取
2.1 解释
这种方法与我们的时间序列/信号的频谱分析相关。我们这是什么意思呢?如果我们观察我们的信号,我们有一个自然域。自然域是观察信号的最简单方式,它是时间域,意味着我们将信号视为在给定时间的值(或向量)。
例如,让我们考虑这个信号,在其自然域中:
如果我们绘制它,我们会得到这个:
图片由作者制作
这是自然(时间)域,也是我们数据集的最简单域。我们可以将其转换为频率域。正如我们在符号表达式中看到的,我们的信号有三个周期性成分。频率域的想法是将信号分解为其周期性成分的频率、振幅和相位。
信号 y(t)的傅里叶变换Y(k)如下:
由作者制作的照片
这描述了频率为k的成分的振幅和相位。在提取有意义特征方面,我们可以提取10个主要成分(振幅最高的那个)的振幅、相位和频率值。这些将形成 10×3 个特征(振幅、频率和相位乘以 10),用以描述基于频谱信息的时间序列。
现在,这种方法可以扩展。例如,我们可以将我们的信号分解,不是基于正弦/余弦函数,而是基于小波,这是另一种周期性波的形式。这种分解称为小波分解。
我明白这需要消化很多内容,所以让我们从编码部分开始,展示我的意思…
2.2 代码
现在,让我们在现实生活中构建它。让我们从非常简单的傅里叶变换开始。
首先,我们需要邀请一些朋友来参加派对:
现在,让我们以这个信号为例:
这个信号有三个主要成分。一个幅度为 1,频率为 1,一个幅度为 0.4,频率为 2,还有一个幅度为 2,频率为 3.2。我们可以通过运行傅里叶变换来恢复它们:
我们可以清楚地看到三个峰值,以及相应的幅度和频率。
现在,我们实际上并不需要任何花哨的绘图(那只是为了展示这种方法是可行的),但我们只需用一个非常简单的函数就能完成所有操作,这个函数就是:
所以你给我信号y,以及(可选的):
-
x或时间数组
-
需要考虑的特征数(或峰值数)
-
你愿意探索的最大频率
这是输出:
如果我们想使用**小波(而不是正弦/余弦波)**来提取特征,我们可以进行小波变换。我们需要安装这个工具:
pip install PyWavelets
然后运行这个:
*我在这篇文章这里详细讨论了小波。看看这些壮丽的生物,了解更多信息吧 😃
3. 统计特征提取
3.1 解释
特征提取的另一种方法是依靠古老的统计学。给定一个信号,你可以做很多事情来从中提取一些统计信息。按照从简单到复杂的顺序,这是我们可以提取的信息列表:
- 均值,不过是信号总和除以信号的时间步数。超级简单:
- 方差,即信号与均值之间的变化程度:
-
偏度和峰度。这些是测试你的时间序列分布“非高斯”程度的指标。偏度描述了它的不对称性,而峰度描述了它的“尾部”程度。
-
分位数:这些是将时间序列划分为具有概率范围的区间的值。例如,值为 0.25 的分位数意味着 25%的时间序列值低于 10,而剩余的 75%大于 10
-
自相关。这基本上告诉你你的时间序列“模式化”的程度,即你的时间序列中模式的强度。更正式地说,这个指标表明时间序列的值与其自身过去值的关联程度。
-
熵:表示时间序列的复杂度或不可预测性。我关于这一点写了一整篇博客文章在这里。
到 2024 年,这些属性都可以用一行代码实现(这是多么美好的时代)。这就是如何做到的:
4. 时间特征提取器
4.1 解释
在本节中,我们将专注于如何通过仅提取时间特征来提取时间序列的信息。特别是,我们将提取峰值和谷值的信息。为此,我们将使用SciPy 中的 find_peaks 函数。
有多个特征可以帮助提取信号的峰值,例如预期的宽度、预期的阈值或平台的大小。如果您有这些信息中的任何一项(例如,出于某种原因您只想考虑振幅大于 2 的峰值),您可以调整参数;否则,您可以将所有内容保留为默认设置。
我们也有特权来决定我们想要多少个峰值/特征。例如,我们可能想要 N = 10:只保留最大的 10 个峰值和谷值。但请记住,如果我们这样做,我们实际上有 Nx2 = 20 个特征(10 个位置和 10 个振幅)。
4.2 代码
像往常一样,实现这一点的代码相当简单:
请记住,如果我们选择 N = 10 个峰值,但你实际上只有 M = 4 个峰值在你的信号中,剩下的 6 个位置和峰值幅度将是 0。
5. 使用哪种方法?
好的,所以我们已经看到了 4 种不同的方法类别。
我们应该使用哪一种?
我不会用外交辞令“这取决于问题”来打击你,因为,当然,它总是取决于问题。
事实的真相是,如果你有一个基于域的特征提取,那通常是你最好的选择:如果实验的物理或问题的先验知识是清晰的,你应该依赖它,并将这些特征视为最重要的,甚至可以考虑它们是唯一的。有时(很多时候)你没有基于域的特征,但这没关系。
对于频率、统计和时间特征,我认为你应该将它们全部一起使用。你应该将这些特征添加到你的数据集中,然后看看其中的一些是否有助于,是否有帮助,或者实际上混淆了你的机器学习模型。
6. 结论
非常感谢您花时间与我交流。我想利用这个空间来总结我们所做的一切。
-
我们介绍了特征提取的概念。我们解释了为什么它很重要,以及为什么了解时间序列的具体技术很重要。
-
我们解释了基于模型和数据驱动特征提取技术之间的区别。基于模型的技术是端到端训练的特征提取技术。在这篇博客文章中,我们专注于独立于给定任务执行的数据驱动技术。
-
我们讨论了基于域的特征提取技术,这些是源自特定问题的特定技术。
-
我们讨论了频谱技术,这些技术涉及信号的傅里叶/频率频谱
-
我们讨论了统计技术,这些技术从信号中提取值,如均值、标准差、熵和自相关
-
我们讨论了基于时间的技术,这些技术从信号中提取峰值信息
-
我们简要地给出了针对您特定案例采用哪种技术的想法
7. 关于我!
再次感谢您抽出宝贵时间。这对我们意义重大 ❤
我的名字是 Piero Paialunga,我就是这里这个人:
作者制作的照片
我是在辛辛那提大学航空航天工程系的博士候选人,同时也是 Gen Nine 的机器学习工程师。我在博客文章和领英上谈论人工智能和机器学习。如果您喜欢这篇文章,并想了解更多关于机器学习的信息,以及跟随我的研究,您可以:
A. 在**领英上关注我,我在那里发布所有故事 B. 订阅我的通讯。这将让您了解新故事,并有机会给我发信息,以接收您可能有的所有更正或疑问。 C. 成为推荐会员,这样您就不会有“每月故事最大数量”的限制,您可以阅读我(以及成千上万的机器学习和数据科学顶级作家)关于最新技术的所有文章。 D. 想和我一起工作?查看我的收费和项目在Upwork**!
如果您想向我提问或开始合作,请在这里或**领英**上留言:
6230



被折叠的 条评论
为什么被折叠?



