機器學習之類別不平衡問題 (1) —— 各種評估指標
機器學習之類別不平衡問題 (2) —— ROC和PR曲線
機器學習之類別不平衡問題 (3) —— 采樣方法
完整代碼
在二分類問題中,通常假設正負類別相對均衡,然而實際應用中類別不平衡的問題,如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 (查准率) = \(\frac{TP}{TP+FP}\) ,Precision衡量的是所有被預測為正例的樣本中有多少是真正例。但Precision並沒有表現有多少正例是被錯判為了負例(即FN),舉個極端的例子,分類器只將一個樣本判為正例,其他所有都判為負例,這種情況下Precision為100%,但其實遺漏了很多正例,所以Precision常和下面的Recall (TPR) 相結合。
True Positive Rate (TPR,真正例率) = \(\frac {TP}{TP+FN}\) ,又稱__Recall__(查全率),Sensitivity(靈敏性)。Recall (TPR)衡量的是所有的正例中有多少是被正確分類了,也可以看作是為了避免假負例(FN)的發生,因為TPR高意味着FN低。Recall的問題和Precision正相反,沒有表現出有多少負例被錯判為正例(即FP),若將所有樣本全划為正例,則Recall為100%,但這樣也沒多大用。
False Negative Rate (FNR,假負例率) = \(\frac{FN}{TP+FN}\) = \(1 - TPR\),由混淆矩陣可以看出該指標的着眼點在於正例,意為有多少正例被錯判成了負例。
True Negative Rate (TNR,真負例率) = \(\frac{TN}{TN+FP}\) ,又稱Specificity(特異性)。Specificity衡量的是所有的負例中有多少是被正確分類了,由於類別不平衡問題中通常關注正例能否正確被識別,Specificity高則FP低,意味着很少將負例錯判為正例,即該分類器對正例的判別具有“特異性”,在預測為正例的樣本中很少有負例混入。
False Positive Rate (FPR,假正例率) = \(\frac{FP}{TN+FP}\) = \(1 - TNR\), 由混淆矩陣可以看出該指標的着眼點在於負例,意為有多少負例被錯判成了正例。在ROC曲線中分別以TPR和FPR作為縱、橫軸作圖,顯示出一種正例與負例之間的“博弈”,在下篇文章中詳解。
F1 score = $$\frac{2}{\frac{1}{recall}+\frac{1}{precision}} = \frac{2 × precision × recall}{precision + recall}$$,是一個綜合指標,為Precision和Recall的調和平均 (harmonic mean),數值上一般接近於二者中的較小值,因此如果F1 score比較高的話,意味着Precision和Recall都較高。
FP和FN還有個還有個與之相關的概念,那就是統計假設檢驗中的第一類錯誤 (Type I error)和第二類錯誤 (Type II error) 。由於我們比較關心正例,所以將負例視為零假設,正例視為備選假設,則第一類錯誤為錯誤地拒絕零假設 (負例),選擇備選假設,則為FP;第二類錯誤為錯誤地接受零假設,則為FN。
上面介紹的這些指標都沒有考慮檢索結果的先后順序,而像搜索問題中我們通常希望第一個結果是與查詢最相關的,第二個則是次相關的,以此類推,因而有時候不僅要預測准確,對於相關性的順序也非常看重。所以最后介紹兩個廣泛應用的排序指標。
Mean Average Precision (MAP,平均准確率均值),對於單個信息需求,返回結果中在每篇相關文檔上 Precision 的平均值被稱為 Average Precision (AP),然后對所有查詢取平均得到 MAP。
其中 \(P(k)\) 為前 \(k\) 個結果的 Precision,又可寫為\(\text{P}@\text{k}\)。 \(rel(k)\) 表示第 \(k\) 個結果是否為相關文檔,相關為1不相關為0,\(M\) 表示所有相關文檔的數量,\(n\) 表示所有文檔數量。如果只關心前 \(K\) 個查詢的情況,則是下式:
這里的 \(M_K\) 為前 \(K\) 個結果中相關文檔的數量。
對於單個信息需求來說,Average Precision 是 PR 曲線下面積的近似值,因此 MAP 可粗略地認為是某個查詢集合對應的多條 PR 曲線下面積的平均值。
Normalized Discounted Cumulative Gain (NDCG,歸一化折扣累計增益) 。如果說 MAP 是基於 0/1 二值描述相關性,那么 NDCG 則是可將相關性分為多個等級的指標。
對於信息檢索和推薦之類的問題,每一個返回的結果都被賦予一個相關性分數 \(\text{rel}\),則 NDCG 中的 CG 表示前 \(k\) 個結果的分數之和,即累計增益 :
CG 沒有考慮推薦的次序,所以在此基礎上引入對結果順序的考慮,即相關性高的結果若排在后面則會受更多的懲罰,於是就有了 DCG (discounted CG),折扣累積增益。公式如下:
\(i\) 表示一個結果在結果集中的順序,如果該結果 \(\text{rel}\) 很高,但排在后面,意味着分母 \(\log_2(i+1)\) 會變大,則相應的總體 DCG 會變小 (注意這里的 \(\text{log}\) 是以 \(2\) 為底的)。
對於不同的查詢,往往會返回不同的結果集,而不同結果集之間因為大小不同難以直接用 DCG 進行比較,所以需要進行歸一化,這其實和機器學習中不同特征因量綱不同要進行歸一化差不多意思。這個歸一化后的指標就是 NDCG :
其中 IDCG 表示 Ideal DCG, 指某個查詢所能返回的最好結果集,IDCG 的值也是結果集中最大的。將所有結果按相關性大小排序,計算出的 DCG 即為前 \(k\) 個結果的 IDCG:
其中 \(|REL|\) 表示按相關性順序排列的結果集。因此 DCG 的值介於 (0, IDCG] ,故 NDCG 的值介於(0,1],這樣就起到了歸一化的效果。不同查詢或用戶的 NDCG 平均起來可以用以評估一個搜索引擎或推薦系統的整體效果。
NDCG 的缺點是需要預先指定每一個返回結果的相關性,這個超參數需要人為指定。
/