Python Scikit-Learn SVM - 没有类的预测样本

时间:2018-03-04 12:22:29

标签: python python-3.x scikit-learn classification svm

我正在使用Python进行分类任务,将不同乐器的音频文件分类到各自的类中,在我的例子中有4个类,分别是Brass,String,Percussion和Woodwind。我使用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'}
  

每个类的样本数量如下:Brass = 200个样本,Woodwind = 500个样本,打击乐器= 900个样本,String = 800个样本,因此有点不平衡

我的问题是,SVM分类器是否有可能不像上面的情况那样在分类器的输出中预测一个类?

2 个答案:

答案 0 :(得分:1)

如果Woodwind在训练集中与测试集一样好,我的猜测是你的模型完全关闭,因此不能预测这个类。使用sklearns scale()

尝试缩放任何数字特征

http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.scale.html

和SVM分类器的不同内核选项

http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html

答案 1 :(得分:1)

另一个问题可能是由于如果您在拆分数据集时没有进行分层,可能是某些折叠根本不包含一个类,而其他折叠则可能。尝试使用选项stratify = y来解决问题:)