0、概述
sklearn.metrics模塊實現了幾個損失、得分和效用函數來衡量分類性能;
關於數據集:
為了訓練分類模型,一般需要准備三個數據集:訓練集train.txt、驗證集dev.txt、測試集test.txt。
- 訓練集:用來訓練模型參數的數據集,模型直接根據訓練集來調整自身參數以獲得更好的分類效果。
- 驗證集:又稱開發集,用於在訓練過程中檢驗模型的狀態,收斂情況。驗證集通常用於調整超參數,根據幾組模型驗證集上的表現決定哪組超參數擁有最好的性能。
- 測試集:用來計算模型的各項評估指標,驗證模型泛化能力。
Tips:測試集的數據一般不在訓練集中,從而用來驗證模型的效果。
1、四個基本概念
TP、True Positive 真陽性:預測為正,實際為正
FP、False Positive 假陽性:預測為正,實際為負
FN、False Negative 假陰性:預測為負、實際為正
TN、True Negative 真陰性:預測為負、實際為負
2、二分類指標
分類模型的評價指標通常有 Accuracy、Precision、Recall 和 F1,以上指標越高,則說明模型比較理想。
- 准確率 Accuracy = 正確分類的樣本數 / 總樣本數。
- 精確率 Precision = 預測為正類並且正確的樣本數 / 預測為正類的樣本數。
- 召回率 Recall = 預測為正類並且正確的樣本數 / 標注為正類的樣本數。
- 綜合評價指標 F1:2(Precision + Recall) / (Precision*Recall),Precision 和 Recall 加權調和平均
Tips:在樣本不均衡的情況下,准確率 Accuracy 這個評價指標有很大的缺陷。比如說1萬封郵件里有10封垃圾郵件(千分之一的概率是垃圾郵件),如果模型將所有郵件判為非垃圾郵件,那acc有99%以上,但實際上該模型是沒意義的。這種情況下就需要使用Precision、Recall、F1作為評價指標。
3、多分類指標
在多分類情況下,則用宏平均(Macro-averaging)和微平均(Micro-averaging)的方法,宏平均是指先計算每一類的各項評估指標,然后再對指標求算術平均值;微平均是指先對混淆矩陣的元素進行平均,得到TP,FP,TN,FN的平均值,然后再計算各項評估指標。
....
F1-score:
是統計學中用來衡量二分類模型精確度的一種指標,用於測量不均衡數據的精度。它同時兼顧了分類模型的精確率和召回率。F1-score可以看作是模型精確率和召回率的一種加權平均,它的最大值是1,最小值是0。
在多分類問題中,如果要計算模型的F1-score,則有兩種計算方式,分別為micro-F1和macro-F1,這兩種計算方式在二分類中與F1-score的計算方式一樣,所以在二分類問題中,計算micro-F1=macro-F1=F1-score,micro-F1和macro-F1都是多分類F1-score的兩種計算方式;
micro-F1:
- 計算方法:先計算所有類別的總的Precision和Recall,然后計算出來的F1值即為micro-F1;
- 取值范圍:(0, 1);
- 適用環境:在計算公式中考慮到了每個類別的數量,多分類不平衡,若數據極度不平衡會影響結果;
marco-F1:
- 計算方法:將所有類別的Precision和Recall求平均,然后計算F1值作為macro-F1;
- 取值范圍:(0, 1);
- 適用環境:多分類問題,沒有考慮到數據的數量,所以會平等的看待每一類,不受數據不平衡影響,容易受到識別性高(高recall、高precision)的類別影響;
#指標測試 from sklearn import metrics from sklearn.metrics import accuracy_score, precision_score, recall_score from sklearn.metrics import f1_score def Evaluate1(y_test,y_predic): print('accuracy:', metrics.accuracy_score(y_test, y_predict)) #預測准確率輸出 print('macro_precision:',metrics.precision_score(y_test,y_predict,average='macro')) #預測宏平均精確率輸出 print('micro_precision:', metrics.precision_score(y_test, y_predict, average='micro')) #預測微平均精確率輸出 # print('weighted_precision:', metrics.precision_score(y_test, y_predict, average='weighted')) #預測加權平均精確率輸出 print('macro_recall:',metrics.recall_score(y_test,y_predict,average='macro'))#預測宏平均召回率輸出 print('micro_recall:',metrics.recall_score(y_test,y_predict,average='micro'))#預測微平均召回率輸出 # print('weighted_recall:',metrics.recall_score(y_test,y_predict,average='weighted'))#預測加權平均召回率輸出 print('macro_f1:',metrics.f1_score(y_test,y_predict,labels=[0,1,2,3,4,5,6],average='macro'))#預測宏平均f1-score輸出 print('micro_f1:',metrics.f1_score(y_test,y_predict,labels=[0,1,2,3,4,5,6,7],average='micro'))#預測微平均f1-score輸出 # print('weighted_f1:',metrics.f1_score(y_test,y_predict,labels=[0,1,2,3,4,5,6],average='weighted'))#預測加權平均f1-score輸出 #target_names = ['class 1', 'class 2', 'class 3','class 4','class 5','class 6','class 7'] # print('混淆矩陣輸出:\n',metrics.confusion_matrix(y_test,y_predict,labels=[0,1,2,3,4,5,6]))#混淆矩陣輸出 #比如[1,3]為2,即1類預測為3類的個數為2 # print('分類報告:\n', metrics.classification_report(y_test, y_predict,labels=[0,1,2,3,4,5,6]))#分類報告輸出 ,target_names=target_names def Evaluate2(y_true,y_pred): print("accuracy:", accuracy_score(y_true, y_pred)) # Return the number of correctly classified samples print("macro_precision", precision_score(y_true, y_pred, average='macro')) print("micro_precision", precision_score(y_true, y_pred, average='micro')) # Calculate recall score print("macro_recall", recall_score(y_true, y_pred, average='macro')) print("micro_recall", recall_score(y_true, y_pred, average='micro')) # Calculate f1 score print("macro_f", f1_score(y_true, y_pred, average='macro')) print("micro_f", f1_score(y_true, y_pred, average='micro')) y_test = [1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4,5,5,6,6,6,0,0,0,0] y_predict = [1, 1, 1, 3, 3, 2, 2, 3, 3, 3, 4, 3, 4, 3,5,1,3,6,6,1,1,0,6] Evaluate1(y_test,y_predict) Evaluate2(y_test,y_predict) ##其中列表左邊的一列為分類的標簽名,右邊support列為每個標簽的出現次數.avg / total行為各列的均值(support列為總和). ##precision recall f1-score三列分別為各個類別的精確度/召回率及 F1值 ''' accuracy: 0.5217391304347826 macro_precision: 0.7023809523809524 micro_precision: 0.5217391304347826 macro_recall: 0.5261904761904762 micro_recall: 0.5217391304347826 macro_f1: 0.5441558441558441 micro_f1: 0.5217391304347826 accuracy: 0.5217391304347826 macro_precision 0.7023809523809524 micro_precision 0.5217391304347826 macro_recall 0.5261904761904762 micro_recall 0.5217391304347826 macro_f 0.5441558441558441 micro_f 0.5217391304347826 '''
參考:
https://blog.csdn.net/lyb3b3b/article/details/84819931
https://blog.csdn.net/qq_43190189/article/details/105778058
https://aistudio.baidu.com/aistudio/projectdetail/926957