分類模型評估——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。
圖1 Precision和Recall
查準率和查全率用來衡量搜尋引擎的效能,查全率=(檢索出的相關資訊量/系統中的相關資訊總量)x100%,查準率=(檢索出的相關資訊量/檢索出的資訊總量)x100%。一般來說,Precision 就是檢索出來的條目中(比如:文件、網頁等)有多少是準確的,Recall就是所有準確的條目有多少被檢索出來了。為什麼要引入這兩個概念?
假設有一個大小為1000的帶布林標籤資料集,裡面的“真”樣本只有100不到,剩下都是假樣本。假設訓練一個模型,不管輸入什麼資料,它只給出“假”的預測,那麼正確率依舊是90%以上,很明顯,這個時候準確率accuracy就失去它的作用。因此,查全率和查準率一般用在傾斜資料集的時候。
查全率是衡量檢索系統和檢索者檢出相關資訊的能力,查準率是衡量檢索系統和檢索者拒絕非相關資訊的能力。
實驗證明,在查全率和查準率之間存在著相反的相互依賴關係--如果提高輸出的查全率,就會降低其查準率,反之亦然。
查準率與查全率
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所示:
圖2 F-Measure
當引數a=1時,就是最常見的F1了,如圖3所示:
圖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所示:
圖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所示:
圖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所示:
圖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所示:
圖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 版權宣告:本文為博主原創文章,轉載請附上博文連結!