1. Precision an Recall
計算公式:
在排序問題中,通常沒有一個確定的閾值把得到的結果直接判定爲正樣本或負樣本,而是採用Top N
返回結果的precision
值和recall
值來衡量排序模型的性能,即認爲模型返回的Top N
的結果就是模型判定的正樣本,然後計算前N個位置上的準確率precision@N
和前N個位置上的召回率recall@N
。
precision
值和recall
值是既矛盾又統一的兩個指標,爲了提高precision
值,分類器需要儘量在“更有把握”時才把樣本預測爲正樣本,但此時往往會因爲過於保守而漏掉很多“沒有把握”的正樣本,導致recall
值降低。
P-R曲線
P-R曲線的橫軸是召回率,縱軸是精確率。對於一個排序模型來說,其P-R曲線上的一個點代表着,在某一閾值下,模型將大於該閾值的結果判定爲正樣本小於該閾值的結果判定爲負樣本,此時返回結果對應的召回率和精確率。整P-R曲線是通過將閾值從高到低移動而生成的。圖2.1是P-R曲線樣例圖,其中實線表模型A的P-R曲線,虛線代表模型B的P-R曲線。原點附近代表當閾值最大時模型的精確率和召回率。
2. F1 Score
F1分數爲精確率和召回率的調和平均:
3. ROC曲線和AUC度量
根據學習器的預測結果對樣例進行排序,按此順序逐個把樣本作爲正例進行預測,每次計算出"真正例率"TPR和"假正例率"FPR,分別以此爲橫縱座標,繪製ROC曲線。通過動態地調整截斷點,從最高的得分開始(實際上是從正無窮開始,對應着ROC曲線的零點),逐漸調整到最低得分,每一個截斷點都會對應一個FPR和TPR,在ROC圖上繪製出每個截斷點對應的位置,再連接所有點就得到最終的ROC曲線。
AUC指的是ROC曲線下的面積大小,該值能夠量化地反映基於ROC曲線衡量出的模型性能。計算AUC值只需要沿着ROC橫軸做積分就可以了。由於ROC曲線一般都處於y=x這條直線的上方(如果不是的話,只要把模型預測的概率反轉成1−p就可以得到一個更好的分類器),所以AUC的取值一般在0.5~1之間。AUC越大,說明分類器越可能把真正的正樣本排在前面,分類性能越好。
AUC的如果按照定義的那樣通過曲線積分計算會比較麻煩,可以通過另外一種方法, 正樣本pos
有M個,負樣本neg
有N個,那麼隨機取一個正樣本負樣本就有M*N種情況。統計M*N中情況中正樣本預測概率>負樣本預測概率的情況數量,當預測概率相等時數量計爲0.5 。 最後計算概率。
代碼實現
//計算AUC
double getAUC(vector<float>&pos,vector<float>&neg){
int n = pos.size(),m = neg.size();
float loss = 0.0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(pos[i]<neg[j]){
loss = loss+1;
}
else if(pos[i]==neg[j]){
loss = loss + 0.5;
}
}
}
return loss/m*n;
}
Q:ROC曲線相比P-R曲線有什麼特點
相比P-R曲線,ROC曲線有一個特點,當正負樣本的分佈發生變化時,ROC曲線的形狀能夠基本保持不變,而P-R曲線的形狀一般會發生較劇烈的變化。
可以看出,P-R曲線發生了明顯的變化,而ROC曲線形狀基本不變。這個特點讓ROC曲線能夠儘量降低不同測試集帶來的干擾,更加客觀地衡量模型本身的性能。這有什麼實際意義呢?在很多實際問題中,正負樣本數量往往很不均衡。比如,計算廣告領域經常涉及轉化率模型,正樣本的數量往往是負樣本數量的1/1000甚至1/10000。若選擇不同的測試集,P-R曲線的變化就會非常大,而ROC曲線則能夠更加穩定地反映模型本身的好壞。所以,ROC曲線的適用場景更多,被廣泛用於排序、推薦、廣告等領域。但需要注意的是,選擇P-R曲線還是ROC曲線是因實際問題而異的,如果研究者希望更多地看到模型在特定數據集上的表現,P-R曲線則能夠更直觀地反映其性能。