1. 什么是ROC曲線???
ROC(Receiver Operating Characteristic,受試者工作特征曲線)是用來評估??分類模型性能??的一種方法,特別是針對??二分類問題??(比如“患病”或“健康”)。
??核心思想??
- ROC曲線通過改變??分類閾值??(即模型預測為“正類”的概率界限),觀察模型的??真正例率(TPR)??和??假正例率(FPR)??的變化。
- ??TPR(True Positive Rate)?? = 真正例 / 所有實際正例
(正確識別出病人的比例) - ??FPR(False Positive Rate)?? = 假正例 / 所有實際負例
(把健康人誤診為病人的比例)
??例子:醫生診斷病人??
假設我們有10個病人,其中??4個真的患病(正類)??,??6個健康(負類)??。醫生(模型)對每個病人給出一個??患病概率??(0~1之間的值)。
病人 | 實際狀態 | 模型預測概率 |
---|---|---|
1 | 患病 | 0.9 |
2 | 患病 | 0.8 |
3 | 患病 | 0.7 |
4 | 患病 | 0.6 |
5 | 健康 | 0.55 |
6 | 健康 | 0.54 |
7 | 健康 | 0.53 |
8 | 健康 | 0.52 |
9 | 健康 | 0.51 |
10 | 健康 | 0.5 |
??問題??:醫生應該設置一個閾值(比如0.6),把概率≥0.6的病人判定為“患病”,否則“健康”。但這個閾值選多少最好呢?ROC曲線就幫我們分析不同閾值下的表現。
??2. 如何畫ROC曲線???
我們調整??閾值??,計算不同閾值下的??TPR和FPR??,然后畫出曲線:
閾值 | 預測結果(≥閾值=患病) | TPR(真正例率) | FPR(假正例率) |
---|---|---|---|
0.9 | [1] | 1/4 = 0.25 | 0/6 = 0 |
0.8 | [1,2] | 2/4 = 0.5 | 0/6 = 0 |
0.7 | [1,2,3] | 3/4 = 0.75 | 0/6 = 0 |
0.6 | [1,2,3,4] | 4/4 = 1.0 | 0/6 = 0 |
0.55 | [1,2,3,4,5] | 4/4 = 1.0 | 1/6 ≈ 0.167 |
0.54 | [1,2,3,4,5,6] | 4/4 = 1.0 | 2/6 ≈ 0.333 |
... | ... | ... | ... |
??ROC曲線??就是把所有(FPR, TPR)點連起來:
- ??橫軸(X)??:FPR(假正例率)
- ??縱軸(Y)??:TPR(真正例率)
??理想情況??:曲線越靠近左上角(TPR高,FPR低),模型越好。
??3. 什么是AUC???
AUC(Area Under Curve,曲線下面積)是ROC曲線下的面積,范圍在??0~1??:
- ??AUC=1??:完美模型(所有病人都被正確識別,沒有誤診)
- ??AUC=0.5??:隨機猜測(和拋硬幣一樣,沒有區分能力)
- ??AUC=0??:完全反了(把病人當成健康,健康當成病人)
??例子??:
- 如果AUC=0.9,說明模型很好。
- 如果AUC=0.6,說明模型一般。
- 如果AUC=0.5,說明模型和隨機猜測差不多。
??4. Python代碼實現??
我們用sklearn
計算ROC曲線和AUC:
import numpy as np from sklearn.metrics import roc_curve, auc import matplotlib.pyplot as plt # 實際標簽(1=患病,0=健康) y_true = np.array([1, 1, 1, 1, 0, 0, 0, 0, 0, 0]) # 模型預測概率 y_scores = np.array([0.9, 0.8, 0.7, 0.6, 0.55, 0.54, 0.53, 0.52, 0.51, 0.5]) # 計算ROC曲線 fpr, tpr, thresholds = roc_curve(y_true, y_scores) # 計算AUC roc_auc = auc(fpr, tpr) # 畫圖 plt.figure() plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC curve (AUC = {roc_auc:.2f})') plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--') # 隨機猜測的線 plt.xlabel('False Positive Rate (FPR)') plt.ylabel('True Positive Rate (TPR)') plt.title('Receiver Operating Characteristic (ROC) Curve') plt.legend(loc="lower right") plt.show()
??輸出結果??:
- 你會看到一條ROC曲線,AUC值會顯示在圖上(比如AUC=1.0,因為這個例子數據簡單)。
??5. 總結??
概念 | 解釋 |
---|---|
??ROC曲線?? | 不同閾值下的TPR vs FPR曲線 |
??AUC?? | ROC曲線下的面積,衡量模型區分能力 |
??理想情況?? | AUC接近1,曲線靠近左上角 |
??隨機猜測?? | AUC=0.5,曲線是45度直線 |
??適用場景??:
- 醫學診斷(患病/健康)
- 垃圾郵件檢測(垃圾/正常)
- 金融風控(欺詐/正常)
希望這個例子能讓你輕松理解ROC和AUC!如果有疑問,歡迎繼續討論 😊