【发布时间】:2018-08-12 05:11:12
【问题描述】:
我正在用 Python 进行分类任务,将不同乐器的音频文件分类到各自的类中,在我的例子中,有 4 个类,分别是铜管乐器、弦乐、打击乐器和木管乐器。我使用 SVM 算法作为分类器。我的代码看起来有点像这样(我没有更改分类器的任何参数):
#X is feature matrix, y is class vector
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
#SVM Classifier
svm = SVC()
svm.fit(X_train,y_train)
svm_pred = svm.predict(X_test)
print(metrics.classification_report(y_test,svm_pred)
当我尝试运行此代码时,我遇到了分类器问题。错误代码如下所示:
precision recall f1-score support
Brass 1.00 0.21 0.34 72
Percussion 0.38 1.00 0.55 279
String 1.00 0.15 0.26 276
Woodwind 0.00 0.00 0.00 156
avg / total 0.58 0.43 0.32 783
C:\Users\Anaconda3\lib\site-packages\sklearn\metrics\classification.py:1135: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples.
当我从 SVM 分类器 (svm_pred) 检查我的预测标签时,分类器没有预测到 Woodwind 类
>>> set(svm_pred)
{'Brass','String','Percussion'}
我每个类的样本数是这样的:黄铜 = 200 个样本,木管乐器 = 500 个样本,打击乐器 = 900 个样本,弦乐 = 800 个样本,所以有点不平衡
我的问题是,SVM 分类器是否有可能像我上面的情况那样在分类器的输出中根本不预测一个类?
【问题讨论】:
-
您是否注意到您在代码中使用的是 knn.predict() 而不是 svm.predict()?
-
抱歉,打错字了。我在我的真实程序中使用了正确的( svm.predict() )并且仍然得到了上面的结果。 @KRKirov
-
如果 Woodwind 在训练集中的表现与在测试集中的表现一样好,我的猜测是你的模型完全关闭,因此不能预测这个类。尝试使用 sklearns scale() scikit-learn.org/stable/modules/generated/… 和 SVM 分类器 scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html 的不同内核选项缩放任何数值特征。
-
我尝试在参数中使用多项式内核,它提供了明显更好的结果(>90% 准确度)。 SVC() 函数的默认内核是 RBF。我该如何分析为什么会发生这种情况? @KRKirov
-
也添加缩放 - 它一定会进一步帮助您。
标签: python python-3.x scikit-learn classification svm