绘制朴素贝叶斯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曲线。
解决方案
- 修正
roc_curve的传入参数
不对模型输出做硬分类截断,提取测试集对应的正类预测概率值传入接口,以sklearn框架的朴素贝叶斯模型为例:# 获取所有测试样本属于正类的预测概率,替代硬分类的y_pred y_score = nb_model.predict_proba(X_test)[:, 1] fpr, tpr, thresholds = roc_curve(y_test, y_score) - 计算标量形式的AUROC值
用roc_auc_score计算整体AUROC指标,得到单个浮点数结果,替代之前错误传入的数组:from sklearn.metrics import roc_auc_score auroc = roc_auc_score(y_test, y_score) - 修正绘图逻辑
替换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
相关产品推荐
相关产品推荐

