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

使用SVM多分类时遭遇系列报错及AUC为nan问题求助

SVM多分类任务错误解决方案

各错误原因及修复步骤

1. numpy.AxisError: axis 1 is out of bounds for array of dimension 1

原因:

  • label_binarize中labels变量未定义,导致二值化后数组维度异常;
  • 调用roc_auc_score时传入的是模型预测的一维类别数组,而多分类ROC-AUC计算需要二维的类别概率/决策得分数组,一维数组无法适配axis=1的计算逻辑。

修复:

  • 用LabelEncoder的classes_属性定义labels(labels = le.classes_),保证类别匹配;
  • 替换clf.predict(X_test)为模型输出的概率/得分数组(predict_proba或decision_function)。

2. ValueError: Target scores need to be probabilities for multiclass roc_auc...

原因:

  • SVM默认不输出概率,SVC()未开启probability=True参数,无法生成符合要求的概率数组;
  • 直接传入预测类别而非概率/得分给roc_auc_score,不符合多分类ROC-AUC的计算规则。

修复:

  • 初始化SVC时添加probability=True,让模型输出各类别概率;
  • 使用clf.predict_proba(X_test)获取概率数组作为roc_auc_score的y_score参数。

3. 交叉验证输出AUC为nan,报错ValueError: multiclass format is not supported

原因:

  • cross_val_score默认的scoring='roc_auc'仅支持二分类,多分类场景需要自定义适配多分类的评分器;
  • OneVsOneClassifier配合默认SVC时,无法直接兼容原生roc_auc评分逻辑。

修复:

  • 用make_scorer自定义多分类ROC-AUC评分器,指定multi_class='ovo'和average='macro';
  • 确保评分器设置needs_proba=True,适配概率输入。

4. ValueError: Number of classes in y_true not equal to the number of columns in 'y_score'

原因:

  • label_binarize的classes参数与实际数据集类别数不匹配;
  • 传入roc_auc_score的y_score维度(类别数)与y_true的类别数不一致。

修复:

  • 用le.classes_作为label_binarize的classes参数,保证类别数量一致;
  • 确保y_score是N×C维度的数组(N为样本数,C为类别数),即模型输出的概率或得分矩阵。

修正后的完整代码

import pandas as pd
from sklearn.preprocessing import LabelEncoder, StandardScaler
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.svm import SVC
from sklearn.multiclass import OneVsOneClassifier
from sklearn.metrics import confusion_matrix, roc_auc_score
from sklearn.metrics import make_scorer
import numpy as np

# 数据处理
df = pd.read_excel('C:/Users/Ram Prakash/Downloads/Data.xlsx', sheet_name='Multiclass')
X = df.drop('Fault Type', axis=1)
y = df.iloc[:, 10]

le = LabelEncoder()
y = le.fit_transform(y)
labels = le.classes_  # 定义完整类别集合
n_classes = len(labels)

# 划分训练测试集并标准化
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=2021)
scaler = StandardScaler().fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)

# 初始化带概率输出的SVM分类器
clf_default = SVC(kernel='rbf', probability=True, random_state=2021)
clf = OneVsOneClassifier(clf_default).fit(X_train, y_train)

# 自定义多分类ROC-AUC评分器
roc_auc_scorer = make_scorer(roc_auc_score, multi_class='ovo', average='macro', needs_proba=True)

# 交叉验证AUC计算
cv_auc = np.mean(cross_val_score(estimator=clf, X=X_train, y=y_train, cv=5, scoring=roc_auc_scorer))
print('(Cross Validation) AUC Score:', cv_auc)

# 测试集混淆矩阵
print('(Test set) Confusion Matrix:')
print(confusion_matrix(y_test, clf.predict(X_test)))

# 测试集AUC计算
y_score = clf.predict_proba(X_test)
test_auc = roc_auc_score(y_test, y_score, average='macro', multi_class='ovo')
print('(Test set) AUC Score:', test_auc)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 12:35:03