交叉验证(Cross-Validation)是一种统计学方法,用于评估机器学习模型的泛化能力。它通过将数据集分成多个子集,轮流将其中一个子集作为测试集,其余子集作为训练集,从而多次评估模型的性能。ROC曲线(Receiver Operating Characteristic Curve)是一种用于评估二分类模型性能的图形工具,它展示了在不同阈值下模型的真正例率(True Positive Rate, TPR)和假正例率(False Positive Rate, FPR)之间的关系。
以下是一个使用scikit-learn库进行交叉验证并绘制ROC曲线的示例代码:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.model_selection import StratifiedKFold
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_curve, auc
# 生成一个示例数据集
X, y = make_classification(n_samples=1000, n_features=20, random_state=42)
# 初始化模型
model = LogisticRegression()
# 初始化ROC曲线数据存储
tprs = []
aucs = []
mean_fpr = np.linspace(0, 1, 100)
# 分层K折交叉验证
cv = StratifiedKFold(n_splits=5)
for i, (train, test) in enumerate(cv.split(X, y)):
model.fit(X[train], y[train])
y_pred_proba = model.predict_proba(X[test])[:, 1]
fpr, tpr, _ = roc_curve(y[test], y_pred_proba)
tprs.append(np.interp(mean_fpr, fpr, tpr))
tprs[-1][0] = 0.0
roc_auc = auc(fpr, tpr)
aucs.append(roc_auc)
# 计算平均ROC曲线
mean_tpr = np.mean(tprs, axis=0)
mean_tpr[-1] = 1.0
mean_auc = auc(mean_fpr, mean_tpr)
std_auc = np.std(aucs)
# 绘制ROC曲线
plt.figure(figsize=(8, 6))
plt.plot(mean_fpr, mean_tpr, color='b', label=f'Mean ROC (AUC = {mean_auc:.2f} ± {std_auc:.2f})', lw=2, alpha=.8)
for i, (fpr, tpr) in enumerate(zip(fprs, tprs)):
plt.plot(fpr, tpr, lw=1, alpha=.3, label=f'ROC fold {i+1} (AUC = {aucs[i]:.2f})')
plt.plot([0, 1], [0, 1], linestyle='--', lw=2, color='r', label='Chance', alpha=.8)
plt.xlim([-0.05, 1.05])
plt.ylim([-0.05, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic')
plt.legend(loc="lower right")
plt.show()
通过上述方法和代码示例,可以有效地进行交叉验证并绘制ROC曲线,从而全面评估模型的性能。
领取专属 10元无门槛券
手把手带您无忧上云