1. 程式人生 > >分類模型評估——func()

分類模型評估——func()

“所有模型都是壞的,但有些模型是有用的”。建立模型之後,接下來就要去評估模型,以確定此模型是否“有用”。sklearn庫的metrics模組提供各種評估方法,包括分類評估、迴歸評估、聚類評估和交叉驗證等,本節主要介紹分類模型評估方法。
  評估分類是判斷預測值時否很好的與實際標記值相匹配。正確的鑑別出正樣本(True Positives)或者負樣本(True Negatives)都是True。同理,錯誤的判斷正樣本(False Positive,即一類錯誤)或者負樣本(False Negative,即二類錯誤)。
  注意:True和False是對於評價預測結果而言,也就是評價預測結果是正確的(True)還是錯誤的(False)。而Positive和Negative則是樣本分類的標記。
  metrics模組分類度量有6種方法,如表1所示:

指標 描述 metrics方法
Accuracy 準確度 from sklearn.metrics import accuracy_score
Precision 查準率 from sklearn.metrics import precision_score
Recall 查全率 from sklearn.metrics import recall_score
F1 F1值 from sklearn.metrics import f1_score
Classification Report 分類報告 from sklearn.metrics import classification_report
Confusion Matrix 混淆矩陣 from sklearn.metrics import confusion_matrix
ROC ROC曲線 from sklearn.metrics import roc_curve
AUC ROC曲線下的面積 from sklearn.metrics import auc

7.7.1 準確度

  準確度是預測正確的數(包括正樣本和負樣本)佔所有數的比例。在對模型進行評估前,要按照前面的章節所述步驟,對資料進行收集或建立、預處理、建模和預測等操作,示例程式碼:

# 建立資料集,其中矩陣X表示特徵值,向量y表示所屬類目標記值
import numpy as np
X=np.random.random((10,5))
y=np.array(['M','M','F','F','M','F','M','M','F','F'])
X[X<0.7]=0

# 對矩陣X特徵值進行二值化處理
from sklearn.preprocessing import Binarizer
binarizer = Binarizer(threshold=0.0).fit(X)
binary_X=binarizer.transform(X)

# 對y標記值進行類條件編碼
from sklearn.preprocessing import LabelEncoder
enc=LabelEncoder()
enc_y=enc.fit_transform(y)

# 資料切分為訓練集和測試集
from sklearn.cross_validation import train_test_split
X_train,X_test,y_train,y_test=train_test_split(binary_X,enc_y,random_state=0)

# 利用knn模型對資料進行擬合
from sklearn import neighbors
knn = neighbors.KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train,y_train)

# 對測試集資料預測
y_pred = knn.predict(X_test)
print(y_pred)
print(y_test)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

執行結果

[0 1 1]   #預測標記值
[0 0 1]   #測試標記值
  • 1

  經歷過以上操作後,利用accuracy_score函式對預測資料進行模型評估,其中第一個引數是測試標記,第二個引數是預測標記值。示例程式碼:

from sklearn.metrics import accuracy_score
accuracy_score(y_test, y_pred)
  • 1

執行結果

0.66666666666666663

  由結果可知,knn模型預測的準確率約為66.7%,其中測試標記值y_test的結果為array([0, 0, 1], dtype=int64),而y_pred結果為array([0, 1, 1], dtype=int64),由於資料量比較小,因此準確率為2/3即約等於66.7%。

7.7.2 查準率(Precision)和查全率(Recall)

  查準率和查全率應用在資訊處理領域的多個子領域。為加深理解,先引入下圖1,然後再具體分析。其中,用P代表Precision,R代表Recall。

1240

圖1 Precision和Recall

  查準率和查全率用來衡量搜尋引擎的效能,查全率=(檢索出的相關資訊量/系統中的相關資訊總量)x100%,查準率=(檢索出的相關資訊量/檢索出的資訊總量)x100%。一般來說,Precision 就是檢索出來的條目中(比如:文件、網頁等)有多少是準確的,Recall就是所有準確的條目有多少被檢索出來了。為什麼要引入這兩個概念?
  假設有一個大小為1000的帶布林標籤資料集,裡面的“真”樣本只有100不到,剩下都是假樣本。假設訓練一個模型,不管輸入什麼資料,它只給出“假”的預測,那麼正確率依舊是90%以上,很明顯,這個時候準確率accuracy就失去它的作用。因此,查全率和查準率一般用在傾斜資料集的時候。
  查全率是衡量檢索系統和檢索者檢出相關資訊的能力,查準率是衡量檢索系統和檢索者拒絕非相關資訊的能力。
  實驗證明,在查全率和查準率之間存在著相反的相互依賴關係--如果提高輸出的查全率,就會降低其查準率,反之亦然。

1240

查準率與查全率

  sklearn的metrics模組分別提供了precision_score和recall_score函式用來評估分類模型的查全率和查準率,示例程式碼:

from sklearn.metrics import precision_score      
print(precision_score(y_test, y_pred))
from sklearn.metrics import recall_score   
print(recall_score(y_test, y_pred))
  • 1
  • 2
  • 3

執行結果:

0.5      # 查準率
1.0      # 查全率
  • 1

  由結果可知,查準率為0.5,由於測試集中正確的正樣本只有1個,預測的正樣本有2個,所以依據查準率公式得1/2即0.5。而對於查全率,唯一的1個正確的正樣本被預測樣本涵蓋,因此依據查全率公式得1/1即1.0。

7.7.3 F1值(F1-Measure)

  如上所述,P和R指標有的時候是矛盾的,F-Measure綜合這二者指標的評估指標,用於綜合反映整體的指標。F-Measure是Precision和Recall加權調和平均,公式如圖2所示:

1240

圖2 F-Measure

  當引數a=1時,就是最常見的F1了,如圖3所示:

1240

圖3 F1-Measure

  很容易理解,F1綜合了P和R的結果,當F1較高時則比較說明實驗方法比較理想。利用F1評估分類模型示例程式碼:

from sklearn.metrics import f1_score
f1_score(y_test,y_pred)
  • 1

執行結果:

0.66666666666666663

7.7.4 分類報告(Classification Report)

  metrics模組的classification_report方法,綜合提供了查準率(precision)、查全率(recall)和f1值三種評估指標。示例程式碼:

from sklearn.metrics import classification_report
print(classification_report(y_test,y_pred))
  • 1

執行結果:

precision    recall  f1-score   support

          0       1.00      0.50      0.67         2
          1       0.50      1.00      0.67         1

avg / total       0.83      0.67      0.67         3
  • 1
  • 2
  • 3
  • 4
  • 5

7.7.5 混淆矩陣(Confusion Matrix)

  混淆矩陣是一個N X N矩陣,N為分類的個數。假如我們面對的是一個二分類問題,也就是N=2,我們就得到一個2 X 2矩陣。在學習這個矩陣之前,我們需要知道一些簡單的定義。
Accuracy(準確度):預測正確的數佔所有數的比例。
Positive Predictive Value(陽性預測值) or Precision(查準率):陽性預測值被預測正確的比例。
Negative Predictive Value(陰性預測值):陰性預測值被預測正確的比例。
Sensity(靈敏度) or Recall(查全率):在陽性值中實際被預測正確所佔的比例。
Specificity(特異度):在陰性值中實現被預測正確所佔的比例。
  所有概念及運算方法如圖4所示:

1240

圖4 混淆矩陣

  sklearn庫的metrics模組提供了confusion_matrix方法,用來計算混淆矩陣值,示例程式碼:

from sklearn.metrics import confusion_matrix 
print(confusion_matrix(y_test, y_pred))
  • 1

執行結果:

[[1 1]       # True Positives = 1, False Negatives = 1
 [0 1]]      # False Positives = 0, True Negatives = 1
  • 1

7.7.6 ROC曲線

  ROC(receiver operating characteristic curve)曲線指受試者工作特徵曲線或者是接收器操作特性曲線, 它是反映敏感性和特異性連續變數的綜合指標,是用構圖法揭示敏感性和特異性的相互關係,它通過將連續變數設定出多個不同的臨界值,從而計算出一系列敏感性和特異性,再以敏感性為縱座標、(1-特異性)為橫座標繪製成曲線,曲線下面積越大,診斷準確性越高。在ROC曲線上,最靠近座標圖左上方的點為敏感性和特異性均較高的臨界值。
  考慮一個二分問題,即將例項分成正類(positive)或負類(negative)。對一個二分問題來說,會出現四種情況。如果一個例項是正類並且也被 預測成正類,即為真正類(True positive),如果例項是負類被預測成正類,稱之為假正類(False positive)。相應地,如果例項是負類被預測成負類,稱之為真負類(True negative),正類被預測成負類則為假負類(false negative)。
TP:正確肯定的數目;
FN:漏報,沒有正確找到的匹配的數目;
FP:誤報,給出的匹配是不正確的;
TN:正確拒絕的非匹配對數;
  列聯表如下表所示,1代表正類,0代表負類。

    預測    
    1 0 合計
實際 1 True Positive(TP) False Negative(FN) Actual Positive(TP+FN)
  0 False Positive(FP) True Negative(TN) Actual Negative(FP+TN)
合計   Predicted Positive(TP+FP) Predicted Negative(FN+TN) TP+FP+FN+TN

  從列聯表引入兩個新名詞。其一是真正類率(true positive rate ,TPR), 計算公式為TPR=TP/ (TP+ FN),刻畫的是分類器所識別出的 正例項佔所有正例項的比例。另外一個是假正類率(false positive rate, FPR),計算公式為FPR= FP / (FP + TN),計算的是分類器錯認為正類的負例項佔所有負例項的比例。還有一個真負類率(True Negative Rate,TNR),也稱為specificity,計算公式為TNR=TN/ (FP+ TN) = 1-FPR。如圖5所示:

1240

圖5 TPR和FPR

  如上圖所示,兩列True matches和True non-match分別代表應該匹配上和不應該匹配上的,兩行Pred matches和Pred non-match分別代表預測匹配上和預測不匹配上的。
FPR = FP/(FP + TN) 負樣本中的錯判率(假警報率)
TPR = TP/(TP + TN) 判對樣本中的正樣本率(命中率)
ACC = (TP + TN) / P+N 判對準確率
  在一個二分類模型中,對於所得到的連續結果,假設已確定一個閥值,比如說 0.6,大於這個值的例項劃歸為正類,小於這個值則劃到負類中。如果減小閥值,減到0.5,固然能識別出更多的正類,也就是提高了識別出的正例佔所有正例 的比類,即TPR,但同時也將更多的負例項當作了正例項,即提高了FPR。為了形象化這一變化,在此引入ROC,ROC曲線可以用於評價一個分類器。
  ROC曲線其實就是從混淆矩陣衍生出來的圖形,其橫座標為1-Specificity,縱座標為Sensitivity。1-specificity=FPR(False positive rate),即假正類率。Sensitivity=TPR(True positive rate),即是真正類率。如圖6所示:

1240

圖6 ROC曲線和它相關的比率

  上圖說明,理想情況下,TPR應該接近1,FPR應該接近0。ROC曲線上的每一個點對應於一個threshold,對於一個分類器,每個threshold下會有一個TPR和FPR。比如Threshold最大時,TP=FP=0,對應於原點;Threshold最小時,TN=FN=0,對應於右上角的點(1,1)。在ROC空間,ROC曲線越凸向左上方向效果越好;越靠近對角線,分類器越趨向於隨機分類器。
  利用metrics計算roc曲線,roc曲線有三個屬性:fpr,tpr,和閾值,因此該函式返回這三個變數。示例程式碼:

import numpy as np  
from sklearn.metrics import roc_curve  
y = np.array([1,1,2,2])  
pred = np.array([0.1, 0.4, 0.35, 0.8])  
fpr, tpr, thresholds = roc_curve(y, pred, pos_label=2)
  • 1
  • 2
  • 3
  • 4

fpr,tpr,thresholds分別值為

array([ 0. ,  0.5,  0.5,  1. ])
array([ 0.5,  0.5,  1. ,  1. ])
array([ 0.8 ,  0.4 ,  0.35,  0.1 ])
  • 1
  • 2

7.7.7 AUC(ROC曲線下面積)

  ROC曲線是根據與那條參照線進行比較來判斷模型的好壞,但這只是一種直覺上的定性分析,如果我們需要精確一些,就要用到AUC,也就是ROC曲線下面積。其判定方法是AUC應該大於0.5。如圖7所示:

1240

圖7 AUC曲線

  如上圖所示,參考線的面積是0.5,ROC曲線與它偏離越大,ROC曲線就越往左上方靠攏,它下面的面積(AUC)也就越大,這裡面積是0.869。我們可以根據AUC的值與0.5相比,來評估一個分類模型的預測效果。如果AUC的值達到0.80,那說明分類器分類非常準確;如果AUC值在0.60~0.80之間,那分類器有優化空間,可以通過調節引數得到更好的效能;如果AUC值小於0.60,那說明分類器模型效果比較差。
  利用剛才求得的fpr和tpr的結果作為引數,可以求得AUC的值,示例程式碼:

from sklearn.metrics import auc  
auc(fpr, tpr)
  • 1

執行結果

0.75

--------------------- 作者:howhigh 來源:CSDN 原文:https://blog.csdn.net/howhigh/article/details/73928627?utm_source=copy 版權宣告:本文為博主原創文章,轉載請附上博文連結!