在開發一些機器學習應用時,經常需要展示模型的roc曲線以及auc值。我們固然可以在**中編寫函式或者直接呼叫已有的軟體包來計算,但在某些場景下當面臨的資料量很大時,網路的傳輸可能會影響系統的效能。這種情況下可以考慮直接在sql語句中計算,而不需要將資料傳回到客戶端,從而提公升效率和穩定性。
計算auc值需要兩個引數:模型的輸出值和樣本真實的標籤。我們可以假設資料庫中有乙個表用來儲存這兩個資訊,然後基於這個表進行計算。為此我們先建立一張資料表(文中的例子均以postgresql語法編寫)
create
table score_label(
score int
, label boolean
);
insert
into score_label (score, label)
values(9
,true);
insert
into score_label (score, label)
values(8
,false);
insert
into score_label (score, label)
values(7
,true);
insert
into score_label (score, label)
values(6
,false
);
這裡舉了個最簡單的例子:總共包含四個樣本,對應的auc是0.75。如果對auc的計算還沒有完全明確的同學可以看我之前寫的這篇文章。下面可以按照這篇文章中的邏輯來編寫計算邏輯,如下所示:
with roc as
(with
r1 as
(select score,
count(1
) filter (
where label is
true
)as t,
count(1
) filter (
where label is
false
)as f
from score_label
group
by score
order
by score desc),
r2 as
(select score, t, f,
sum(t)
over
(order
by score desc
)as tsum,
sum(f)
over
(order
by score desc
)as fsum
from r1)
, r3 as
(select
case
when
(select
sum(f)
from r2)=0
then
0else f /
(select
sum(f)
from r2)
endas width,
case
when
(select
sum(t)
from r2)=0
then
0else tsum /
(select
sum(t)
from r2)
endas y,
case
when
(select
sum(f)
from r2)=0
then
0else fsum /
(select
sum(f)
from r2)
endas x
from r2
union
select0,
0,0)
, r4 as
(select
*from r3
order
by x)
, r5 as
(select cast(x as
numeric(18
,3)) x,
cast(y as
numeric(18
,3)) y,
(y + lag(y,1,
0.0)
over
(order
by x, y)
)* width /
2as area
from r4)
select array_agg(x) x,
array_agg(y) y,
cast(
sum(area)
asnumeric(18
,2))
as auc
from r5)
select
*from roc;
整個邏輯乍看起來比較龐雜,實際上是通過with
語法把整個計算邏輯逐步展開,先按照score
進行分組排序,然後分別計算每個點對應的tpr
和fpr
,最後再按照微積分的思想對y
進行積分。這裡我們不僅能計算出auc,還可以同時把roc曲線上的各個點以陣列的形式返回。執行這段sql可以得到以下結果:xy
auc0.75
有了這段sql邏輯之後,我們可以將其定義成資料庫中的儲存過程,或者通過客戶端直接呼叫這段sql,從而直接地在資料庫中完成auc的計算,而不需要將對應的資料表中的資料返回到客戶機上,提公升系統效能。
2018-12-02
AUC如何計算
auc area under curve 是機器學習二分類模型中非常常用的評估指標,相比於f1 score對專案的不平衡有更大的容忍性,目前常見的機器學習庫中 比如scikit learn 一般也都是整合該指標的計算,但是有時候模型是單獨的或者自己編寫的,此時想要評估訓練模型的好壞就得自己搞乙個au...
AUC及其計算
含義理解二 auc are under curve 是乙個模型的評價指標,用於分類任務。那麼這個指標代表什麼呢?這個指標想表達的含義,簡單來說其實就是隨機抽出一對樣本 乙個正樣本,乙個負樣本 然後用訓練得到的分類器來對這兩個樣本進行 得到正樣本的概率大於負樣本概率的概率。參考方法一 定義計算 計算面...
使用R和Python計算AUC
某日重新灑下的分割線,無奈的我又用回了python 原因有兩個,第一python用了好久了,不想再去用r了,雖然r的ggplot畫圖很好看,不過今天安裝了python的ggplot庫 好激動!第二,也是r的一大缺憾,就是迴圈簡直是慢得離譜。所以又用回了python,於是,就硬著頭皮來分析之前的程式裡...