【筆記】混淆矩陣,精准率和召回率


混淆矩陣,精准率和召回率

評論回歸算法的好壞點擊這里

評價分類算法是不能單單靠一個分類准確度就可以衡量的,單用一個分類准確度是有問題的

比如說,一個癌症預測系統,輸入體檢信息,就可以判斷是否得了癌症,這個系統的預測准確率有99.9%,但是不能說這個系統就是好的,因為如果患有癌症的概率是0.1%,那么即使預測所有人都是健康的,也可以達到99.9%的准確率,這樣就發現,這個系統一點用沒有

這種情況可以稱為數據極度偏斜,對於極度偏斜的數據,使用分類准確度來評定的話,可以發現其准確度是非常高的,但是有可能其實算法是不太行的,因此對於這種數據,只使用分類准確度是遠遠不夠的

可以使用比較基礎的混淆矩陣來做進一步的分析

混淆矩陣

對於二分類問題,混淆矩陣實際上就是一個2*2的矩陣,其還需添加一行一列作為內容的標記,其中行代表真實值,列代表預測值,行相當於是這個二維數組的第一個維度,列相當於第二個維度,一般設為0和1,其中0和1的意思看分析的問題對應設置,設0位陰性,1位陽性,則在0,0的位置為預測陰性正確TN,0,1的位置為預測陽性錯誤FP,1,0的位置為預測陰性錯誤FN,1,1的位置為預測陰性正確TP

這就是混淆矩陣,是在分類任務中的一個重要的工具,可以更好的的得到分類算法的好壞,其中,有兩個很重要的通過混淆矩陣才能得到的指標,精准率和召回率

精准率和召回率

精准率的公式,其就是預測為1且預測正確的概率

召回率的公式,其就是真實為1中的預測為1的比例,即真實的發生的事件中成功預測的概率

為什么說精准率和召回率是比分類准確度更好的指標,因為對於一些沒有意義的模型可以很好的分辨出來

那么可以具體實現一下

實現混淆矩陣,精准率和召回率

(在notebook中)

使用手寫識別數據集,由於需要使用的極度偏斜的數據,那么就需要設置內容的條件,即9的時候為1,非9位0,然后對數據集進行分割

  import numpy as np
  from sklearn import datasets

  digits = datasets.load_digits()
  X = digits.data
  y = digits.target.copy()

  y[digits.target==9] = 1
  y[digits.target!=9] = 0

  from sklearn.model_selection import train_test_split
  X_train,X_test,y_train,y_test =      train_test_split(X,y,random_state=666)

使用邏輯回歸,並看一下表現如何

  from sklearn.linear_model import LogisticRegression

  log_reg = LogisticRegression()
  log_reg.fit(X_train,y_train)
  log_reg.score(X_test,y_test)

結果如下

由於是極度偏斜的數據,所以要考察一下其他的性能指標,首先得到預測值以后,就開始求TN,FP,TP,FP,求解代碼如下

  y_log_predict = log_reg.predict(X_test)

  def TN(y_true,y_predict):
      assert len(y_true) == len(y_predict)
      return np.sum((y_true == 0)&(y_predict == 0))

  TN(y_test,y_log_predict)

結果如下

  def FP(y_true,y_predict):
      assert len(y_true) == len(y_predict)
      return np.sum((y_true == 0)&(y_predict == 1))

  FP(y_test,y_log_predict)

結果如下

  def FN(y_true,y_predict):
      assert len(y_true) == len(y_predict)
      return np.sum((y_true == 1)&(y_predict == 0))

  FN(y_test,y_log_predict)

結果如下

  def TP(y_true,y_predict):
      assert len(y_true) == len(y_predict)
      return np.sum((y_true == 1)&(y_predict == 1))

  TP(y_test,y_log_predict)

結果如下

可以嘗試得出混淆矩陣的內容

  def confusion_matrix(y_true,y_predict):
      return np.array([
          [TN(y_true,y_predict),FP(y_true,y_predict)],
          [FN(y_true,y_predict),TP(y_true,y_predict)]
      ])

  confusion_matrix(y_test,y_log_predict)

結果如下

精准率的求解代碼,使用先前的公式即可

  def precision_score(y_true,y_predict):
      tp = TP(y_true,y_predict)
      fp = FP(y_true,y_predict)
      try:
          return tp / (tp+fp)
      except:
          return 0.0

  precision_score(y_test,y_log_predict)

結果如下

召回率的求解代碼,使用先前的公式即可

  def recall_score(y_true,y_predict):
      tp = TP(y_true,y_predict)
      fn = FN(y_true,y_predict)
      try:
          return tp / (tp+fn)
      except:
          return 0.0

  recall_score(y_test,y_log_predict)

結果如下

在sklearn中的混淆矩陣以及精准率和召回率

使用confusion_matrix即可調用出sklearn中的混淆矩陣,使用和上面一樣

  from sklearn.metrics import confusion_matrix

  confusion_matrix(y_test,y_log_predict)

結果如下

使用precision_score即可調用出sklearn中的精准率,使用和上面一樣

  from sklearn.metrics import precision_score

  precision_score(y_test,y_log_predict)

結果如下

使用recall_score即可調用出sklearn中的召回率,使用和上面一樣

  from sklearn.metrics import recall_score

  recall_score(y_test,y_log_predict)

結果如下

以上就是混淆矩陣,精准率以及召回率的概念公式和實現的過程以及sklearn中的類的調用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM