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

如何用Python基于自定义分类数据集计算ROC曲线及相关指标?

二分类模型性能指标计算方案

针对你提供的数据集(A列是0/1真实标签,B列是0-1的预测得分),以下是计算Sensitivity、Specificity(通过Youden指数最大化选阈值)、ROC曲线及AUC的具体步骤,以Python的scikit-learn库为例:

一、数据准备

先将真实标签和预测得分赋值给变量,替换成你自己的数据集即可:

import numpy as np
from sklearn.metrics import roc_curve, auc, confusion_matrix
import matplotlib.pyplot as plt

# 示例数据(替换为你的真实数据)
y_true = np.array([0, 1, 0, 1, 1, 0, 1, 0])  # A列:ground truth,1=阳性,0=阴性
y_score = np.array([0.2, 0.82, 0.33, 0.75, 0.91, 0.15, 0.68, 0.4])  # B列:测试结果得分

二、计算ROC曲线与AUC

ROC曲线通过遍历所有可能的阈值,计算对应的假阳性率(FPR)和真阳性率(TPR,即Sensitivity),AUC是ROC曲线下的面积,衡量模型的整体区分能力:

# 计算ROC曲线的FPR、TPR及对应阈值
fpr, tpr, thresholds = roc_curve(y_true, y_score)
# 计算AUC值
roc_auc = auc(fpr, tpr)
  • FPR = 假阳性数 / 总阴性数 = FP/(FP+TN)
  • TPR(Sensitivity)= 真阳性数 / 总阳性数 = TP/(TP+FN)
  • AUC取值范围0-1,越接近1说明模型区分阳性和阴性的能力越强

三、通过Youden指数最大化确定最优阈值,计算Sensitivity和Specificity

Youden指数的定义为 J = Sensitivity + Specificity - 1,等价于 J = TPR - FPR,我们需要找到使J最大的阈值,以此平衡Sensitivity和Specificity:

# 计算每个阈值对应的Youden指数
youden_index = tpr - fpr
# 找到最大Youden指数对应的阈值
best_idx = np.argmax(youden_index)
best_threshold = thresholds[best_idx]

# 根据最优阈值生成二分类预测结果
y_pred = (y_score >= best_threshold).astype(int)
# 计算混淆矩阵
tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()

# 计算最终的Sensitivity和Specificity
sensitivity = tp / (tp + fn)
specificity = tn / (tn + fp)
  • Sensitivity:真实阳性样本被正确识别的比例,衡量模型对阳性的检出能力
  • Specificity:真实阴性样本被正确识别的比例,衡量模型排除阴性的能力

四、ROC曲线可视化(可选)

将ROC曲线绘制出来更直观:

plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC Curve (AUC = {roc_auc:.2f})')
# 绘制随机猜测的参考线
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate (Sensitivity)')
plt.title('Receiver Operating Characteristic')
plt.legend(loc='lower right')
plt.show()

补充:R语言实现思路

如果用R语言,可以使用pROC包:

library(pROC)
# 示例数据
y_true <- c(0,1,0,1,1,0,1,0)
y_score <- c(0.2,0.82,0.33,0.75,0.91,0.15,0.68,0.4)
# 计算ROC和AUC
roc_obj <- roc(y_true, y_score)
roc_auc <- auc(roc_obj)
# 找Youden指数最大的阈值
best_threshold <- coords(roc_obj, "best", ret="threshold")
# 计算Sensitivity和Specificity
sensitivity <- coords(roc_obj, best_threshold, ret="sensitivity")
specificity <- coords(roc_obj, best_threshold, ret="specificity")
# 绘图
plot(roc_obj)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 11:06:48