您當前的位置:首頁 > 繪畫

評價指標設計

作者:由 機智的叉燒 發表于 繪畫時間:2019-06-05

評價指標設計

本來這篇文章想放在[手把手搞推薦]這個系列裡,寫完了感覺更像綜合性的,只是用了這裡面的例子,所以把字首都去了。

評價指標,是判定一個問題你是否已經達到要求,你做的事情是否正確,監控系統是否正常執行的重要指標,因此,他的合理設計在整個演算法流程中非常關鍵的一步,這方面的工作比較玄學複雜,我嘗試性的總結了一下設計的經驗,寫完感覺額,什麼都沒說,當做我水水這樣子吧,不過還是希望對大家有用。

懶人目錄

在這裡先畫重點:

業務指標和效能指標註意區分,在實際情況下可能還會轉化,關鍵還是在於業務指標。

面向你的目標設計評價指標,道理都懂,要想得到並且會去做。

“對不對”和“差多遠”,兩個思路展開設計指標。

多看case,多分析。

指標只能告訴你事情成不成,具體為什麼成,你得看你的流程和結果細節。

然後是目錄:

講道理時間

理論指標

業務指標

設計思路

舉例子

講道理時間

很多人都說,分類查準率、查全率、F1,加個AUC就完事,迴歸MAE,MSE就拉到,不得不說,這些確實是非常重要的指標,但是在現實應用中,這些指標絕對不夠,甚至不能太看,具體細節是怎麼樣的,且聽我細細道來。

首先,我一般會把指標分為兩種,業務指標和理論指標,劃分不嚴格,但是理解起來比較容易。

理論指標

理論指標,就是我們常做模型使用的指標,分類的查準率、查全率、F1、AUC,迴歸的MAE,MSE,都是理論指標,這些理論指標都是用來描述我們模型在數學原理上的“對不對”。

例如,分類的查全率,如recall,就是衡量模型分的對不對的能力,給定實際標籤然後和預測標籤進行比對的結果,用西瓜書的說法就是“能不能把壞瓜找全”這樣的一個含義。

業務指標

業務指標來源於實際問題,是判斷整個事情有沒做好的指標,對模型而言,就是衡量模型“好不好”的指標,有時候理論指標好的模型並不一定有好的業務指標,此時應該更加關注業務指標。例如做推薦除了關注AUC這種理論指標,從產品層面需要關注轉化率、流失率等,推薦系統還要看MRR之類的,這些問題都來源於實際問題,做模型解決問題的核心原因,在商業最最終極的還是在於賺錢,所以關心成本和收益,關注使用者流量,留存情況,這些都是業務指標。

業務指標有一個特點,大都是線下實驗無法檢測的,因為沒有使用者實際使用的體驗資訊,所以常採用AB實驗的方式對模型或者特徵策略的改進進行測驗,業務指標好了才是真的好。

設計思路

知道這兩個概念了,那麼如何設計呢,其實簡單地說就是,回頭看你的目標——根據目標設計。

所有事情都有目標,那麼除了目標本身以外,還需要分析的是“什麼樣叫做達到了目標”,大學校園裡出現最多的目標就是“不掛科”,什麼叫做不掛科,我期末考試60分以上就叫做不掛科,這個60分就是評判指標。

我這裡給出兩個進一步設計的思路——

對不對

差多遠

對不對是非常直接進行指標設計的思路,例如我做分類,對單個問題而言,我就是希望看對不對,非常好理解,對單個問題好理解,那多餘資料集整體,accuracy,即全部樣本里面對的有幾個,就出來了。再舉大學希望不掛科的例子,我看對不對,其實就是看我的掛科率,關注的是“掛沒掛”,掛科率的指標就有了。

差多遠是一個相對間接的方法,例如我做的是迴歸問題,往往不能精準打到最優解,那我就要分析差多遠了,對於資料集整體情況,平均誤差就有了,一般是MAE或者MSE,很容易匯出。再舉大學希望不掛科的例子,我看差多遠,我會看平均分。會看實際每門課的分數距離60分差多少,高低多少。

但是值得注意的是,對於我現在的處境其實不關注過了60分的具體多少,畢竟“60分萬歲”,而關注沒到60分的差多少,我們甚至可以構建一個“合頁誤差”,為了檢查和掛科差多遠,我們只看小於60分的科目距離60分有多少,大於60分的誤差都是0,這樣方便檢測我的掛科情況,指標就設計出來了。

再舉一個比較複雜但是頗為直觀的例子,推薦系統裡面的排序,例如簡單地希望讓點選率高的結果在前面,那我不僅僅要判斷準確率本身,還要判斷我這個點選率到底靠不靠譜,怎麼看,可以看看使用者第一個點選的位置是否排在前面,

nDCG

就有了。

另外,很多時候指標的設計並非一蹴而就,而是設計後經過分析和判斷之後更新改進得到的。

別的說的都有點飄了,來看看一個指標要追求極致應該怎麼設計和分析。

舉例子

還是拿movielens作為例子。前情提要可以看我這些連結。

R&S | 手把手搞推薦[0]:推薦入門小結

R&S | 手把手搞推薦[1]:資料探索

R&S 手把手搞推薦[2]:特徵工程指南

R&S | 手把手搞推薦[3]:資料集存取

R&S | 手把手搞推薦[4]:打分預估模型

我在我的例子目標是做一個打分預估模型,在此時我的核心目標在於讓打分儘可能準,因此我設計的是這幾個指標:

precision,recall,F1,MAE,MSE

雖然這個打分實際上是一個迴歸問題,但實際上我當做是分類問題解決,此時關注的是“對不對”的問題,對於分類問題本身,我應該去看清三大經典分類指標,由於不是二分類所以AUC就沒看了,這是從模型層面去分析的,分類問題要看分類指標,所以三大經典分類指標是一個理論指標,然而由於打分問題實際上是迴歸問題,所以我應該更關注誤差是多少,(對於分類指標而言,實際是4分,你的模型給1分和給3分都算錯,但我們都知道1分差的更遠,然而分類指標無法體現這個)即“差多少”的問題,因此我們需要做的就是MAE和MSE。

然而再進一步,用分類結果得到的打分雖然是實際預測得分,但是如果兩個模型都預測為4分,實際也是4分,我們無法知道誰更接近,於是我們可以藉助分類時給的機率來判斷,模型A預測4分的機率是0。8,模型B預測的4分機率是0。85,那肯定在這個樣本下模型B比A好,所以我們可以對比正確分類的的機率的均值來分高下,甚至,我們可以比整個預測的機率和實際onehot下的歐氏距離,來看看程式碼怎麼寫的,這個寫起來其實比較簡單也比較好理解了。

def

eu_distances

array1

array2

):

res

=

0。0

for

idx

in

range

len

array1

)):

res

=

res

+

array1

idx

-

array2

idx

])

**

2

return

res

/

len

array1

def

average_distance

y_true_prod

y_pred_prod

):

res

=

0。0

for

idx

in

range

len

y_true_prod

)):

res

=

res

+

eu_distances

y_true_prod

idx

],

y_pred_prod

idx

])

return

res

/

len

y_true_prod

夠嗎,感覺還不夠,這裡面有個問題,實際分數是4分,onehot下應為[0,0,0,1,0],模型A預測結果為[0。2,0,0,0。8,0],模型B預測結果為[0,0,0。2,0。8,0],這兩個差距還是一樣的,這個犯了和使用分類指標類似的問題。所以我能不能求一個期望分數,看看和實際分數的差距,這個當然可以有,透過預測的機率和對應得分求期望即可得到期望分數,1分的機率乘以1加上2分的機率乘以2以此類推,再拿這個分數和實際分數對比,這個差距算MAE或者MSE就更為精準了,我把它稱為期望分數MAE和期望分數MSE,上程式碼。

from

sklearn。metrics

import

mean_absolute_error

mean_squared_error

def

exp_score

y_pred_prod

classes_get

):

exp_get

=

0。0

for

idx

in

range

len

y_pred_prod

)):

exp_get

=

exp_get

+

y_pred_prod

idx

*

classes_get

idx

return

exp_get

def

exp_score_batch

y_pred_prod

classes_get

):

exp_get

=

[]

for

idx

in

range

len

y_pred_prod

)):

exp_get

append

exp_score

y_pred_prod

idx

],

classes_get

))

return

exp_get

exp_sc

=

exp_score_batch

y_test_oh

clf

classes_

# 期望分數

exp_mae

=

mean_absolute_error

exp_sc

y_pred

# 期望分數MAE

exp_mse

=

mean_squared_error

exp_sc

y_pred

# 期望分數MSE

當然了,在這個lr分類模型層面,這個期望分數MAE和期望分數MSE已經算是業務指標了,畢竟我們要求的是打分儘可能準,但是對於整個推薦系統而言,還是隻是效能指標,我們可能還要透過上線瞭解使用者實際的打分情況、喜好程度,另外的停留時間、上線頻次等,其實是針對使用者體驗本身的指標,我們同樣要在上線後的AB實驗進行監控,這個才是最終的業務指標。

當然這個指標也不見得是個好指標,後面可能還有改進,有興趣的可以和我聊聊,我今天的重點在聊思路。

後記

要問我最終怎麼設計指標的,說白了還是經驗,加上前輩給的意見,才有了一些想法,很多時候,新的指標設計來源於業務目標,指標就是為了評判成敗而生的,另一方面,評判的過程中我們會發現一些不合理的地方,然後會改進,所以綜上,我再給幾個建議。

多看case,理解資料,理解資料結果,理解業務。

看指標的目的是為了告訴你事情成沒成,有多好,具體為什麼,怎麼改進,至少他辦不到,你得找別的去,原因要看你的過程和本身的資料集,看改進要分析badcase。

標簽: 指標  prod  分數  pred  EXP