【问题标题】:Sklearn SVM - UndefinedMetricWarningSklearn SVM - UndefinedMetricWarning
【发布时间】:2018-08-11 20:54:59
【问题描述】:

我正在用 Python 进行分类任务,将不同乐器的音频文件分类到各自的类中,在我的例子中,有 4 个类,分别是铜管乐器、弦乐、打击乐器和木管乐器。我使用了 3 种不同的算法,k-Nearest Neighbor、朴素贝叶斯和 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)

#k-NN Classifier
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train,y_train)
knn_pred = knn.predict(X_test)
print(metrics.classification_report(y_test,knn_pred)

#Naive Bayes Classifier
nb = GaussianNB()
nb.fit(X_train,y_train)
nb_pred = nb.predict(X_test)
print(metrics.classification_report(y_test,nb_pred)

#SVM Classifier
svm = SVC()
svm.fit(X_train,y_train)
svm_pred = knn.predict(X_test)
print(metrics.classification_report(y_test,svm_pred)

当我尝试运行此代码时,我的 SVM 分类器出现问题。错误代码如下所示:

      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 类,这导致 Woodwind 类的 Precision 和 F1-Score 值为 0.0。这个问题只发生在 SVM 分类器上,尽管我对所有 3 种算法都使用了相同的训练集。有谁知道如何解决这个问题?

注意:我的所有 4 个类的数据集都不平衡,我怀疑这可能会触发此错误

【问题讨论】:

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


【解决方案1】:

我想我知道你的问题是什么。可能是因为 SVM 分类器没有正确分类 Woodwind 类的任何实例。然后,当他尝试计算 Woodwind 类的精度时,他得到 0,因为要计算精度,他会这样做:

真阳性除以(真阳性+假阳性)。

但是真阳性的值等于0,那么他不能计算0除以某物。所以这就是为什么精度分数的值为 0。召回和 F1 也会发生同样的事情。

请记住,真正的肯定是被分类器正确分类的 Woodwind 类的实例数。

【讨论】:

    猜你喜欢
    • 2017-04-21
    • 2020-05-14
    • 2015-04-25
    • 2021-03-17
    • 2016-05-11
    • 2018-09-25
    • 2015-07-04
    • 2020-07-16
    • 2013-11-13
    相关资源
    最近更新 更多