機器學習:評價分類結果(ROC 曲線)


一、基礎理解

 1)定義

  • ROC(Receiver Operation Characteristic Curve)
  • 定義:描述 TPR 和 FPR 之間的關系;
  • 功能:應用於比較兩個模型的優劣;
  1. 模型不限於是否通過極度偏斜的數據訓練所得
  2. 比較方式:ROC 曲線與坐標圖形邊界圍成的面積,越大模型越優;
  1. TPR(True Positive Rate):真正率;被預測為正的正樣本結果數 / 正樣本實際數:TPR = TP /(TP + FN);
  2. TNR(True Negative Rate):真負率;被預測為負的負樣本結果數 / 負樣本實際數:TNR = TN /(TN + FP) ;
  3. FPR(False Positive Rate):假正率;被預測為正的負樣本結果數 /負樣本實際數:FPR = FP /(TN + FP) ;
  4. FNR(False Negative Rate):假負率;被預測為負的正樣本結果數 / 正樣本實際數:FNR = FN /(TP + FN) ;

 

  • 召回率(Recall)和精度(Precise)是廣泛用於信息檢索和統計學分類領域的兩個度量值,用來評價結果的質量;

 

 2)與 P - R 曲線的區別

  • P - R 曲線:應用於判定由極度有偏數據所訓練的模型的優劣;
  • ROC 曲線:應用於比較兩個模型的優劣;
  1. 模型:可以是同樣算法不同超參數所得的不同模型,也可以是不同算法所得的不同模型;

 

 3)TPR 和 FPR 的關系

 

  • 關系
  1. 隨着閾值 threshold 的增大,FPR 和 TPR 都逐漸減小;
  2. 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()

  • 分析:

  1. ROC 曲線與圖形邊界圍成的面積,作為衡量模型優劣的標准,面積越大,模型越優;
  2. 可以是同樣算法不同超參數所得的不同模型,也可以是不同算法所得的不同模型;

 

 

三、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)

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM