当每个数据文件的长度不同时,如何确定输入特征的形状?

数据挖掘 机器学习 Python 神经网络 决策树 k-nn
2021-09-27 16:10:53

为了帮助我理解 、 、 的优点和缺点decision trees想构建一个简单的分类器,使用上述 3 种方法将其分类为 2 类(和)。所以我从 kaggle 下载了一个声音数据集,并正在探索pysoundfile作为一个模块来读取声音文件。所以下面的存根:KNNNeural NetworksBird SoundNon-Bird Sound

data, samplerate = sf.read('xc94652.flac')

返回一个 numpy ndarray。shape数据因每个文件而异,有些是 of (8637686,),有些是(3227894,)由于每个文件的长度data不同,因此每个文件的形状也不同。有什么方法可以使形状data相等?我打算将数据集的形状设置为所有文件中的最小长度。但它绝对不公平地处理声音文件数据集。我可能会失去这么多的特征,所以最后的模型准确性。

1个回答

数据探索

我建议进一步探索数据,这可能有助于确定这个鸟鸣数据集的最佳方法。

例如,查看每只鸟的光谱图(只有 66 种不同的属类型),看看如何从样本中提取更多数据。这是取自此处的样本的频谱图

鸟叫声谱图

我们可以看到有明显的重复模式!我们可以看到那些高大的浅绿色块断断续续地出现。所以虽然样本确实只有 70 多秒的声音,但鸟的叫声似乎真的只持续了 2 秒左右!

无论是使用简单的过滤算法,还是构建一个模型来查找这些块,您都可以提取这些块并只处理这些块,也许还有关于这些块之间间隙的数据。

这只是数据特定预处理的一个例子;我相信还有很多其他方法可以提高信息密度。

采样率

这是您可以查看的另一个自由度。一个想法是在模型的输入中接受不同的采样率。可以调整采样率以确保最终样本的长度都相同。

我的想法是使用最短样本的长度,然后对所有较长的声音片段进行定期采样,以使生成的片段与最短样本的长度相同。

这种方法显然会损害数据的质量(不规则地跨样本),但如果起始采样率足够高,您也许可以侥幸逃脱!

看看这篇有用的文章,它描述了(预处理)声波中的许多方法。

两种型号

在您的特定情况下,如果您真的只有两种可能的长度:8637686并且3227894......简单地创建两个模型可能是可行的,每个样本长度一个。这绝对不是最佳解决方案。但是,它将允许非常快速的开发和模型迭代,因为您可以使用相同的模型并且只需要更改参数即可使用数据的两个部分。

基本

除了截断较长的样本(切割它们以匹配较短/最短样本的长度 - 您可以使用填充来简单地使缩短的样本与最长样本的长度匹配。

通常,这是通过在向量的末尾简单地添加零来完成的。您还可以尝试在开头和结尾添加零,以使信息在每个样本中居中。

如果您使用 Keras 创建神经网络,最好先查看ZeroPadding1d 层