这是我的第236篇原创文章。
一、引言
机器学习中的交叉验证是一种评估模型性能和泛化能力的常用技术。通过将数据集分成多个子集,在每个子集上轮流训练模型并在剩余的子集上进行验证,可以更准确地评估模型的性能。常见的交叉验证方法包括K折交叉验证和留一交叉验证。要计算机器学习分类模型AUC、准确率、特异度、灵敏度的95%的置信区间,可以使用交叉验证或 bootstrap 方法来估计这些指标的置信区间。了前文我介绍 bootstrap 方法来估计,本文通过使用交叉验证的方法实现计算。
二、实现过程
2.1 实现代码
import pandas as pd
from sklearn.model_selection import cross_val_score, KFold
from sklearn.linear_model import LogisticRegression
import numpy as np
from sklearn.metrics import roc_auc_score, accuracy_score, confusion_matrix
# 加载数据集
data = pd.read_csv(r'Dataset.csv')
# 假设数据集中的最后一列是目标变量,其余列是特征
X = data.iloc[:, :-1]
y = data.iloc[:, -1]
# 建立逻辑回归模型
model = LogisticRegression()
# 交叉验证计算指标
kf = KFold(n_splits=5, shuffle=True, random_state=0)
# auc_scores = cross_val_score(model, X, y, cv=kf, scoring='roc_auc')
# accuracy_scores = cross_val_score(model, X, y, cv=kf, scoring='accuracy')
# specificity_scores = cross_val_score(model, X_train, y_train, cv=5, scoring='specificity')
# sensitivity_scores = cross_val_score(model, X_train, y_train, cv=5, scoring='sensitivity')
# 计算特异度和灵敏度
specificity_scores = []
sensitivity_scores = []
accuracy_scores = []
auc_scores = []
for train_index, test_index in kf.split(y):
X_train, X_test = X.iloc[train_index], X.iloc[test_index]
y_train, y_test = y.iloc[train_index], y.iloc[test_index]
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
y_pred_proba = model.predict_proba(X_test)[:, 1]
tn, fp, fn, tp = confusion_matrix(y_test, y_pred).ravel()
specificity = tn / (tn + fp)
sensitivity = tp / (tp + fn)
specificity_scores.append(specificity)
sensitivity_scores.append(sensitivity)
auc_scores.append(roc_auc_score(y_test, y_pred_proba))
accuracy_scores.append(accuracy_score(y_test, y_pred))
# 计算95%置信区间
def calculate_confidence_interval(scores):
mean = np.mean(scores)
std = np.std(scores)
n = len(scores)
z = 1.96 # 95% 置信水平的Z值
lower_bound = mean - (z * std / np.sqrt(n))
upper_bound = mean + (z * std / np.sqrt(n))
return lower_bound, upper_bound
auc_ci = calculate_confidence_interval(auc_scores)
accuracy_ci = calculate_confidence_interval(accuracy_scores)
specificity_ci = calculate_confidence_interval(specificity_scores)
sensitivity_ci = calculate_confidence_interval(sensitivity_scores)
print("AUC 95% 置信区间:", auc_ci)
print("准确率 95% 置信区间:", accuracy_ci)
print("特异度 95% 置信区间:", specificity_ci)
print("灵敏度 95% 置信区间:", sensitivity_ci)
2.2 实现效果
作者简介:
读研期间发表6篇SCI数据挖掘相关论文,现在某研究院从事数据算法相关科研工作,结合自身科研实践经历不定期分享关于Python、机器学习、深度学习、人工智能系列基础知识与应用案例。致力于只做原创,以最简单的方式理解和学习,关注我一起交流成长。需要数据集和源码的小伙伴可以关注底部公众号添加作者微信。