使用 scikit-learn 训练数据时,SVM 多类分类停止

Posted

技术标签:

【中文标题】使用 scikit-learn 训练数据时,SVM 多类分类停止【英文标题】:SVM multiclass classification halts when training data using scikit-learn 【发布时间】:2020-01-04 00:50:36 【问题描述】:

我正在使用 scikit 和 svm 将数据分为 7 个类。数据是音频,我将它们切成 30 毫秒的帧。 最后,大约有 100 万帧,每个帧都用作具有 13 个 mfcc 特征的标记样本。 当按照以下代码拟合数据时,我的 cpu 使用率保持在 20% 左右,但没有任何反应!我已经等了大约 30 个小时,但还没有完成。 是不是样本数太多了?!!

clf = SVC(C=20.0, gamma=0.00001)
clf.fit(X_train, y_train) #This is where it gets stuck

【问题讨论】:

你可以设置verbose=True让它定期报告模型训练,你可以设置max_iter来限制模型在拟合过程中的迭代次数。你gamma 的值也让我觉得非常小,默认是 1/n_features,所以在你的情况下,1/13=0.07。你也可以试试其他的内核和c值,不过verbose是个不错的入手方式 【参考方案1】:

你应该看看documentation。

拟合时间至少与样本数量成二次关系,超过数万个样本可能不切实际

此外,由于您使用的是具有 7 个类的多类问题,并且因为

多类支持是根据一对一的方案处理的。

您正在训练 21(!) 个分类器,请参阅 here。

文档建议:

对于大型数据集,请考虑改用 sklearn.linear_model.LinearSVCsklearn.linear_model.SGDClassifier,可能在 sklearn.kernel_approximation.Nystroem 转换器之后。

您是否考虑过以某种方式运行神经网络?

【讨论】:

感谢您的回答。关于 SVM 本身,我设法使用 DTW 算法减小了帧的大小,然后在 39 个 mfcc 上应用了 SVM,与 SGD 分类器 (~30%) 或 LinearSVC (40%) 相比,它产生了更好的准确度 (62%)。我现在应该试试神经网络。【参考方案2】:

作为 Quickbeam2k1 的回答细节,SVM 不能很好地扩展到这么多样本。

我建议尝试使用小型神经网络。一个多层感知器可能有 3-5 个隐藏层,每个层有 50 个神经元,应该是 13 波段 MFCC 和 7 个类别的良好起点。使用 scikit-learn,您可以使用 sklearn.neural_network.MLPClassifier。

【讨论】:

以上是关于使用 scikit-learn 训练数据时,SVM 多类分类停止的主要内容,如果未能解决你的问题,请参考以下文章

将经过训练的 SVM 从 scikit-learn 导入到 OpenCV

使用 SVM 模型和 scikit-learn 进行预测的 AttributeError

如何在 scikit-learn 中继续训练 svm 和 knn?

将 scikit-learn SVM 模型转换为 LibSVM

scikit-learn svm库使用小结

目标的缩放导致 Scikit-learn SVM 回归崩溃