【學習】評價指標理解

目錄

ROC曲線

AUC

KS曲線

P-R曲線

準確率(precision)

召回率(recall)

F1系列

 


ROC曲線

ROC的全稱是Receiver Operating Characteristic Curve,中文名字叫“受試者工作特徵曲線”,顧名思義,其主要的分析方法就是畫這條特徵曲線。ROC曲線的橫軸是FPR(假陽性率、誤診率)、縱軸是TPR(真陽性率、靈敏度)。

這條曲線代表的是在不同的閾值下,FPR和TPR的一個變化曲線,通常,我們希望FPR儘可能的小,而TPR儘可能的大,所以曲線越靠近左上角,模型的效果越好。

def acu_curve(y,prob):
    """
    param y:真實值
    param prob:預測值
    """
    fpr,tpr,threshold = roc_curve(y,prob) ###計算真正率和假正率
    roc_auc = auc(fpr,tpr) ###計算auc的值
 
    plt.figure()
    lw = 2
    plt.figure(figsize=(10,10))
    plt.plot(fpr, tpr, color='darkorange',
             lw=lw, label='ROC curve (area = %0.3f)' % roc_auc) ###假正率爲橫座標,真正率爲縱座標做曲線
    plt.plot([0, 1], [0, 1], color='navy', lw=lw, 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 example')
    plt.legend(loc="lower right")
 
    plt.show()

 

AUC

AUC(Area Under Curve)被定義爲ROC曲線下的面積,取值範圍一般在0.5和1之間。使用AUC值作爲評價標準是因爲很多時候ROC曲線並不能清晰的說明哪個分類器的效果更好,而作爲一個數值,對應AUC更大的分類器效果更好。

 

KS曲線

KS(Kolmogorov-Smirnov)曲線(洛倫茲曲線)的縱軸是表示TPR和FPR的值,就是這兩個值可以同時在一個縱軸上體現,橫軸就是閾值,表示模型能夠將正、負客戶區分開的程度越大。兩條曲線之間相距最遠的地方對應的閾值,就是最能劃分模型的閾值,即KS=max(TPR-FPR),KS值越大,模型的區分度越好。 

 

說明K-S曲線的做法: 

  1. 把模型對樣本的輸出概率(predict_proba)從大到小排序,計算對應不同閾值時,大於等於閾值的樣本數佔總樣本的百分比percentage

  2. 計算閾值取每個概率時對應的TPR和FPR值,分別畫(percentage, TPR)和(percentage, FPR)的曲線

  3. K-S曲線上的KS值,即max(TPR−FPR),即兩條曲線間的最大間隔距離。

 

from sklearn.metrics import roc_curve
import matplotlib.pyplot as plt
 
def KS_cal(y,y_hat_proba):
    """
    param y:真實值
    param y_hat_proba:預測分數
    """
    # 計算ks值
 
    fpr, tpr, _ = roc_curve(y, y_hat_proba)
    diff = np.subtract(tpr, fpr)
    ks = diff.max()
 
    return ks
 
def plot_ks(y,y_hat_proba):
    # 畫ks曲線
 
    fpr, tpr, thresholds = roc_curve(y, y_hat_proba)
    diff = np.subtract(tpr, fpr)
    ks = diff.max()
 
    y_len = len(y)
 
    # 計算比例,這樣計算比較快
    # 也可以自己劃分樣本的比例,自己計算fpr,tpr
    y_hat_proba_sort = sorted(y_hat_proba, reverse=True)
    cnt_list = []
    cnt = 0
    for t in thresholds:
        for p in y_hat_proba_sort[cnt:]:
            if p >= t:
                cnt += 1
            else:
                cnt_list.append(cnt)
                break
    percentage = [c/float(y_len) for c in cnt_list]
 
    if min(thresholds)<=min(y_hat_proba_sort):
        percentage.append(1)
 
    # 以下爲畫圖部分
    best_thresholds = thresholds[np.argmax(diff)]
    best_percentage = percentage[np.argmax(diff)]
    best_fpr = fpr[np.argmax(diff)]
 
    lw = 2
    plt.figure(figsize=(8, 8))
    plt.plot(percentage, tpr, color='darkorange',
             lw=lw, label='True Positive Rate')
    plt.plot(percentage, fpr, color='darkblue',
             lw=lw, label='False Positive Rate')
    plt.plot(percentage, diff, color='darkgreen',
             lw=lw, label='diff')
    plt.plot([best_percentage, best_percentage], [best_fpr, best_fpr+ks],
             color='navy', lw=lw, linestyle='--',label = 'ks = %.2f, thresholds = %.2f'%(ks,best_thresholds))
 
    plt.xlim([0.0, 1.0])
    plt.ylim([0.0, 1.05])
    plt.xlabel('percentage')
    plt.title('Kolmogorov-Smirnov')
    plt.legend(loc="lower right")
    plt.show()

 

P-R曲線

在PR曲線中,以Recall(貌似翻譯爲召回率或者查全率)爲x軸,Precision爲y軸。

# 畫P-R曲線
def pr_curve(y_true, y_scores):
    plt.title('Precision/Recall Curve')# give plot a title
    plt.xlabel('Recall')# make axis labels
    plt.ylabel('Precision')

    precision, recall, thresholds = precision_recall_curve(y_true, y_scores)
    plt.plot(precision, recall)
    plt.show()

 

準確率(precision)

precision 體現了模型對負樣本的區分能力,precision越高,說明模型對負樣本的區分能力越強。

召回率(recall)

recall 體現了分類模型HH對正樣本的識別能力,recall 越高,說明模型對正樣本的識別能力越強,

F1系列

  • f1-score 是precision和recall兩者的綜合。

  • macro-f1會考慮每個類別,得到的值屬於宏觀的值。

  • micro-f1會考慮不同類別的樣本量。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章