调用roc_auc_score报错“Data is not binary...”的解决咨询
解决roc_auc_score报错"Data is not binary and pos_label is not specified"的方案
嘿,这个问题我之前踩过类似的坑,给你几个针对性的解决方向,亲测有效:
1. 先检查真实标签y1_test的状态
你只处理了预测值predictions,但真实标签如果不符合要求也会触发这个错误:
- 先确认
y1_test的取值是否只有两个类别(二分类场景的核心要求),执行以下代码查看:
如果输出不是import numpy as np print(np.unique(y1_test))[0 1]或者两个其他的离散值(比如[1 2]),那说明你的数据集不是二分类,或者标签存在脏数据。 - 同时把
y1_test也转成整数类型,和预测值保持一致:y1_test = y1_test.astype(int)
2. 别传硬分类标签,传预测概率!
这里有个很容易忽略的细节:roc_auc_score默认需要的是预测概率/决策得分,不是离散的0/1类别标签。
决策树的predict()方法输出的是硬分类结果,而我们应该用predict_proba()获取每个样本属于正类的概率:
# 假设你的分类器变量是clf,X_test是测试集特征 predictions_proba = clf.predict_proba(X_test)[:, 1] # 取第二列,对应正类(通常是1)的概率
然后用这个概率数组去计算ROC-AUC:
from sklearn.metrics import roc_auc_score auc_score = roc_auc_score(y1_test, predictions_proba)
3. 显式指定pos_label参数
如果你的二分类标签不是默认的1作为正类(比如正类是0,或者标签是[2, 4]这种非0/1值),必须显式指定正类标签:
# 比如正类是1 auc_score = roc_auc_score(y1_test, predictions_proba, pos_label=1) # 如果正类是0 auc_score = roc_auc_score(y1_test, predictions_proba, pos_label=0)
4. 确保数组是一维的
有时候数据集加载后会变成二维数组,这也可能导致报错,把两个数组都转成一维:
y1_test = y1_test.ravel() predictions_proba = predictions_proba.ravel()
为什么你转成int数组还报错?
大概率是两个原因:要么真实标签没同步处理(类型不对或者有多余类别),要么你传入的是硬分类标签而非预测概率——roc_auc是基于排序的指标,硬分类的0/1会损失大量信息,也不符合函数的设计预期。
内容的提问来源于stack exchange,提问作者Swanand Bagve
相关产品推荐
相关产品推荐

