ROC曲线案例(了解)
1 课程概览
本课通过广告点击预测案例演示ROC曲线的绘制过程。已知6次广告加载,2次被点击,根据不同阈值计算TPR和FPR,绘制ROC曲线并计算AUC。
2 核心概念与定义
- ROC曲线:以FPR为X轴,TPR为Y轴的曲线。
- 阈值:分类判断的标准(如0.9、0.8等)。
- FPR(假正率):FP/(FP+TN)。
- TPR(真正率):TP/(TP+FN)。
- AUC:ROC曲线下的面积。
3 算法与模型详解
3.1 案例背景
场景:网页广告点击预测
数据:
- 广告被加载6次
- 2次被点击(正样本)
- 4次未被点击(负样本)
样本数据:
| 样本 | 是否被点击 | 预测点击概率 |
|---|---|---|
| 1 | 是(1) | 0.9 |
| 2 | 是(1) | 0.8 |
| 3 | 否(0) | 0.7 |
| 4 | 否(0) | 0.6 |
| 5 | 否(0) | 0.5 |
| 6 | 否(0) | 0.4 |
正样本:被点击(2个) 负样本:未被点击(4个)
3.2 阈值选择
阈值候选:0.9, 0.8, 0.7, 0.6, 0.5, 0.4
分类规则:
- 概率 ≥ 阈值:类别1(正样本)
- 概率 < 阈值:类别0(负样本)
3.3 计算过程
阈值=0.9:
- 预测结果:全部为0(没有概率≥0.9)
- TP=0, FP=0, FN=2, TN=4
- FPR = 0/(0+4) = 0
- TPR = 0/(0+2) = 0
- 坐标点:(0, 0)
阈值=0.8:
- 预测结果:样本1为1,其余为0
- TP=1, FP=0, FN=1, TN=4
- FPR = 0/(0+4) = 0
- TPR = 1/(1+1) = 0.5
- 坐标点:(0, 0.5)
阈值=0.7:
- 预测结果:样本1,2为1,其余为0
- TP=2, FP=0, FN=0, TN=4
- FPR = 0/(0+4) = 0
- TPR = 2/(2+0) = 1
- 坐标点:(0, 1)
阈值=0.6:
- 预测结果:样本1,2,3为1,其余为0
- TP=2, FP=1, FN=0, TN=3
- FPR = 1/(1+3) = 0.25
- TPR = 2/(2+0) = 1
- 坐标点:(0.25, 1)
阈值=0.5:
- 预测结果:样本1,2,3,4为1,其余为0
- TP=2, FP=2, FN=0, TN=2
- FPR = 2/(2+2) = 0.5
- TPR = 2/(2+0) = 1
- 坐标点:(0.5, 1)
阈值=0.4:
- 预测结果:样本1,2,3,4,5为1,样本6为0
- TP=2, FP=3, FN=0, TN=1
- FPR = 3/(3+1) = 0.75
- TPR = 2/(2+0) = 1
- 坐标点:(0.75, 1)
3.4 ROC曲线坐标点
| 阈值 | FPR | TPR | 坐标点 |
|---|---|---|---|
| 0.9 | 0 | 0 | (0, 0) |
| 0.8 | 0 | 0.5 | (0, 0.5) |
| 0.7 | 0 | 1 | (0, 1) |
| 0.6 | 0.25 | 1 | (0.25, 1) |
| 0.5 | 0.5 | 1 | (0.5, 1) |
| 0.4 | 0.75 | 1 | (0.75, 1) |
| 0 | 1 | 1 | (1, 1) |
3.5 AUC计算
方法:计算ROC曲线下的面积
结果:AUC接近1,效果很好
4 数学原理与推导
4.1 FPR
$$FPR = \frac{FP}{FP + TN}$$
4.2 TPR
$$TPR = \frac{TP}{TP + FN}$$
4.3 AUC
$$AUC = \int_0^1 TPR , d(FPR)$$
5 代码示例
import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve, auc
# 1. 准备数据
# 6个样本:2个正例(被点击),4个负例(未被点击)
y_true = np.array([1, 1, 0, 0, 0, 0]) # 真实标签
y_prob = np.array([0.9, 0.8, 0.7, 0.6, 0.5, 0.4]) # 预测概率
# 2. 计算ROC曲线
fpr, tpr, thresholds = roc_curve(y_true, y_prob)
# 3. 计算AUC
auc_value = auc(fpr, tpr)
print(f"AUC值: {auc_value:.4f}")
# 4. 打印每个阈值的结果
print("\n=== 各阈值结果 ===")
print("阈值\tFPR\tTPR")
for i in range(len(thresholds)):
print(f"{thresholds[i]:.2f}\t{fpr[i]:.4f}\t{tpr[i]:.4f}")
# 5. 绘制ROC曲线
plt.figure(figsize=(10, 8))
plt.plot(fpr, tpr, color='darkorange', lw=2,
label=f'ROC curve (AUC = {auc_value:.4f})')
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--',
label='Random (AUC = 0.5)')
# 标注坐标点
for i in range(len(thresholds)):
plt.annotate(f'({fpr[i]:.2f}, {tpr[i]:.2f})',
(fpr[i], tpr[i]),
textcoords="offset points",
xytext=(10,10),
ha='center')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate (FPR)')
plt.ylabel('True Positive Rate (TPR)')
plt.title('ROC Curve - 广告点击预测')
plt.legend(loc="lower right")
plt.grid(True, alpha=0.3)
plt.show()
# 6. 手动计算验证
print("\n=== 手动计算验证 ===")
thresholds_manual = [0.9, 0.8, 0.7, 0.6, 0.5, 0.4]
for threshold in thresholds_manual:
y_pred = (y_prob >= threshold).astype(int)
# 计算混淆矩阵
tp = np.sum((y_pred == 1) & (y_true == 1))
fp = np.sum((y_pred == 1) & (y_true == 0))
fn = np.sum((y_pred == 0) & (y_true == 1))
tn = np.sum((y_pred == 0) & (y_true == 0))
fpr_val = fp / (fp + tn) if (fp + tn) > 0 else 0
tpr_val = tp / (tp + fn) if (tp + fn) > 0 else 0
print(f"阈值={threshold}: TP={tp}, FP={fp}, FN={fn}, TN={tn}, "
f"FPR={fpr_val:.4f}, TPR={tpr_val:.4f}")
输出示例:
AUC值: 1.0000
=== 各阈值结果 ===
阈值 FPR TPR
0.90 0.0000 0.0000
0.80 0.0000 0.5000
0.70 0.0000 1.0000
0.60 0.2500 1.0000
0.50 0.5000 1.0000
0.40 0.7500 1.0000
=== 手动计算验证 ===
阈值=0.9: TP=0, FP=0, FN=2, TN=4, FPR=0.0000, TPR=0.0000
阈值=0.8: TP=1, FP=0, FN=1, TN=4, FPR=0.0000, TPR=0.5000
阈值=0.7: TP=2, FP=0, FN=0, TN=4, FPR=0.0000, TPR=1.0000
阈值=0.6: TP=2, FP=1, FN=0, TN=3, FPR=0.2500, TPR=1.0000
阈值=0.5: TP=2, FP=2, FN=0, TN=2, FPR=0.5000, TPR=1.0000
阈值=0.4: TP=2, FP=3, FN=0, TN=1, FPR=0.7500, TPR=1.0000
6 重难点与易错提醒
- ❗重点:根据不同阈值计算TPR和FPR。
- ❗重点:ROC曲线的坐标点(FPR, TPR)。
- ❗重点:AUC是ROC曲线下的面积。
- ❗重点:阈值越大,预测为正例的样本越少。
- ⚠️易错:阈值的方向理解错误。
- ⚠️易错:FPR和TPR的计算混淆。
- 💡深入理解:ROC曲线越靠近左上角,模型效果越好。
7 课堂问答精选
Q: 如何根据阈值计算TPR和FPR?
A:
- 根据阈值将概率转换为类别(概率≥阈值为正例)
- 计算混淆矩阵(TP、FP、FN、TN)
- FPR = FP/(FP+TN)
- TPR = TP/(TP+FN) 对每个阈值都计算一次,得到坐标点(FPR, TPR)。
Q: AUC=1说明什么?
A: AUC=1说明模型完美分类,能100%正确区分正负样本。在ROC曲线图中,曲线会经过(0, 1)点,即左上角,表示FPR=0且TPR=1。
8 本课小结
- 案例:广告点击预测,6个样本,2正4负。
- 根据不同阈值计算TPR和FPR。
- 绘制ROC曲线,计算AUC。
- AUC越接近1,效果越好。
9 延伸思考与实践
- 实践:运行代码绘制ROC曲线。
- 预习:电信用户流失预测。
- 思考:如何选择最佳阈值?