使用 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.LinearSVC
或sklearn.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?