You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中SVM模型测试集分类报告support值异常问题咨询

排查SVM分类报告测试集无'0'类的问题

咱们先一步步拆解这个问题——你说测试集实际包含0和1,但分类报告里没显示0类,大概率是模型把所有测试样本都预测成了1类,或者是报告显示的小细节没注意到,咱们挨个排查:

第一步:先实锤测试集的真实类别分布

先别管模型,先手动验证下测试集的ytest到底有没有0类,避免自己之前的判断有误(比如是不是不小心用了训练集标签?)。加几行代码打印看看:

import numpy as np
print("测试集目标值的所有类别:", np.unique(ytest))
print("测试集0和1的样本数量:", np.bincount(ytest))

这一步能彻底确认测试集的类别情况,是后续排查的基础。

第二步:调整SVM模型的参数设置

乳腺癌数据集本身是类别不平衡的(良性样本1多,恶性样本0少),而默认的SVC对不平衡数据很敏感,容易偏向预测数量多的类别。你可以试试这两个调整方向:

  • 给少数类(0类)加权重:在SVC里设置class_weight='balanced',它会根据样本数量自动调整权重,让模型更重视少数类:
    from sklearn.svm import SVC
    from sklearn.metrics import classification_report
    
    svm_model = SVC(class_weight='balanced', random_state=42)
    svm_model.fit(xtrain, ytrain)
    ypred = svm_model.predict(xtest)
    print(classification_report(ytest, ypred))
    
  • 先做特征标准化:SVM对特征尺度极其敏感,乳腺癌数据集的特征数值范围差异极大(比如mean radius是十几,worst area是几千),没标准化的话,大数值特征会主导模型。用管道把标准化和SVM绑定,还能避免数据泄露:
    from sklearn.preprocessing import StandardScaler
    from sklearn.pipeline import make_pipeline
    
    pipeline = make_pipeline(StandardScaler(), SVC(class_weight='balanced', random_state=42))
    pipeline.fit(xtrain, ytrain)
    ypred = pipeline.predict(xtest)
    print(classification_report(ytest, ypred))
    

第三步:强制分类报告显示所有类别

有时候是分类报告的默认逻辑导致没显示0类——如果模型完全没预测到0类,报告可能默认不展示。你可以手动指定labels参数,强制显示所有类别:

print(classification_report(ytest, ypred, labels=[0, 1]))

这样哪怕模型没预测到0类,报告也会显示0类的各项指标(precision、recall都是0,support是真实的0类样本数)。

第四步:检查模型的预测结果

最后,你可以直接打印预测结果的分布,确认是不是真的全是1类:

print("预测结果的所有类别:", np.unique(ypred))
print("预测结果0和1的样本数量:", np.bincount(ypred))

如果预测结果真的全是1,那就是模型参数的问题,回到第二步调整;如果预测结果有0但报告没显示,那就是第三步的参数设置问题。

内容的提问来源于stack exchange,提问作者Crossfit_Jesus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:57:25