評測指標是衡量推薦系統優劣的數據支持,目前應用廣泛的有:點擊率、轉化率、精准率、召回率、F1值、覆蓋率、多樣性等等。不同的指標衡量的標准和目的是不一樣的...今天就來介紹一下覆蓋率和多樣性是如何計算和應用的。
更多推薦系統資源,請參考——《推薦系統那點事兒》
覆蓋率
如何評價推薦系統的優劣,可以通過推薦的內容覆蓋率來衡量。當然它並不是唯一的准則....覆蓋率顧名思義就是推薦商品占整個推薦池的比例,它描述了一個推薦系統對長尾商品的挖掘能力(推薦池即你想推薦的商品池子,由於大部分電商都有一些臟數據或者自己定義了推薦數據的來源,因此才會出現自己的推薦池。)。
然后我們應用了一些算法,得到了推薦結果。那么試想一下,你的推薦系統作用是什么?
- 讓熱銷更熱銷?讓冷門更冷門?
- 所有商品出現的幾率都一樣...
上面兩種場景,第二種或許才是大家期望的吧。如果推薦系統的覆蓋率是100%,就意味着任何的商品內容都有可能出現在用戶面前;而如果覆蓋率只有10%,那么就意味着只能推薦十分之一的商品給用戶,推薦的內容就太狹窄了。
然而覆蓋率只能說明商品的種類問題,不能說明每種商品的出場頻率。因此就需要額外的指標來說明了——基尼系數。
基尼系數
基尼系數描述的是物品流行度的分布趨勢,流行度按照《推薦系統實踐》作者項亮的解釋,就是人與物品發生交互的連接數,我這邊就把它定義為點擊數了。
按照基尼系數的定義,有這樣一個分布圖:

基尼系數的定義就是A的面積除以半個等腰垂直三角形的面積。即
如果還記得微積分的概念,就應該能理解。其中B的面積可以近似的看成是每個小格子的面積。每個小格子都是一個梯形,梯形的面積公式,大家應該都有印象吧!
然后下面就有一大堆的公式推導:
帶入到基尼系數的公式里面,就是:
上面只是公式的推導,有需要的直接使用最后一個公式就行。不過關鍵是\({ w }_{ i }\)的數據是怎么計算的。
首先,有點擊日志的朋友應該能獲取到用戶對物品的點擊數據。那么就可以統計(物品,被點擊次數),然后就能計算出,每種點擊次數有多少個。如:
| 點擊次數 | 個數 |
|---|---|
| 1 | 30w |
| 2 | 20w |
| ... | ... |
| 400 | 2 |
| 520 | 1 |
然后分別格式化點擊次數和個數,我這邊有個思路就是給每一列增加一個行號:
| 點擊次數 | 個數 | 行號 |
|---|---|---|
| 1 | 30w | 101 |
| 2 | 20w | 100 |
| ... | ... | ... |
| 400 | 2 | 2 |
| 520 | 1 | 1 |
然后對行號除以10,給他分成十組:
| 點擊次數 | 個數 | 行號 |
|---|---|---|
| 1 | 30w | 10 |
| 2 | 20w | 10 |
| ... | ... | ... |
| 400 | 2 | 1 |
| 520 | 1 | 1 |
再累加個數,就把數據平均的分到了十個桶中,類似bucket統計。Y軸則直接除以最大值即可,這樣把X軸和Y軸都歸一化到0-1之間即可,然后應用上面的公式就能計算出對應的基尼系數。

得到歸一化后的值就很好計算了 :
select 1-((sum(c2)*2+1)/10) from t
最終就能得到對應的基尼系數。
應用
推薦系統如果想要用好基尼系數,需要搜集一個原始的用戶行為的基尼系數值G1,以及推薦系統后用戶點擊的基尼系數值G2。如果G2>G1,就說明推薦系統讓熱銷更熱銷,而長尾更冷門....我們就需要調整推薦算法,增加商品的覆蓋率,改善商品的推薦分布了。
參考
- 推介一個簡便易用的基尼系數計算公式
- python基尼系數的計算公式
- 《推薦系統實踐》
