一、基礎理解
1)定義
- ROC(Receiver Operation Characteristic Curve)
- 定義:描述 TPR 和 FPR 之間的關系;
- 功能:應用於比較兩個模型的優劣;
- 模型不限於是否通過極度偏斜的數據訓練所得;
- 比較方式:ROC 曲線與坐標圖形邊界圍成的面積,越大模型越優;
- TPR(True Positive Rate):真正率;被預測為正的正樣本結果數 / 正樣本實際數:TPR = TP /(TP + FN);
- TNR(True Negative Rate):真負率;被預測為負的負樣本結果數 / 負樣本實際數:TNR = TN /(TN + FP) ;
- FPR(False Positive Rate):假正率;被預測為正的負樣本結果數 /負樣本實際數:FPR = FP /(TN + FP) ;
- FNR(False Negative Rate):假負率;被預測為負的正樣本結果數 / 正樣本實際數:FNR = FN /(TP + FN) ;
- 召回率(Recall)和精度(Precise)是廣泛用於信息檢索和統計學分類領域的兩個度量值,用來評價結果的質量;
2)與 P - R 曲線的區別
- P - R 曲線:應用於判定由極度有偏數據所訓練的模型的優劣;
- ROC 曲線:應用於比較兩個模型的優劣;
- 模型:可以是同樣算法不同超參數所得的不同模型,也可以是不同算法所得的不同模型;
3)TPR 和 FPR 的關系
- 關系:
- 隨着閾值 threshold 的增大,FPR 和 TPR 都逐漸減小;
- FPR 和 TPR 稱正相關關系,FPR 越高,TPR 相應的也越高;
二、代碼實現 FPR 和 TPR,並繪制 ROC 曲線
1)封裝
- TPR
def TPR(y_true, y_predict): tp = TP(y_true, y_predict) fn = FN(y_true, y_predict) try: return tp / (tp + fn) except: return 0.
- FPR
def FPR(y_true, y_predict): fp = FP(y_true, y_predict) tn = TN(y_true, y_predict) try: return fp / (fp + tn) except: return 0.
2)例
- 求 TPR 和 FPR
import numpy as np from sklearn import datasets digits = datasets.load_digits() X = digits.data y = digits.target.copy() y[digits.target==9] = 1 y[digits.target!=9] = 0 from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=666) from sklearn.linear_model import LogisticRegression log_reg = LogisticRegression() log_reg.fit(X_train, y_train) decision_scores = log_reg.decision_function(X_test) from playML.metrics import FPR, TPR fprs = [] tprs = [] thresholds = np.arange(np.min(decision_scores), np.max(decision_scores), 0.1) for threshold in thresholds: # dtype='int':將數據類型從 bool 型轉為 int 型; y_predict = np.array(decision_scores >= threshold, dtype='int') fprs.append(FPR(y_test, y_predict)) tprs.append(TPR(y_test, y_predict))
-
繪制 ROC 曲線
import matplotlib.pyplot as plt plt.plot(fprs, tprs) plt.show()
-
分析:
- ROC 曲線與圖形邊界圍成的面積,作為衡量模型優劣的標准,面積越大,模型越優;
- 可以是同樣算法不同超參數所得的不同模型,也可以是不同算法所得的不同模型;
三、scikit-learn 中的ROC
-
模塊及使用格式
from sklearn.metrics import roc_curve fprs, tprs, thresholds = roc_curve(y_test, decision_scores)
-
計算 ROC 曲線與坐標軸圍成的面積:稱 ROC 的 auc;
-
面積越大,模型越優;
-
from sklearn.metrics import roc_auc_score roc_auc_score(y_test, decision_scores)