使用 sklearn 进行音乐流派分类:如何准确评估不同的模型

Posted

技术标签:

【中文标题】使用 sklearn 进行音乐流派分类:如何准确评估不同的模型【英文标题】:Music genre classification with sklearn: how to accurately evaluate different models 【发布时间】:2017-10-13 19:11:49 【问题描述】:

我正在开展一个项目,对来自 5 种不同类型(摇滚、电子、说唱、乡村、爵士)的 30 秒音频样本进行分类。我的数据集包含 600 首歌曲,每个流派正好 120 首。特征是每首歌曲的 13 个 mfcc 的一维数组,标签是流派。 本质上,我对 30 秒样本的每一帧取每组 13 个 mfcc 的平均值。这导致每首歌曲有 13 个 mfcc。然后我得到整个数据集,并使用 sklearn 的缩放功能。

我的目标是比较 svm、最近和朴素贝叶斯分类器(使用 sklearn 工具集)。我已经进行了一些测试,但我注意到结果会因我是否进行随机抽样/分层抽样而异。

我在 sklearn 中执行以下功能来获取训练和测试集:

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=0, stratify=y)

它有参数“随机状态”和“分层”。当“随机状态”被省略时,它从整个数据集中随机采样;当设置为0时,保证训练集和测试集每次都相同。

我的问题是,我如何适当地比较不同的分类器。我假设我应该在训练和测试每个分类器之前对这个函数进行相同的调用。我怀疑我应该对每个分类器进行完全相同的拆分,所以它不应该是随机抽样,也应该分层。

或者我应该分层(和随机抽样)?

【问题讨论】:

【参考方案1】:

要评估一个分类器相对于另一个分类器的准确性,您需要从数据集中随机抽样以进行训练和测试。使用测试数据集评估每个分类器并一次性比较准确度。

给定一个存储在数据框中的数据集,将其拆分为训练和测试(随机抽样更好地深入了解您的分类器在所有情况下的性能,分层抽样有时会掩盖您的真实准确度)为什么?举个例子吧:

如果您正在对某个特定类别进行分层抽样(假设该类别具有异常大量的数据[偏斜],并且分类器可以很好地预测一个类别,您可能会认为分类器运行良好,即使在信息较少的类别上表现不佳。分层抽样在哪里工作得更好?当您知道现实世界的数据也会出现偏差并且如果正确预测最重要的类别时您会感到满意。(这肯定会并不意味着您的分类器在信息较少的类别上效果不佳,它可以很好地工作,只是分层抽样有时无法呈现全貌)

使用相同的训练数据集来训练所有分类器并使用相同的测试数据集来评估它们。另外,随机抽样会更好。

【讨论】:

以上是关于使用 sklearn 进行音乐流派分类:如何准确评估不同的模型的主要内容,如果未能解决你的问题,请参考以下文章

基于收音机播放的音乐流派分类[关闭]

机器学习之分类模型评估指标及sklearn代码实现

使用 c# 进行音乐(流派)识别

使用 K-nn 算法处理音乐流派,如何处理提取的特征? [关闭]

Sklearn:如何获得对训练数据进行分类的均方误差

sklearn:朴素贝叶斯分类器的准确性低