ROC曲线和AUC指标介绍(了解)
1 课程概览
本课介绍ROC曲线和AUC指标(了解内容)。ROC曲线的X轴是假正率(FPR),Y轴是真正率(TPR)。AUC是ROC曲线下的面积,值越大模型效果越好。讲解四个特殊坐标点的含义。
2 核心概念与定义
- ROC曲线:以FPR为X轴,TPR为Y轴的曲线。
- FPR(假正率):负样本中被预测为正样本的比例。
- TPR(真正率):正样本中被预测为正样本的比例(同召回率)。
- AUC:ROC曲线下的面积,值越大效果越好。
- 随机猜想:AUC=0.5,表示随机猜测。
3 算法与模型详解
3.1 ROC曲线
X轴:FPR(假正率)
Y轴:TPR(真正率)
曲线:中间红色或蓝色的线
3.2 FPR(假正率)
定义:负样本中被预测为正样本的比例
公式: $$FPR = \frac{FP}{FP + TN}$$
理解:
- FP:负样本中被预测为正样本
- FP+TN:所有负样本
- 横着看
3.3 TPR(真正率)
定义:正样本中被预测为正样本的比例
公式: $$TPR = \frac{TP}{TP + FN}$$
理解:
- TP:正样本中被预测为正样本
- TP+FN:所有正样本
- 横着看
- 同召回率
3.4 AUC指标
定义:ROC曲线下的面积
特点:
- AUC越大,曲线面积越大,效果越好
- AUC=1:完美分类,能完美分清正负类
- AUC=0.5:随机猜想,一半一半的概率
- AUC<0.5:比随机猜想还差
3.5 四个特殊坐标点
点1:(0, 0)
- X=0:FPR=0,负样本中被预测为正样本的占比为0
- Y=0:TPR=0,正样本中被预测为正样本的占比为0
- 含义:所有反例都找出来了,所有正例一个都没找出来
点2:(1, 0)
- X=1:FPR=1,负样本中被预测为正样本的占比为100%
- Y=0:TPR=0,正样本中被预测为正样本的占比为0
- 含义:效果最不好,啥都没找出来
点3:(1, 1)
- X=1:FPR=1,伪正例100%,真反例0%
- Y=1:TPR=1,真正例100%
- 含义:所有正例都找出来了,但所有负例也被预测为正例
点4:(0, 1)
- X=0:FPR=0,负样本都被正确预测
- Y=1:TPR=1,正样本都被正确预测
- 含义:完美分类,AUC=1
3.6 AUC值评估
| AUC值 | 效果 |
|---|---|
| 1.0 | 完美分类 |
| 0.5 | 随机猜想 |
| <0.5 | 比随机还差 |
| >0.5 | 优于随机 |
| 0.7-0.8 | 效果一般 |
| 0.8-0.9 | 效果良好 |
| >0.9 | 效果优秀 |
4 数学原理与推导
4.1 FPR(假正率)
$$FPR = \frac{FP}{FP + TN} = \frac{\text{伪正例}}{\text{所有负样本}}$$
4.2 TPR(真正率)
$$TPR = \frac{TP}{TP + FN} = \frac{\text{真正例}}{\text{所有正样本}} = \text{Recall}$$
4.3 AUC
$$AUC = \int_0^1 TPR , d(FPR)$$
4.4 ROC曲线
以FPR为横轴,TPR为纵轴绘制的曲线。
5 代码示例
import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve, auc, roc_auc_score
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification
# 1. 生成示例数据
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)
# 2. 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 3. 训练逻辑回归模型
model = LogisticRegression()
model.fit(X_train, y_train)
# 4. 预测概率
y_prob = model.predict_proba(X_test)[:, 1] # 正类的概率
# 5. 计算ROC曲线
fpr, tpr, thresholds = roc_curve(y_test, y_prob)
# 6. 计算AUC
auc_value = auc(fpr, tpr)
print(f"AUC值: {auc_value:.4f}")
# 7. 绘制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)')
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()
# 8. 手动计算FPR和TPR
print("\n=== 手动计算验证 ===")
from sklearn.metrics import confusion_matrix
y_pred = model.predict(X_test)
cm = confusion_matrix(y_test, y_pred)
tn, fp, fn, tp = cm.ravel()
fpr_manual = fp / (fp + tn)
tpr_manual = tp / (tp + fn)
print(f"混淆矩阵: TP={tp}, FP={fp}, FN={fn}, TN={tn}")
print(f"FPR(假正率): {fpr_manual:.4f}")
print(f"TPR(真正率): {tpr_manual:.4f}")
# 9. 四个特殊点说明
print("\n=== 四个特殊点 ===")
print("(0, 0): 所有反例找出来,所有正例没找出来")
print("(1, 0): 效果最差,啥都没找出来")
print("(1, 1): 所有正例找出来,但负例也被预测为正例")
print("(0, 1): 完美分类,AUC=1")
输出示例:
AUC值: 0.9234
=== 手动计算验证 ===
混淆矩阵: TP=120, FP=15, FN=20, TN=145
FPR(假正率): 0.0938
TPR(真正率): 0.8571
=== 四个特殊点 ===
(0, 0): 所有反例找出来,所有正例没找出来
(1, 0): 效果最差,啥都没找出来
(1, 1): 所有正例找出来,但负例也被预测为正例
(0, 1): 完美分类,AUC=1
6 重难点与易错提醒
- ❗重点:ROC曲线的X轴是FPR,Y轴是TPR。
- ❗重点:FPR = FP/(FP+TN),负样本中被预测为正样本的比例。
- ❗重点:TPR = TP/(TP+FN),正样本中被预测为正样本的比例(同召回率)。
- ❗重点:AUC越大,效果越好。
- ❗重点:AUC=0.5是随机猜想,AUC=1是完美分类。
- ⚠️易错:混淆FPR和TPR。
- ⚠️易错:AUC的方向理解错误。
- 💡深入理解:ROC曲线越靠近左上角,模型效果越好。
7 课堂问答精选
Q: ROC曲线的X轴和Y轴分别是什么?
A:
- X轴:FPR(假正率),负样本中被预测为正样本的比例,公式:FP/(FP+TN)
- Y轴:TPR(真正率),正样本中被预测为正样本的比例,公式:TP/(TP+FN) TPR同召回率。
Q: AUC值代表什么?
A: AUC是ROC曲线下的面积,值越大模型效果越好:
- AUC=1:完美分类
- AUC=0.5:随机猜想
- AUC<0.5:比随机还差 AUC越大,曲线面积越大,效果越好。
8 本课小结
- ROC曲线:X轴FPR,Y轴TPR。
- FPR = FP/(FP+TN),假正率。
- TPR = TP/(TP+FN),真正率(同召回率)。
- AUC:ROC曲线下面积,越大越好。
- AUC=1完美,AUC=0.5随机猜想。
9 延伸思考与实践
- 实践:绘制ROC曲线并计算AUC。
- 预习:ROC曲线案例。
- 思考:ROC曲线和AUC指标适用于什么场景?