1. 程式人生 > >機器學習之類別不平衡問題 (1) —— 各種評估指標

機器學習之類別不平衡問題 (1) —— 各種評估指標


機器學習之類別不平衡問題 (1) —— 各種評估指標
機器學習之類別不平衡問題 (2) —— ROC和PR曲線


在二分類問題中,通常假設正負類別相對均衡,然而實際應用中類別不平衡的問題,如100, 1000, 10000倍的資料偏斜是非常常見的,比如疾病檢測中未患病的人數遠超患病的人數,產品質量檢測中合格產品數量遠超不合格產品等。在檢測信用卡欺詐問題中,同樣正例的數目稀少,而且正例的數量會隨著時間和地點的改變而不斷變化,分類器要想在不斷變化的正負樣本中達到好的檢測效果是非常困難的。

由於類別不平衡問題的特性使然,一般常使用於評估分類器效能的準確率錯誤率可能就不再適用了。因為在類別不平衡問題中我們主要關心數目少的那一類能否被正確分類,而如果分類器將所有樣例都劃分為數目多的那一類,就能輕鬆達到很高的準確率,但實際上該分類器並沒有任何效果。


所以在這種時候學習的前提往往是採用不同的評估指標。學習機器學習的過程中總不免碰到各種評估指標,剛開始很容易被五花八門的術語繞暈了,所以類別不平衡問題的第一篇先對這些指標進行梳理。畢竟評估指標不明確的話,後面模型的效果好壞也就無從談起。

在二分類問題中,一般將數目少的類別視為正例,數目多的類別視為負例,下面先用matplotlib畫張混淆矩陣圖來直觀地感受一下:

plt.figure(figsize=(10,6))
plt.text(0.5,2.25,'True Positive (TP)',size=20,horizontalalignment="center",verticalalignment="center")
plt.text(1.5,2.4,'False Positive (FP)',size=20,horizontalalignment="center",verticalalignment="center")
plt.text(0.5
,0.9,'False Negative (FN)',size=20,horizontalalignment="center",verticalalignment="center") plt.text(1.5,0.75,'True Negative (TN)',size=20,horizontalalignment="center",verticalalignment="center") plt.text(1,3.4,'$True\ Class$',size=25,horizontalalignment="center") plt.text(-0.5,1.5,'$Predicted$\n$Class$'
,size=23,verticalalignment="center") plt.text(0.5,3.1,'$P$',size=20,horizontalalignment="center") plt.text(1.5,3.1,'$N$',size=20,horizontalalignment="center") plt.text(-0.1,2.25,'$Y$',size=20,va="center") plt.text(-0.1,0.75,'$N$',size=20,va="center") plt.text(2.4,2.25,r'Precision = $\frac{TP}{Y}$ = $\frac{TP}{TP+FP}$ ',size=18,ha="center",va="center") plt.text(0.5,-0.3,'Recall, Sensitivity, TPR = ',size=16,ha="center",va="center") plt.text(0.5,-0.6,'$\\frac{TP}{P}$ = $\\frac{TP}{TP+FN}$',size=18,ha="center",va="center") plt.text(1.5,-0.3,'FPR = $\\frac{FP}{N}$ = $\\frac{FP}{FP+TN}$',size=16,ha="center",va="center") plt.text(1.5,-0.7,'TNR, Specificity = $\\frac{TN}{N}$ = $\\frac{TN}{FP+TN}$',size=16,ha="center",va="center") plt.text(1.5,2.1,'Type I Error',size=20,horizontalalignment="center",verticalalignment="center") plt.text(0.5,0.6,'Type II Error',size=20,horizontalalignment="center",verticalalignment="center") plt.xticks([]) plt.yticks([]) plt.plot([1,1],[0,3],'k--') plt.plot([0,3],[1.5,1.5],'k:') plt.axis([0,2,0,3]) plt.fill_between([0,1],[1.5,1.5],[3,3],color='#98FB98') plt.fill_between([0,1],[0,0],[1.5,1.5],color='#EEA9B8') plt.fill_between([1,2],[0,0],[1.5,1.5],color='#9AFF9A') plt.fill_between([1,2],[1.5,1.5],[3,3],color='#EEB4B4')


這裡寫圖片描述

True Positive (真正例,TP):實際為正例,預測為正例。

False Negative (假負例,FN):實際為正例,預測為負例。

True Negative (真負例,TN):實際為負例,預測為負例。

False Positive (假正例,FP):實際為負例,預測為正例。


Precision (查準率) = TPTP+FP ,Precision衡量的是所有被預測為正例的樣本中有多少是真正例。但Precision並沒有表現有多少正例是被錯判為了負例(即FN),舉個極端的例子,分類器只將一個樣本判為正例,其他所有都判為負例,這種情況下Precision為100%,但其實遺漏了很多正例,所以Precision常和下面的Recall (TPR) 相結合。

True Positive Rate (TPR,真正例率) = TPTP+FN ,又稱Recall(查全率),Sensitivity(靈敏性)。Recall (TPR)衡量的是所有的正例中有多少是被正確分類了,也可以看作是為了避免假負例(FN)的發生,因為TPR高意味著FN低。Recall的問題和Precision正相反,沒有表現出有多少負例被錯判為正例(即FP),若將所有樣本全劃為正例,則Recall為100%,但這樣也沒多大用。

False Negative Rate (FNR,假負例率) = FNTP+FN = 1TPR,由混淆矩陣可以看出該指標的著眼點在於正例,意為有多少正例被錯判成了負例。

True Negative Rate (TNR,真負例率) = TNTN+FP ,又稱Specificity(特異性)。Specificity衡量的是所有的負例中有多少是被正確分類了,由於類別不平衡問題中通常關注正例能否正確被識別,Specificity高則FP低,意味著很少將負例錯判為正例,即該分類器對正例的判別具有“特異性”,在預測為正例的樣本中很少有負例混入。


False Positive Rate (FPR,假正例率) = FPTN+FP = 1TNR, 由混淆矩陣可以看出該指標的著眼點在於負例,意為有多少負例被錯判成了正例。在ROC曲線中分別以TPR和FPR作為縱、橫軸作圖,顯示出一種正例與負例之間的“博弈”,在下篇文章中詳解。

F1 score =

21recall+1precision=2×precision×recallprecision+recall
是一個綜合指標,為Precision和Recall的調和平均 (harmonic mean),數值上一般接近於二者中的較小值,因此如果F1 score比較高的話,意味著Precision和Recall都較高。

FP和FN還有個還有個與之相關的概念,那就是統計假設檢驗中的第一類錯誤 (Type I error)第二類錯誤 (Type II error) 。由於我們比較關心正例,所以將負例視為零假設,正例視為備選假設,則第一類錯誤為錯誤地拒絕零假設 (負例),選擇備選假設,則為FP;第二類錯誤為錯誤地接受零假設,則為FN。