逻辑回归的ROC曲线
时间: 2024-12-27 17:15:14 浏览: 11
### 如何绘制和解释逻辑回归模型的ROC曲线
#### 构建逻辑回归模型并绘制单次ROC曲线
为了展示如何构建逻辑回归模型以及绘制其ROC曲线,可以使用`scikit-learn`库中的工具。以下是具体实现方法:
```python
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_curve, auc
import matplotlib.pyplot as plt
# 创建模拟数据集
X, y = make_classification(n_samples=1000, n_features=20,
n_classes=2, weights=[0.9], flip_y=0)
# 划分训练集与测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.5,
stratify=y, random_state=42)
# 训练逻辑回归分类器
clf = LogisticRegression().fit(X_train, y_train)
# 预测概率值
y_pred_proba = clf.predict_proba(X_test)[::, 1]
# 获取FPR(假正率), TPR(真正率) 和阈值用于画图
fpr, tpr, _ = roc_curve(y_test, y_pred_proba)
roc_auc = auc(fpr, tpr)
plt.figure()
lw = 2
plt.plot(fpr, tpr, color='darkorange', lw=lw, label=f'ROC curve (area = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--') # 对角线代表随机猜测的情况
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic example')
plt.legend(loc="lower right")
plt.show()
```
这段代码展示了如何创建一个简单的二元分类问题的数据集,并通过逻辑回归模型对其进行拟合。接着预测样本属于某一类别的概率,并利用这些概率来计算接收者操作特征(ROC)曲线下面积(AUC),最终绘制成图形[^1]。
#### 解释ROC曲线及其意义
ROC曲线反映了不同决策边界下的真阳性和假阳性之间的权衡关系。当调整分类器的阈值时,会得到一系列不同的(TPR,FPR)坐标点;连接所有这样的点就构成了完整的ROC曲线。理想情况下,希望尽可能多地捕获真正的正例而少误报负例,因此越靠近左上角越好,即TPR接近于1的同时保持较低水平的FPR。AUC度量了整个ROC空间下区域大小,取值范围通常介于0到1之间,数值越大表示性能更优[^2]。
#### 使用交叉验证绘制平均ROC曲线
考虑到单一拆分可能导致结果不稳定,在实际应用中往往采用K折交叉验证的方式评估模型表现。对于每一次迭代都重复上面的过程收集各个折叠上的(FPR,TPR),之后求均值得到总体趋势更为稳定的估计值。这有助于减少由于特定分割方式带来的偏差影响。
```python
from scipy import interp
from sklearn.model_selection import StratifiedKFold
cv = StratifiedKFold(n_splits=5)
tprs = []
aucs = []
mean_fpr = np.linspace(0, 1, 100)
fig, ax = plt.subplots()
for i, (train, test) in enumerate(cv.split(X, y)):
probas_ = clf.fit(X[train], y[train]).predict_proba(X[test])
fpr, tpr, thresholds = roc_curve(y[test], probas_[:, 1])
tprs.append(interp(mean_fpr, fpr, tpr))
tprs[-1][0] = 0.0
roc_auc = auc(fpr, tpr)
aucs.append(roc_auc)
ax.plot(
fpr,
tpr,
lw=1,
alpha=0.3,
label=f"Fold {i} ROC fold (AUC = %0.2f)" % roc_auc,
)
ax.plot([0, 1], [0, 1], linestyle="--", lw=2, color="r", label="Chance", alpha=0.8)
mean_tpr = np.mean(tprs, axis=0)
mean_tpr[-1] = 1.0
mean_auc = auc(mean_fpr, mean_tpr)
std_auc = np.std(aucs)
ax.plot(
mean_fpr,
mean_tpr,
color="b",
label=r"Mean ROC (AUC = %0.2f $\pm$ %0.2f)" % (mean_auc, std_auc),
lw=2,
alpha=0.8,
)
std_tpr = np.std(tprs, axis=0)
tprs_upper = np.minimum(mean_tpr + std_tpr, 1)
tprs_lower = np.maximum(mean_tpr - std_tpr, 0)
ax.fill_between(
mean_fpr,
tprs_lower,
tprs_upper,
color="grey",
alpha=0.2,
label=r"$\pm$ 1 std. dev.",
)
ax.set(
xlim=[-0.05, 1.05],
ylim=[-0.05, 1.05],
title="Receiver operating characteristic example",
)
ax.legend(loc="lower right")
plt.show()
```
此部分扩展了之前的方法论,引入了多次重采样的概念以获得更加稳健的结果。通过对多个子样本执行相同的操作并将它们汇总起来形成一条平滑且具有统计显著性的ROC曲线。
阅读全文