使用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
相关产品推荐
相关产品推荐

