实用机器学习技巧:带有95%置信区间的ROC曲线绘制

机器学习大数据算法

picture.image

背景

picture.image

在机器学习模型的性能评估中,ROC曲线和AUC(曲线下面积)是常用的工具,它们能清晰展示模型的分类能力,但是一般ROC曲线展示的AUC值不会去展示置信区间,但是带有95%置信区间的ROC曲线在医学研究中非常常见,因为它能够更科学地体现模型的诊断性能以及不确定性范围

代码实现

数据读取


          
import pandas as pd
          
import numpy as np
          
from sklearn.model_selection import train_test_split
          
import matplotlib.pyplot as plt
          
import matplotlib.ticker as ticker
          
plt.rcParams['font.family'] = 'Times New Roman'
          
plt.rcParams['axes.unicode_minus'] = False
          
# 读取数据
          
df = pd.read_excel('2024-11-21公众号Python机器学习AI.xlsx')
          
# 划分特征和目标变量
          
X = df.drop(['y'], axis=1)
          
y = df['y']
          
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, 
          
                                                    random_state=42, stratify=df['y'])
      

从Excel文件中读取二分类数据,将数据划分为特征(X)和目标变量(y),然后按80%训练集和20%测试集的比例进行分层抽样拆分,为后续机器学习建模做好准备

logistic模型ROC曲线绘制


          
from sklearn.linear_model import LogisticRegression
          
from sklearn.metrics import roc_curve, auc, roc_auc_score
          

          
model = LogisticRegression(max_iter=1200)
          
model.fit(X_train, y_train)
          
# 预测概率
          
y_score = model.predict_proba(X_test)[:, 1]
          
# 计算 ROC 曲线
          
fpr_logistic, tpr_logistic, _ = roc_curve(y_test, y_score)
          
roc_auc_logistic = auc(fpr_logistic, tpr_logistic)
          
# 绘制 ROC 曲线
          
plt.figure(dpi=1200)
          
plt.plot(fpr_logistic, tpr_logistic, color='darkorange', lw=2, label='ROC curve (area = %0.2f)' % roc_auc_logistic)
          
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
          
# 调整显示范围,增加边距
          
plt.xlim([-0.02, 1.02])  # 左右两侧各增加一点边距
          
plt.ylim([-0.02, 1.02])  # 上下各增加一点边距
          
plt.xlabel('1 - Specificity')
          
plt.ylabel('Sensitivity')
          
plt.title('Receiver Operating Characteristic')
          
plt.legend(loc="lower right")
          
plt.savefig('Logistic_roc_curve.pdf', format='pdf', bbox_inches='tight')
          
plt.show()
      

picture.image

使用Logistic回归模型进行训练和预测,通过计算假阳性率和真阳性率绘制最常见的ROC曲线,并标注AUC值(不含95%置信区间),主要用于演示基本的ROC曲线绘制方法

AUC95% 置信区间函数定义


          
from math import sqrt
          

          
# 定义函数:计算 AUC 及其 95% 置信区间
          
def roc_auc_ci(y_true, y_score, positive=1):
          
    AUC = roc_auc_score(y_true, y_score)
          
    # 统计正类和负类的样本数
          
    N1 = sum(y_true == positive)  
          
    N2 = sum(y_true != positive)  
          
    Q1 = AUC / (2 - AUC)          # Q1 是 AUC 在正类样本上的一个调整量
          
    Q2 = 2 * AUC**2 / (1 + AUC)   # Q2 是 AUC 在负类样本上的一个调整量
          
    # 计算 AUC 的标准误差
          
    SE_AUC = sqrt((AUC * (1 - AUC) + (N1 - 1) * (Q1 - AUC**2) + (N2 - 1) * (Q2 - AUC**2)) / (N1 * N2))
          
    # 计算 95% 置信区间的下限和上限
          
    lower = AUC - 1.96 * SE_AUC   # 下限:AUC - 1.96 * 标准误差
          
    upper = AUC + 1.96 * SE_AUC   # 上限:AUC + 1.96 * 标准误差
          
    # 修正置信区间边界,确保在 [0, 1] 范围内
          
    if lower < 0:
          
        lower = 0
          
    if upper > 1:
          
        upper = 1
          
    return (AUC, lower, upper)
      

通过计算AUC值及其标准误差,可以推导出95%置信区间,用于评估模型区分正负样本能力的稳定性和可靠性。当然,除了标准误差法外,还可以采用Bootstrap方法计算置信区间,当样本量较大且数据分布平衡时,标准误差法因其快速高效是更优选择;而当样本量较小、不平衡或需要更灵活的分布假设时,Bootstrap方法因其稳健性更适用,但计算量更大, 不同计算方法可能会导致置信区间结果略有差异,应根据具体需求选择适用方法

logistic模型带有置信区间的ROC曲线绘制


          
# 预测概率
          
y_score = model.predict_proba(X_test)[:, 1]
          
# 计算 ROC 曲线
          
fpr, tpr, _ = roc_curve(y_test, y_score)
          

          
# 计算 AUC 和置信区间
          
roc_auc, lower_ci, upper_ci = roc_auc_ci(y_test, y_score)
          

          
plt.figure(dpi=1200)
          
plt.plot(fpr, tpr, color='darkorange', lw=2, 
          
         label='ROC curve (AUC = %0.2f 95%% CI[%0.2f, %0.2f])' % (roc_auc, lower_ci, upper_ci))
          
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
          
plt.xlim([-0.02, 1.02])  
          
plt.ylim([-0.02, 1.02]) 
          
plt.xlabel('1 - Specificity')
          
plt.ylabel('Sensitivity')
          
plt.title('Receiver Operating Characteristic with 95% CI')
          
plt.legend(loc="lower right")
          
plt.savefig('Logistic_roc_with_ci.pdf', format='pdf', bbox_inches='tight')
          
plt.show()
      

picture.image

通过Logistic回归模型预测结果计算ROC曲线,并绘制包含AUC值及其95%置信区间的ROC图,以直观展示模型分类性能及其稳定性

一个画布下绘制多个机器学习 带有置信区间的 的ROC曲线


          
from sklearn.ensemble import RandomForestClassifier
          
from sklearn.svm import SVC
          
import xgboost as xgb
          

          
# 训练和计算 Logistic Regression 的结果
          
model.fit(X_train, y_train)
          
y_score_logistic = model.predict_proba(X_test)[:, 1]
          
fpr_logistic, tpr_logistic, _ = roc_curve(y_test, y_score_logistic)
          
roc_auc_logistic, lower_logistic, upper_logistic = roc_auc_ci(y_test, y_score_logistic)
          

          
# 训练 XGBoost
          
xgb_model = xgb.XGBClassifier(use_label_encoder=False, eval_metric='logloss')
          
xgb_model.fit(X_train, y_train)
          
y_score_xgb = xgb_model.predict_proba(X_test)[:, 1]
          
fpr_xgb, tpr_xgb, _ = roc_curve(y_test, y_score_xgb)
          
roc_auc_xgb, lower_xgb, upper_xgb = roc_auc_ci(y_test, y_score_xgb)
          

          
# 训练 SVM
          
svm_model = SVC(probability=True)
          
svm_model.fit(X_train, y_train)
          
y_score_svm = svm_model.predict_proba(X_test)[:, 1]
          
fpr_svm, tpr_svm, _ = roc_curve(y_test, y_score_svm)
          
roc_auc_svm, lower_svm, upper_svm = roc_auc_ci(y_test, y_score_svm)
          

          
# 训练随机森林
          
rf_model = RandomForestClassifier()
          
rf_model.fit(X_train, y_train)
          
y_score_rf = rf_model.predict_proba(X_test)[:, 1]
          
fpr_rf, tpr_rf, _ = roc_curve(y_test, y_score_rf)
          
roc_auc_rf, lower_rf, upper_rf = roc_auc_ci(y_test, y_score_rf)
          

          
plt.figure(figsize=(10, 8))
          

          
# 绘制各个模型的 ROC 曲线
          
plt.plot(fpr_logistic, tpr_logistic, color='darkorange', lw=2,
          
         label='Logistic (AUC = %0.2f 95%% CI[%0.2f, %0.2f])' % (roc_auc_logistic, lower_logistic, upper_logistic))
          
plt.plot(fpr_xgb, tpr_xgb, color='green', lw=2,
          
         label='XGBoost (AUC = %0.2f 95%% CI[%0.2f, %0.2f])' % (roc_auc_xgb, lower_xgb, upper_xgb))
          
plt.plot(fpr_svm, tpr_svm, color='purple', lw=2,
          
         label='SVM (AUC = %0.2f 95%% CI[%0.2f, %0.2f])' % (roc_auc_svm, lower_svm, upper_svm))
          
plt.plot(fpr_rf, tpr_rf, color='red', lw=2,
          
         label='Random Forest (AUC = %0.2f 95%% CI[%0.2f, %0.2f])' % (roc_auc_rf, lower_rf, upper_rf))
          
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
          
plt.xlim([-0.02, 1.02])
          
plt.ylim([-0.02, 1.02])
          
plt.xlabel('1 - Specificity', fontsize=14)
          
plt.ylabel('Sensitivity', fontsize=14)
          
plt.title('Test ROC Curve', fontsize=16)
          
plt.legend(loc="lower right", fontsize=12)
          
plt.grid(alpha=0.3)
          
plt.tight_layout()
          
plt.savefig('ROC_Curves_with_CI.pdf', format='pdf', bbox_inches='tight')
          
plt.show()
      

picture.image

同时对Logistic回归、XGBoost、SVM和随机森林模型分别计算并绘制包含AUC值及其95%置信区间的ROC曲线,以对比不同模型的分类性能和稳定性,和前文参考文献ROC曲线图所表达的思想一致,代码与数据集获取:如需获取本文完整的源代码和数据集,请添加作者微信联系

往期推荐

SCI图表复现:整合数据分布与相关系数的高级可视化策略

SCI图表:基于相关性和标准差的多模型评价——泰勒图解析

期刊文章配图:基于分组折线图的多机器学习模型表现评估对比

复现SCI文章 SHAP 依赖图可视化以增强机器学习模型的可解释性

SCI图表复现:优化SHAP特征贡献图展示更多模型细节

复现 Nature 图表——基于PCA的高维数据降维与可视化实践及其扩展

复现Nature图表——基于PCA降维与模型预测概率的分类效果可视化

SCI图表复现:特征相关性气泡热图展示

一图胜千言:回归预测模型训练集与测试集的进阶可视化

期刊文章配图:基于雷达图的多机器学习模型表现评估对比

期刊文章配图:斯皮尔曼相关系数热图反应非线性变量相关性

picture.image

如果你对类似于这样的文章感兴趣。

欢迎关注、点赞、转发~

个人观点,仅供参考

0
0
0
0
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论