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

调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:51:47