You need to enable JavaScript to run this app. 绘制朴素贝叶斯ROC曲线遇np.vectorize标量转换报错,astype(int)处理无效
优惠活动
大模型
产品
解决方案
定价
更多

绘制朴素贝叶斯ROC曲线遇np.vectorize标量转换报错,astype(int)处理无效

问题根源
  • 直接触发当前报错的原因:绘图代码中label='Naive Bayes (AUROC = %0.3f)' % y_pred这行存在逻辑错误——字符串格式化需要单个浮点数标量替换占位符,但传入的y_pred是长度等于测试集样本数的一维数组,numpy及matplotlib在处理转换逻辑时,就会抛出“only size-1 arrays can be converted to scalars”的报错,该报错和fpr、tpr的数组类型完全无关,因此你之前对fpr、tpr做astype(int)的类型转换操作从方向上就无法解决问题。
  • 存在的接口使用逻辑错误:调用roc_curve时,第二个入参要求传入模型输出的正类预测概率/决策分数,而非硬分类截断后的0/1预测值y_pred。直接传入硬分类结果会导致计算得到的fpr、tpr退化为仅包含(0,0)、(1,1)两个端点的离散值,无法生成有评估意义的连续ROC曲线。
解决方案
  1. 修正roc_curve的传入参数
    不对模型输出做硬分类截断,提取测试集对应的正类预测概率值传入接口,以sklearn框架的朴素贝叶斯模型为例:
    # 获取所有测试样本属于正类的预测概率,替代硬分类的y_pred
    y_score = nb_model.predict_proba(X_test)[:, 1]
    fpr, tpr, thresholds = roc_curve(y_test, y_score)
    
  2. 计算标量形式的AUROC值
    用roc_auc_score计算整体AUROC指标,得到单个浮点数结果,替代之前错误传入的数组:
    from sklearn.metrics import roc_auc_score
    auroc = roc_auc_score(y_test, y_score)
    
  3. 修正绘图逻辑
    替换label字符串中的错误变量,即可正常出图,可补充随机分类的对角参考线优化展示效果:
    plt.plot(fpr, tpr, label=f'Naive Bayes (AUROC = {auroc:.3f})')
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positive Rate')
    # 补充随机参考线
    plt.plot([0, 1], [0, 1], 'k--', alpha=0.5)
    plt.legend()  
    plt.show()
    

注意:之前尝试的fpr.astype(int)操作会把0-1区间的连续fpr、tpr值直接截断为0或1,既无法解决字符串格式化的报错,还会将ROC曲线退化为无意义的直角折线,不应在流程中保留。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 16:54:04