機器學習之性能度量

性能度量是衡量模型泛化能力的評價標準,模型的好壞是相對的,模型的好壞不只取決於算法和數據,還決定於任務的需求。算法

迴歸任務中經常使用的性能度量是:均方偏差(越小越好),解釋方差分(越接近1越好)。函數

分類任務中經常使用的性能度量:性能

1)錯誤率:分類錯誤的樣本數佔樣本總數的比例。學習

2)精度:分類正確的樣本數佔樣本總數的比例。測試

3)查準率也叫準確率(Precision):在全部的預測爲正例的結果中,真正例所佔的比率spa

查準率=真正例/(真正例+假正例).net

「檢索出的信息中有多少比例是用戶感興趣的」,在推薦系統中爲了盡少的打擾用戶,更但願推薦的內容是用戶感興趣的,此時查準率更重要。code

對於多分類問題,計算宏觀查準率(macro_precision)blog

每一類別查準率的計算是,該類別預測對的數目/預測爲該類別的全部數目排序

def macro_precision(true_list,predict_list):
    set_label = set(true_list)
    num_set_of_label = len(set_label)
    # 記錄預測爲各個類別的總數目
    sum_count=Counter(predict_list)
    num_true_dict = defaultdict(int)
    for i,label in enumerate(true_list):
        if predict_list[i]==label:
            num_true_dict[label]+=1
    temp_macro_precision = 0.0
    for key in num_true_dict:
        temp_macro_precision += (num_true_dict[key]/sum_count[key])
    macro_precision = temp_macro_precision / num_set_of_label
    print("my_macro_precision",macro_precision)

多分類微觀查準率(micro_precision)

全部類別預測對的數目/測試集的總數

def micro_precision(true_list,predict_list):
    true_num=0
    for i,label in enumerate(true_list):
        if predict_list[i]==label:
            true_num+=1
    micro_precision=true_num/len(true_list)
    print("my_micro_precision",micro_precision)

4)查全率也叫召回率(Recall):在全部的正例中有多少被成功預測出來了

查全率=真正例/(真正例+假反例)

「用戶感興趣的信息中有多少被檢索出來了。」

對於多分類問題,計算宏觀查全率(macro_recall)

每一類別查全率的計算是,該類別預測對的數目/該類別全部的數目

各個類別查全率的加和/類別的個數

def macro_recall(true_list,predict_list):
    set_label=set(true_list)
    #記錄測試集種各個類別的總數目
    sum_count=Counter(true_list)
    num_set_of_label=len(set_label)
    #統計每一類別預測正確的數目
    num_true_dict=defaultdict(int)
    for i,label in enumerate(true_list):
        if predict_list[i]==label:
            num_true_dict[label]+=1
    temp_macro_recall=0.0
    for key in num_true_dict:
        temp_macro_recall+=(num_true_dict[key]/sum_count[key])
    macro_recall=temp_macro_recall/num_set_of_label
    print("my_macro_recall",macro_recall)

多分類微觀查全率(micro_recall)

全部類別預測對的數目/測試集的總數

def micro_recall(true_list,predict_list):
    true_num=0
    for i,label in enumerate(true_list):
        if predict_list[i]==label:
            true_num+=1
    micro_recall=true_num/len(true_list)
    print("my_micro_recall",micro_recall)

 

微觀查準率和查全率的值相等

查準率與查全率是一對矛盾的度量。通常度量學習器的好壞用F1得分

F1 = 2*(Precision*Recall)/(Precision+Recall)

5)ROC曲線與AUC

詳細介紹參考:

https://zhuanlan.zhihu.com/p/26293316

http://alexkong.net/2013/06/introduction-to-auc-and-roc/

AUC是ROC曲線下的面積

ROC曲線的縱軸是真正例率,橫軸是假正例率。

真正例率(TPR):真實的正例中,被預測正確的比例

計算公式:真正例/(真正例+假反例)

假正例率(FPR):真實的反例中,被預測錯誤的比例

計算公式:假正例/(真反例+假正例)

首先明確:ROC曲線的橫座標和縱座標實際上是沒有相關性的,因此不能把ROC曲線當作一個函數曲線來分析,應該把ROC曲線當作無數個點,這些點表明着一個分類器在不一樣閾值下的分類效果。

ROC如何畫?

假設咱們得到了每一個測試樣本屬於正例的機率輸出,把這些機率從大到小進行排序,咱們從高到低,依次將Score值做爲閾值threshold,當測試樣本屬於正樣本的機率大於或等於這個threshold時,咱們認爲它爲正樣本,不然爲負樣本。每次選取一個不一樣的threshold,咱們就能夠獲得一組FPR和TPR,即ROC曲線上的一點。ROC曲線越接近於左上角說明分類器的性能越好(由於橫軸是假正利率縱軸是真正利率,越接近於左上角說明縱軸值越大真實的正例中,被預測正確的比例越大;橫軸越小,真實的反例中,被預測錯誤的比例越小,說明模型性能越好,具體衡量就是AUC的值越大)。

AUC值的計算

AUC(Area Under Curve)被定義爲ROC曲線下的面積,顯然這個面積的數值不會大於1。又因爲ROC曲線通常都處於y=x這條直線的上方,因此AUC的取值範圍在0.5和1之間。使用AUC值做爲評價標準是由於不少時候ROC曲線並不能清晰的說明哪一個分類器的效果更好,而做爲一個數值,對應AUC更大的分類器效果更好

爲何要使用ROC

由於ROC曲線有個很好的特性:當測試集中的正負樣本的分佈變化的時候,ROC曲線可以保持不變。ROC可以在訓練數據不均衡時很好的度量分類器的性能。

6)宏平均(macro-averaging)和微平均(micro-averaging)

數據不均衡時相對而言應該關注宏平均

 

sklearn.metric的classification_report中的宏平均是用(7)式計算的

相關文章
相關標籤/搜索