一、ROC曲線簡介
1.1? ROC曲線的構成
1.橫軸(假正率,FPR):
表示負樣本被錯誤分類為正的比例(越小越好)
2.縱軸(真正率,TPR,即召回率):
表示正樣本被正確識別的比例(越大越好)
3.曲線繪制:通過調整分類閾值(如邏輯回歸的概率閾值),計算不同閾值下的(FPR, TPR)點,連接這些點形成曲線
1.2??關鍵指標:AUC
1.AUC:ROC曲線下的面積,范圍在0.5(隨機猜測)到1(完美模型)之間
- AUC = 0.9:模型有90%的概率將隨機正樣本排在負樣本之前
- AUC對類別分布不敏感,適合不平衡數據評估
1.3??ROC曲線的核心作用
1.模型性能比較:AUC越高,模型整體區分能力越強
2.閾值選擇:通過曲線形狀選擇最佳分類閾值(如平衡誤診與漏診的醫療場景)
3.可視化權衡:曲線越靠近左上角,模型在TPR和FPR間的權衡越好
1.4??ROC vs. 精確率-召回率曲線(PR Curve)
1.ROC:關注整體排序能力,適合類別相對均衡的場景
2.PR Curve:聚焦正類的識別質量(精確率 vs. 召回率),更適合極端類別不平衡(如欺詐檢測)
1.5??實例應用
1.醫學診斷:調整閾值以降低漏診(提高TPR)或減少誤診(降低FPR)
2.信用評分:通過AUC評估模型區分高風險/低風險客戶的能力
二、PR曲線簡介
2.1?PR曲線的構成
1.橫軸(召回率,即TPR):
表示正樣本被正確識別的比例(關注“漏檢”問題)
2.縱軸(精確率):
表示預測為正的樣本中實際為正的比例(關注“誤檢”問題)
3.曲線繪制:通過調整分類閾值(如概率閾值),計算不同閾值下的(Recall, Precision)點,連接這些點形成曲線
2.2?關鍵指標:AUC-PR
1.AUC-PR:PR曲線下的面積,范圍在0(最差)到1(完美模型)之間
- 類別越不平衡,AUC-PR的評估越敏感。例如,在欺詐檢測中,正樣本占比僅1%時,AUC-PR比AUC-ROC更有參考價值
2.3 PR曲線的核心作用
1.聚焦正類性能:直接反映模型對正類的識別能力,避免負類數量主導評估結果
2.高不平衡場景:當正樣本極少時(如罕見病診斷、欺詐檢測),PR曲線比ROC曲線更可靠
3.閾值選擇:通過曲線形狀選擇平衡精確率和召回率的最佳閾值(例如,醫療場景需高召回率,推薦系統需高精確率)
2.4?PR曲線 vs?ROC曲線
對比維度 | PR曲線 | ROC曲線 |
核心關注點 | 正類的識別質量(Precision vs. Recall) | 整體排序能力(TPR vs. FPR) |
使用場景 | 正樣本極少(極端不平衡) | 類別相對均衡或關注整體性能 |
對類別不平衡敏感度 | 高度敏感 | 不敏感(因FPR受負類數量影響較小) |
AUC解釋 | AUC-PR越低,模型漏檢或誤檢越嚴重 | AUC-ROC反映整體排序能力 |
2.5 實例應用
1.罕見病篩查:需高召回率(減少漏診),允許一定誤診(低精確率)
2.垃圾郵件檢測:需高精確率(避免正常郵件被誤判為垃圾),可容忍少量漏檢(低召回率)
3.推薦系統:平衡精確率(推薦內容相關性)和召回率(覆蓋用戶興趣范圍)
2.6?注意事項
1.負樣本主導時慎用:若負樣本占比過高(如99%),PR曲線可能波動較大,需結合其他指標(如F1分數)
2.隨機基線的差異:ROC曲線的隨機基線是AUC=0.5,而PR曲線的隨機基線為:
例如正樣本占1%,隨機模型的AUC-PR ≈ 0.01
三、代碼實現
1.導入所需要的包
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import roc_curve, auc, precision_recall_curve, average_precision_score
2.加載數據集,進行訓練
隨機生成數據集
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 使用隨機森林分類器進行訓練
clf = RandomForestClassifier(random_state=42)
clf.fit(X_train, y_train)# 獲取預測結果
y_pred_proba = clf.predict_proba(X_test)[:, 1]
3.計算ROC曲線和PR曲線
# 計算ROC曲線
fpr, tpr, _ = roc_curve(y_test, y_pred_proba)
roc_auc = auc(fpr, tpr)# 計算PR曲線
precision, recall, _ = precision_recall_curve(y_test, y_pred_proba)
average_precision = average_precision_score(y_test, y_pred_proba)
4.繪制ROC曲線和PR曲線
# 繪制ROC曲線
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC curve (area = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], color='navy', lw=2, 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 (ROC) Curve')
plt.legend(loc="lower right")# 繪制PR曲線
plt.subplot(1, 2, 2)
plt.plot(recall, precision, color='blue', lw=2, label=f'PR curve (AP = {average_precision:.2f})')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('Precision-Recall (PR) Curve')
plt.legend(loc="best")# 顯示圖像
plt.tight_layout()
plt.show()
四、曲線可視化展示
4.1 曲線截圖
4.2 圖像分析
1.ROC曲線分析
- ?ROC曲線:展示了分類模型在不同閾值下的真陽性率(TPR)與假陽性率(FPR)之間的關系。
- ?曲線下的面積(AUC):圖中顯示AUC為0.92,表示模型具有很高的區分能力。AUC值越接近1,模型性能越好。
- ?對角線:圖中的虛線表示隨機猜測的模型性能,曲線越遠離這條線,模型性能越好。 ?
2.PR曲線分析
- PR曲線:展示了分類模型在不同閾值下的精確率(Precision)與召回率(Recall)之間的關系。
- 平均精確率(AP):圖中顯示AP為0.94,表示模型在不同召回率下的精確率平均值很高,說明模型在處理不平衡數據集時表現良好。 ?
- 曲線形狀:曲線越靠近左上角,模型性能越好。圖中曲線在大部分區域都保持較高的精確率,說明模型在不同召回率下都能保持較高的精確度。
3.總結
- 這兩個圖表明該模型在分類任務中表現優異,具有很高的區分能力和精確度。
- ROC曲線適合評估模型的整體性能,而PR曲線更適合評估模型在不平衡數據集上的表現