在二分類問題中,一般假設正負類別相對均衡,然而實際應用中類別不平衡的問題,如100, 1000, 10000倍的數據偏斜是很是常見的,好比疾病檢測中未患病的人數遠超患病的人數,產品質量檢測中合格產品數量遠超不合格產品等。在檢測信用卡欺詐問題中,一樣正例的數目稀少,並且正例的數量會隨着時間和地點的改變而不斷變化,分類器要想在不斷變化的正負樣本中達到好的檢測效果是很是困難的。html
因爲類別不平衡問題的特性使然,通常常使用於評估分類器性能的準確率和錯誤率可能就再也不適用了。由於在類別不平衡問題中咱們主要關心數目少的那一類可否被正確分類,而若是分類器將全部樣例都劃分爲數目多的那一類,就能輕鬆達到很高的準確率,但實際上該分類器並無任何效果。
因此在這種時候學習的前提每每是採用不一樣的評估指標。學習機器學習的過程當中總難免碰到各類評估指標,剛開始很容易被五花八門的術語繞暈了,因此類別不平衡問題的第一篇先對這些指標進行梳理。畢竟評估指標不明確的話,後面模型的效果好壞也就無從談起。python
在二分類問題中,通常將數目少的類別視爲正例,數目多的類別視爲負例,下面先用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。
spa
上面介紹的這些指標都沒有考慮檢索結果的前後順序,而像搜索問題中咱們一般但願第一個結果是與查詢最相關的,第二個則是次相關的,以此類推,於是有時候不只要預測準確,對於相關性的順序也很是看重。因此最後介紹兩個普遍應用的排序指標。code
Mean Average Precision (MAP,平均準確率均值),對於單個信息需求,返回結果中在每篇相關文檔上 Precision 的平均值被稱爲 Average Precision (AP),而後對全部查詢取平均獲得 MAP。
\[ \text{AP} = \frac{\sum\limits_{k=1}^n P(k) \times rel(k)}{M} \\[3ex] \text{MAP} = \sum\limits_{q=1}^Q \frac{\text{AP}_q}{Q} \]
其中 \(P(k)\) 爲前 \(k\) 個結果的 Precision,又可寫爲\(\text{P}@\text{k}\)。 \(rel(k)\) 表示第 \(k\) 個結果是否爲相關文檔,相關爲1不相關爲0,\(M\) 表示全部相關文檔的數量,\(n\) 表示全部文檔數量。若是隻關心前 \(K\) 個查詢的狀況,則是下式:
\[ \text{AP}\,@\,K = \frac{\sum\limits_{k=1}^{K} P(k) \times rel(k)}{M_K} \\[3ex] \text{MAP}\,@\,K = \sum\limits_{q=1}^Q \frac{\text{AP}_q @ K}{Q} \]
這裏的 \(M_K\) 爲前 \(K\) 個結果中相關文檔的數量。orm
對於單個信息需求來講,Average Precision 是 PR 曲線下面積的近似值,所以 MAP 可粗略地認爲是某個查詢集合對應的多條 PR 曲線下面積的平均值。htm
Normalized Discounted Cumulative Gain (NDCG,歸一化折扣累計增益) 。若是說 MAP 是基於 0/1 二值描述相關性,那麼 NDCG 則是可將相關性分爲多個等級的指標。
對於信息檢索和推薦之類的問題,每個返回的結果都被賦予一個相關性分數 \(\text{rel}\),則 NDCG 中的 CG 表示前 \(k\) 個結果的分數之和,即累計增益 :
\[ \text{CG}_k = \sum\limits_{i=1}^k \text{rel}_i \]
CG 沒有考慮推薦的次序,因此在此基礎上引入對結果順序的考慮,即相關性高的結果若排在後面則會受更多的懲罰,因而就有了 DCG (discounted CG),折扣累積增益。公式以下:
\[ \text{DCG}_k=\sum_{i=1}^k \frac{2^{\text{rel}_i}-1}{\log_2(i+1)}. \]
\(i\) 表示一個結果在結果集中的順序,若是該結果 \(\text{rel}\) 很高,但排在後面,意味着分母 \(\log_2(i+1)\) 會變大,則相應的整體 DCG 會變小 (注意這裏的 \(\text{log}\) 是以 \(2\) 爲底的)。
對於不一樣的查詢,每每會返回不一樣的結果集,而不一樣結果集之間由於大小不一樣難以直接用 DCG 進行比較,因此須要進行歸一化,這其實和機器學習中不一樣特徵因量綱不一樣要進行歸一化差很少意思。這個歸一化後的指標就是 NDCG :
\[ \text{NDCG}_k=\frac{\text{DCG}_k}{\text{IDCG}_k} \]
其中 IDCG 表示 Ideal DCG, 指某個查詢所能返回的最好結果集,IDCG 的值也是結果集中最大的。將全部結果按相關性大小排序,計算出的 DCG 即爲前 \(k\) 個結果的 IDCG:
\[ \text{IDCG}_k=\sum_{i=1}^{|REL|} \frac{2^{\text{rel}_i}-1}{\log_2(i+1)}. \]
其中 \(|REL|\) 表示按相關性順序排列的結果集。所以 DCG 的值介於 (0, IDCG] ,故 NDCG 的值介於(0,1],這樣就起到了歸一化的效果。不一樣查詢或用戶的 NDCG 平均起來能夠用以評估一個搜索引擎或推薦系統的總體效果。
NDCG 的缺點是須要預先指定每個返回結果的相關性,這個超參數須要人爲指定。
/