非数值y_score致sklearn roc_auc_score报ValueError问题咨询
问题核心原因
你遇到报错的本质不是pandas转ndarray生成object类型的问题,而是混淆了roc_auc_score两个入参的语义要求:
y_true(第一个入参)是真实标签,本身就支持字符串类型的二分类标签(比如'Active'/'Inactive'),源码中处理这个入参时check_array设置了dtype=None,不会强制转数值,内部会自动完成字符串标签到0/1数值的映射,不需要你提前手动编码。y_score(第二个入参)设计上就不接受字符串类型输入:这个参数要求传入模型输出的连续型预测置信度(比如正类预测概率、决策函数输出值),必须是数值类型,这也是源码中对这个入参做校验时默认要求numeric类型的原因——ROC AUC的计算逻辑依赖样本的预测分数排序,离散的分类标签(不管是字符串还是编码后的0/1硬分类结果)都不符合这个参数的输入要求,就算你手动把标签转成0/1数值传入,得到的结果也不是正确的ROC AUC值,会丢失模型的置信度排序信息。
你现在把和y_true格式完全一致的字符串分类预测结果传给了y_score,check_array尝试将字符串转为浮点数时自然会抛出ValueError。
正确使用方式
- 不要将模型
predict()方法输出的硬分类标签(即'Active'/'Inactive'这类结果)传给y_score,请传入模型输出的正类连续预测分数:比如调用model.predict_proba(X)[:, 1]获取对应正类的预测概率,得到的数值型数组可以直接传入。 - 调用时建议显式指定
pos_label='Active'参数,明确告知函数哪个类别为正类,避免内部标签映射顺序出错。 - 如果你手上只有硬分类结果、没有对应的连续预测分数,说明你选择的评估指标不匹配,此时应该使用准确率、F1值、混淆矩阵这类适配硬分类输出的指标,而不是ROC AUC。
正确调用示例如下:
from sklearn.metrics import roc_auc_score import numpy as np # y_true可直接传入字符串类型的真实标签,无需提前编码 y_true = np.array(['Active', 'Inactive', 'Active', 'Inactive'], dtype=object) # y_score必须传入数值型的正类预测分数(示例为predict_proba输出的正类概率) y_score = np.array([0.92, 0.27, 0.88, 0.15]) # 显式指定正类标签计算AUC auc_value = roc_auc_score(y_true, y_score, pos_label='Active')
内容的提问来源于stack exchange,提问作者Rhubarb
相关产品推荐
相关产品推荐

