1. 程式人生 > 實用技巧 >分類模型的評價指標

分類模型的評價指標

分類模型的評價指標

  • 問題:如何評判兩部手機的好壞?
    • 1.根據效能評價
    • 2.根據外觀評價
    • 3.根據價格評價
  • 分析:如果對一個事物進行好壞的評價,首先我們一定是在指定場景下,使用符合該場景相關的評價標準對其進行好壞的評價!那麼歸於分類模型的評價有如下幾種方式:
    • 準確率
    • 精準率
    • 召回率
    • f1-Score
    • auc曲線(只能用於二分類模型的評價)
  • 在介紹每種評價指標之前,首先我們來看一個叫做混淆矩陣的東西:

混淆矩陣

  • 概念:在分類任務下,預測結果(Predict Condition)和真實結果(True Condition)之間存在的四種不同的組合。適用於二分類和多分類
  • 例子:設計一個二分類的場景,將圖片分類為貓或者狗。則:

    • 真正例(TP):本來是貓結果預測值為貓的比例(預測為正例是真的)
    • 偽正例(FP):本來不是貓結果預測值為貓的比例(預測為正例是假的)
    • 偽反例(FN):本來是貓結果預測值為不是貓的比例(預測為反例是假的)
    • 真反例(TN):本來不是貓結果預測值為不是貓的比例(預測為反例是真的)
      • 真正例率TPR = TP / (TP + FN)
        • 預測為正例且實際為正例的樣本佔所有訓練集中為正例樣本的比例。
        • 將正例預測對的佔正樣本的比例(預測對的比例),這個比例越大越好
      • 偽反例率FPR = FP / (FP + TN)
        • 預測為正例但實際為負例的樣本佔訓練集中所有負例樣本的比例
        • 將負例預測錯的佔負樣本的比例(預測錯的比例),這個比例越小越好

          - 注意:如果有其他的類別,其他的每一個類別也有其對應的混淆矩陣表示真偽正例和真偽反例的比例

準確率

  • Accuracy = (TP+TN)/(TP+FN+FP+TN)
    • 解釋:(預測正確)/(預測對的和不對的所有結果),簡而言之就是預測正確的比例。
    • 模型.score()方法返回的就是模型的準確率

召回率(較多被使用)

  • Recal = TP/(TP+FN)
    • 解釋:真正為正例的樣本中預測結果為正例的比例。正樣本有多少被找出來了(召回了多少)
    • 例子:醫院預測一個病人是否患有癌症。假設有100個測試樣本(10個癌症患者,90個非癌症患者),最終預測結果為6個癌症患者,94個非癌症患者。召回率就是在10癌症患者中預測正確多少個,或者說在癌症患者中預測出癌症患者的比例(預測出的癌症患者/所有癌症患者(預測正確的+預測錯誤的))。
    • 使用場景:
      • 是否患癌症
      • 產品是否為殘次品
  • API:recall_score

精確率

  • Precision = TP/(TP+FP)
    • 解釋:預測結果為正例樣本(TP+FP)中真實值為正例(TP)的比例。
      • 本來是貓預測也為貓 /(本來是貓預測也為貓+本來不是貓預測為貓)
  • API:accuracy_score

f1-score:精確率和召回率的調和平均數

  • 有時候我們需要綜合精確率和召回率的指標,則需要使用f1-score
  • 模型的精確率和召回率是有矛盾的,而F1分數(F1-score)是分類問題的一個衡量指標。一些多分類問題的機器學習競賽,常常將F1-score作為最終測評的方法。它是精確率和召回率的調和平均數,最大為1,最小為0。
  • 反應了模型的穩健性
  • 它是精確率和召回率的調和平均數
  • 是一個綜合的評判標準
  • API:f1_score

AUC

  • AUC是一個模型評價指標,只能用於二分類模型的評價。該評價指標通常應用的比較多!
    • 應用的比較多是原因是因為很多的機器學習的分類模型計算結果都是概率的形式(比如邏輯迴歸),那麼對於概率而言,我們就需要去設定一個閾值來判定分類,那麼這個閾值的設定就會對我們的正確率和準確率造成一定成都的影響。
      • 邏輯迴歸的預設閾值為0.5
  • AUC(Area under Curve),表面上意思是曲線下邊的面積,這麼這條曲線是什麼?
    • ROC曲線(receiver operating characteristic curve,接收者操作特徵曲線)
      • 真正例率TPR = TP / (TP + FN)
          - 預測為正例且實際為正例的樣本佔所有訓練集中為正例樣本的比例。
          - 將正例預測對的佔正樣本的比例(預測對的比例),這個比例越大越好
        
      • 偽反例率FPR = FP / (FP + TN)
          - 預測為正例但實際為負例的樣本佔訓練集中所有負例樣本的比例
          - 將負例預測錯的佔負樣本的比例(預測錯的比例),這個比例越小越好
        
  • 在理想情況下,最佳的分類器應該儘可能地處於左上角,這就意味著分類器在偽反例率(預測錯的概率)很低的同時獲得了很高的真正例率(預測對的概率)。也就是說ROC曲線圍起來的面積越大越好,因為ROC曲線面積越大,則曲線上面的面積越小,則分類器越能停留在ROC曲線的左上角。
    • AUC的的取值是固定在0-1之間。AUC的值越大越好。
  • AUC的API
    • from sklearn.metrics import roc_auc_score
    • y_pre = predict_proba(x_test)返回預測的概率
    • auc=roc_auc_score(y_test,y_pre[:,1])
from sklearn.metrics import roc_auc_score,f1_score,recall_score,accuracy_score
import sklearn.datasets as dt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression


iris = dt.load_iris()
feature = iris.data
target = iris.target

x_train,x_test,y_train,y_test = train_test_split(feature,target,test_size=0.2,random_state=2020)

l = LogisticRegression()
l.fit(x_train,y_train)

l.score(x_test,y_test)  #0.8666666666666667

y_pred = l.predict(x_test)

recall_score(y_test,y_pred,average='macro')  #0.8666666666666667

accuracy_score(y_test,y_pred)  #0.8666666666666667
f1_score(y_test,y_pred,average='macro')  #0.8666666666666668