混淆矩陣
- True negative(TN)肺然,稱為真負率陷揪,表明實際是負樣本預測成負樣本的樣本數(shù)
- False positive(FP)艺蝴,稱為假正率猬腰,表明實際是負樣本預測成正樣本的樣本數(shù)
- False negative(FN),稱為假負率猜敢,表明實際是正樣本預測成負樣本的樣本數(shù)
- True positive(TP)姑荷,稱為真正率,表明實際是正樣本預測成正樣本的樣本數(shù)
幾乎所有評價指標缩擂,都是建立在混淆矩陣基礎上的鼠冕,包括準確率、精準率胯盯、召回率懈费、F1-score、AUC博脑。
ROC曲線
縱軸:True Positive Rate(真正率憎乙,TPR薄坏,recall)預測為正樣本且預測對了的可能性。對于真正例率TPR寨闹,分子是得分>閾值t里面正樣本的數(shù)目胶坠,分母是總的正樣本數(shù)目。
-
橫軸:False Positive Rate(假正率繁堡,F(xiàn)PR)預測為正樣本但是預測錯了的可能性沈善。對于假正例率FPR,分子是得分>閾值t里面負樣本的數(shù)目椭蹄,分母是總的負樣本數(shù)目绳矩。
因此翼馆,如果定義N+(t),N?(t)分別為得分大于t的樣本中正負樣本數(shù)目严沥,N+,N?為總的正負樣本數(shù)目消玄,那么TPR和FPR可以表達為閾值t的函數(shù):
隨著閾值t的變化,TPR和FPR在坐標圖上形成一條曲線兔跌,這條曲線就是ROC曲線浮定。
(0,0):假正率和真正率都為0立美,即分類器全部預測成負樣本
(0,1):假正率為0建蹄,真正率為1,全部完美預測正確
(1,0):假正率為1嘿棘,真正率為0鸟妙,全部完美預測錯誤
(1,1):假正率和真正率都為1,即分類器全部預測成正樣本
-
TPR=FPR房午,斜對角線郭厌,預測為正樣本的結(jié)果一半是對的,一半是錯的液走,代表隨機分類器的預測效果
AUC
ROC曲線一定程度上可以反映分類器的分類效果,但是不夠直觀巷懈,于是,就有了AUC涌攻。AUC實際上就是ROC曲線下的面積。AUC直觀地反映了ROC曲線表達的分類能力因痛。
- AUC = 1鸵膏,代表完美分類器
- 0.5 < AUC < 1廓译,優(yōu)于隨機分類器
- 0 < AUC < 0.5,差于隨機分類器
AUC這個指標有兩種解釋方法院仿,一種是傳統(tǒng)的“曲線下面積”解釋,另一種是關(guān)于排序能力的解釋排惨。其含義可以大概理解為:隨機給定一個正樣本和一個負樣本,分類器輸出該正樣本為正的那個概率值比分類器輸出該負樣本為正的那個概率值大的可能性。可以看出在這個解釋下聚假,我們關(guān)心的只有正負樣本之間的分數(shù)高低,而具體的分值則無關(guān)緊要。即不關(guān)注具體得分,只關(guān)注排序結(jié)果喷户,因此河哑,它特別適用于排序問題的效果評估鲤妥,例如推薦排序的評估底扳。
用AUC評價CTR
- PCTR是把分類器輸出的概率蒲赂,即點擊率的預估值,內(nèi)容的召回往往是根據(jù)PCTR的排序而決定的。我們不僅希望分類器給出是否點擊的分類信息意系,更需要分類器給出準確的概率值,作為排序的依據(jù)饺汹。
- AUC量化了ROC曲線表達的分類能力蛔添,直觀地反映了PCTR的準確性(排序能力)。分類能力越好(AUC越大),那么輸出概率越合理迎瞧,排序的結(jié)果越合理夸溶。
AUC求解
- 得到結(jié)果數(shù)據(jù),數(shù)據(jù)結(jié)構(gòu)為:輸出概率(pctr)凶硅,標簽真值(click)
- 對結(jié)果數(shù)據(jù)按輸出概率(pctr)進行從大到小排序
- 從大到小缝裁,把每一個輸出概率作為分類閾值,統(tǒng)計該分類閾值下的TPR和FPR
- 微元法計算ROC曲線面積足绅、繪制ROC曲線
代碼實現(xiàn)
部分代碼
def get_roc(data,pos,neg):
data = sorted(data , key = lambda x:x[0] , reverse = True)
roc_arr = []
tp = fp = 0
for sample in data:
tp += (1 if sample[1] == 1 else 0)
fp += (1 if sample[1] == -1 else 0)
roc_arr.append((fp/neg , tp/pos))
return roc_arr
def draw_roc(roc_arr):
x = [sample[0] for sample in roc_arr]
y = [sample[1] for sample in roc_arr]
plt.title("ROC curve")
plt.xlabel("False Positive Rate")
plt.ylabel("True Positive Rate")
plt.plot(x,y)
plt.show()
def get_auc(roc_arr):
#計算曲線下面積
auc = 0.
prev_x = 0
for x,y in roc_arr:
auc += (x - prev_x) * y
prev_x = x
return auc
手寫實現(xiàn)AUC:0.747925810015887
調(diào)用sklearn計算AUC:0.7479258153531436