性能度量是衡量模型泛化能力的評價標準,模型的好壞是相對的,模型的好壞不只取決於算法和數據,還決定於任務的需求。算法
迴歸任務中經常使用的性能度量是:均方偏差(越小越好),解釋方差分(越接近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(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)式計算的