如何解决Cubic SVM计算AUC时出现的TypeError错误?
解决多分类Cubic SVM计算AUC时的TypeError错误
错误原因分析
SVC.predict()返回的是类别标签(如1-8的整数),而非各类别的概率值,你用np.argmax(y_prob, axis=0)处理单个类别标签,会得到单元素数组(Singleton array),不符合roc_auc_score的输入要求。- 默认
SVC不输出概率估计,必须显式开启概率计算功能。 - 多分类场景下计算AUC,
roc_auc_score需要接收每个样本在各个类别上的概率值,而非单一类别标签。
修正步骤
- 修改SVC初始化参数:添加
probability=True,让模型支持输出概率估计。 - 获取类别概率:用
predict_proba()代替predict(),得到形状为(n_samples, n_classes)的概率矩阵。 - 调整AUC计算逻辑:直接用真实标签和概率矩阵计算AUC,无需额外的
argmax处理。
修正后的代码
import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.metrics import roc_auc_score from sklearn.svm import SVC # 假设X和y是你的特征与目标变量 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 初始化三次多项式核SVC,开启概率计算 model1 = SVC(kernel='poly', degree=3, probability=True, random_state=42) model1.fit(X_train, y_train) # 获取每个样本在各类别上的概率 y_prob = model1.predict_proba(X_test) # 计算多分类AUC(ovr模式:One-vs-Rest) auc = roc_auc_score(y_test, y_prob, multi_class='ovr') print(f"多分类AUC值:{auc}")
额外说明
- 若目标变量y是1-8这类非0起始的整数,
roc_auc_score仍能正常处理,它会自动识别类别数量。 probability=True会增加模型训练时间,因为需要额外的Platt缩放生成概率估计。
内容的提问来源于stack exchange,提问作者Farshadih7
相关产品推荐
相关产品推荐

