【问题标题】:Error in classification report test set for machine learning with SVM in python在 python 中使用 SVM 进行机器学习的分类报告测试集错误
【发布时间】:2019-11-18 23:53:14
【问题描述】:

我将数据分成测试集和训练集,这两个集都具有目标值“0”和“1”。但是在使用 SVM 进行拟合和预测后,分类报告指出测试样本中有零个 '0',这是不正确的。

from sklearn.datasets import load_breast_cancer
data = load_breast_cancer()
df = pd.DataFrame(data = data['data'],columns=data['feature_names'])
x = df
y = data['target']
xtrain,xtest,ytrain,ytest 
= train_test_split(x,y,test_size=0.3,random_state=42)

如下所示,测试有 0 和 1,但分类报告中的支持表明没有任何 0!

!(https://i.imgur.com/wjEjIvX.png)

【问题讨论】:

  • train_test_split() 没有任何问题。它只是说明您的 SVM 没有预测任何 0。我想在训练过程中出了点问题。你能分享你的代码和数据吗?
  • 你需要展示你是如何训练它的,否则很难弄清楚发生了什么。
  • 我现在已经编辑了代码。这是来自 sklearn 数据集的乳腺癌数据集。其余的训练代码在图像中,就是这样!谢谢!

标签: python machine-learning scikit-learn svm


【解决方案1】:

(在示例中包含您的相关代码始终是个好主意,而在图片中包含

分类报告指出测试样本中有零个“0”,这是不正确的。

这是因为,从链接图像中的代码可以看出,您已经切换了classification_report 中的参数;你用过:

print(classification_report(pred, ytest)) # wrong order of arguments

确实给出了:

             precision    recall  f1-score   support

    class 0       0.00      0.00      0.00         0
    class 1       1.00      0.63      0.77       171

avg / total       1.00      0.63      0.77       171

但正确的用法(见docs)是

print(classification_report(ytest, pred)) # ytest first

给了

             precision    recall  f1-score   support

    class 0       0.00      0.00      0.00        63
    class 1       0.63      1.00      0.77       108

avg / total       0.40      0.63      0.49       171

以及以下警告消息:

C:\Users\Root\Anaconda3\envs\tensorflow1\lib\site-packages\sklearn\metrics\classification.py:1135: UndefinedMetricWarning:精度和 F 分数定义不明确,并且 在没有预测样本的标签中设置为 0.0。 '精确', 'predicted', 平均, warn_for)

因为正如 cmets 中已经指出的那样,您只能预测 1:

pred
# result:
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])

原因是另一个故事,而不是当前问题的一部分。

以下是上述的完整可重现代码:

from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_breast_cancer

X, y = load_breast_cancer(return_X_y=True)
xtrain,xtest,ytrain,ytest = train_test_split(X,y,test_size=0.3,random_state=42)

from sklearn.svm import SVC
svc=SVC()
svc.fit(xtrain, ytrain)
pred = svc.predict(xtest)

print(classification_report(ytest, pred))

【讨论】:

  • 非常感谢!下次我会记住你的建议!! :D
  • 嗨,desertnaut 和 Crossfit_Jesus。我对类似问题有一个悬而未决的问题,数据集存在不平衡类问题。如果您可以看一下并向我解释 Crossfit_Jesus,如果以及如何解决该问题,那将很有帮助。如果您想查看,请点击此处的链接:stackoverflow.com/questions/67537605/…。谢谢
猜你喜欢
  • 2021-10-27
  • 2021-04-28
  • 2020-12-10
  • 1970-01-01
  • 2013-07-19
  • 1970-01-01
  • 2020-05-29
  • 1970-01-01
  • 2012-11-16
相关资源
最近更新 更多