1. 程式人生 > 實用技巧 >推薦系統基礎(一):概述

推薦系統基礎(一):概述

文章目錄

1. 簡言

如果說網際網路的目標就是連線一切,那麼推薦系統的作用就是建立更加有效率的連線,推薦系統可以更有效率的連線使用者與內容和服務,節約了大量的時間和成本。

如果把推薦系統簡單拆開來看,推薦系統主要是由資料、演算法、架構三個方面組成。

  • 資料提供了資訊。資料儲存了資訊,包括使用者與內容的屬性,使用者的行為偏好例如對新聞的點選、玩過的英雄、購買的物品等等。這些資料特徵非常關鍵,甚至可以說它們決定了一個演算法的上限。
  • 演算法提供了邏輯。資料通過不斷的積累,儲存了巨量的資訊。在巨大的資料量與資料維度下,人已經無法通過人工策略進行分析干預,因此需要基於一套複雜的資訊處理邏輯,基於邏輯返回推薦的內容或服務。
  • 架構解放了雙手。架構保證整個推薦自動化、實時性的執行。架構包含了接收使用者請求,收集、處理,儲存使用者資料,推薦演算法計算,返回推薦結果等。有了架構之後演算法不再依賴於手動計算,可以進行實時化、自動化的執行。例如在淘寶推薦中,對於資料實時性的處理,就保證了使用者在點選一個物品後,後續返回的推薦結果就可以立刻根據該點選而改變。一個推薦系統的實時性要求越高、訪問量越大那麼這個推薦系統的架構就會越複雜。

2. 知識體系

在這裡插入圖片描述

3. 補充知識

  1. 基尼係數

1905年,統計學家洛倫茨提出了洛倫茨曲線,如圖一。將社會總人口按收入由低到高的順序平均分為10個等級組,每個等級組均佔10%的人口,再計算每個組的收入佔總收入的比重。然後以人口累計百分比為橫軸,以收入累計百分比為縱軸,繪出一條反映居民收入分配差距狀況的曲線,即為洛倫茨曲線。

在這裡插入圖片描述
為了用指數來更好的反映社會收入分配的平等狀況,1912年,義大利經濟學家基尼根據洛倫茨曲線計算出一個反映收入分配平等程度的指標,稱為基尼係數(G)。在上圖中,基尼係數定義為:
G = S A S A + A 2 G=\frac{S_{A}}{S_{A}+A_{2}} G=SA+A2SA
當A為0時,基尼係數為0,表示收入分配絕對平等;當B為0時,基尼係數為1,表示收入分配絕對不平等。基尼係數在0~1之間,係數越大,表示越不均等,係數越小,表示越均等。


基尼係數
基尼係數描述的是物品流行度的分佈趨勢,流行度按照《推薦系統實踐》作者項亮的解釋,就是人與物品發生互動的連線數

按照基尼係數定義,存在這樣的分佈圖:

在這裡插入圖片描述
分組計演算法求解基尼係數
這種方法的思路有點類似用幾何定義計算積分的方法,在X軸上尋找n個分點,將洛倫茨曲線下方的區域分成n部分,每部分用以直代曲的方法計算面積,然後加總求出面積。分點越多,就越準確,當分點達到無窮大時,則為精確計算。

梯形面積公式:
( 上 底 + 下 底 ) ∗ 高 / 2 (上底+下底)*高/2 (+)/2

B圖形面積:
B = ∑ [ 1 2 × 1 n × ( w i − 1 + w i ) ] B=\sum\left[\frac{1}{2} \times \frac{1}{n} \times\left(w_{i-1}+w_{i}\right)\right] B=[21×n1×(wi1+wi)]
= 1 2 1 n ( w 0 + w 1 ) + 1 2 1 n ( w 1 + w 2 ) + … + 1 2 1 n ( w n − 1 + w n ) =\frac{1}{2} \frac{1}{n}\left(w_{0}+w_{1}\right)+\frac{1}{2} \frac{1}{n}\left(w_{1}+w_{2}\right)+\ldots+\frac{1}{2} \frac{1}{n}\left(w_{n-1}+w_{n}\right) =21n1(w0+w1)+21n1(w1+w2)++21n1(wn1+wn)
= 1 2 1 n ( 0 + 2 w 1 + 2 w 1 + … + 2 w n − 1 + 1 ) = 1 n ∑ i = 1 n − 1 w i + 1 2 1 n \begin{array}{c} =\frac{1}{2} \frac{1}{n}\left(0+2 w_{1}+2 w_{1}+\ldots+2 w_{n-1}+1\right) \\ =\frac{1}{n} \sum_{i=1}^{n-1} w_{i}+\frac{1}{2} \frac{1}{n} \end{array} =21n1(0+2w1+2w1++2wn1+1)=n1i=1n1wi+21n1

代入基尼係數計算公式
G = S A S A + A 2 G=\frac{S_{A}}{S_{A}+A_{2}} G=SA+A2SA
G = 1 2 − 1 n ∑ i = 1 n − 1 w i − 1 2 1 n 1 2 G=\frac{\frac{1}{2}-\frac{1}{n} \sum_{i=1}^{n-1} w_{i}-\frac{1}{2} \frac{1}{n}}{\frac{1}{2}} G=2121n1i=1n1wi21n1

  1. AUC值與ROC曲線

首先,在試圖弄懂AUC和ROC曲線之前,一定,一定要徹底理解混淆矩陣的定義!!!
混淆矩陣中有著Positive、Negative、True、False的概念,其意義如下:

  • 稱預測類別為1的為Positive(陽性),預測類別為0的為Negative(陰性)。
  • 預測正確的為True(真),預測錯誤的為False(偽)。

混淆矩陣如下:
在這裡插入圖片描述
然後,由此引出True Positive Rate(真陽率)、False Positive(偽陽率)兩個概念:

  • TPRate = T P T P + F N \text {TPRate}=\frac{T P}{T P+F N} TPRate=TP+FNTP
  • FPRate = F P F P + T N \text {FPRate}=\frac{F P}{F P+T N} FPRate=FP+TNFP
    仔細看這兩個公式,發現其實TPRate就是TP除以TP所在的列,FPRate就是FP除以FP所在的列,二者意義如下:
  • TPRate的意義是所有真實類別為1的樣本中,預測類別為1的比例。
  • FPRate的意義是所有真實類別為0的樣本中,預測類別為1的比例。

按照定義,AUC即ROC曲線下的面積,而ROC曲線的橫軸是FPRate,縱軸是TPRate,當二者相等時,即y=x,
在這裡插入圖片描述

表示的意義是:對於不論真實類別是1還是0的樣本,分類器預測為1的概率是相等的。

換句話說,分類器對於正例和負例毫無區分能力,和拋硬幣沒什麼區別,一個拋硬幣的分類器是我們能想象的最差的情況,因此一般來說我們認為AUC的最小值為0.5(當然也存在預測相反這種極端的情況,AUC小於0.5,這種情況相當於分類器總是把對的說成錯的,錯的認為是對的,那麼只要把預測類別取反,便得到了一個AUC大於0.5的分類器)。

而我們希望分類器達到的效果是:對於真實類別為1的樣本,分類器預測為1的概率(即TPRate),要大於真實類別為0而預測類別為1的概率(即FPRate),即y>x,因此大部分的ROC曲線長成下面這個樣子:
在這裡插入圖片描述

最理想的情況下,既沒有真實類別為1而錯分為0的樣本——TPRate一直為1,也沒有真實類別為0而錯分為1的樣本——FP rate一直為0,AUC為1.

示例:
首先對於硬分類器(例如SVM,NB),預測類別為離散標籤,對於8個樣本的預測情況如下:
在這裡插入圖片描述
得到混淆矩陣如下:
在這裡插入圖片描述

進而算得TPRate=3/4,FPRate=2/4,得到ROC曲線:
在這裡插入圖片描述
最終得到AUC為0.625。

對於LR等預測類別為概率的分類器,依然用上述例子,假設預測結果如下:
在這裡插入圖片描述
這時,需要設定閾值來得到混淆矩陣,不同的閾值會影響得到的TPRate,FPRate,如果閾值取0.5,小於0.5的為0,否則為1,那麼我們就得到了與之前一樣的混淆矩陣。其他的閾值就不再囉嗦了。依次使用所有預測值作為閾值,得到一系列TPRate,FPRate,描點,求面積,即可得到AUC。

4. 思考

  1. 為什麼使用AUC?
      例如0.7的AUC,其含義可以大概理解為:給定一個正樣本和一個負樣本,在70%的情況下,模型對正樣本的打分高於對負樣本的打分。可以看出這個解釋下,我們關心的只有正負樣本之間的分數高低,而具體的分支則無關緊要
      【多高的AUC才算高】:參考文章 https://zhuanlan.zhihu.com/p/24217322

  2. 如何使用Embedding做召回?
      參考騰訊的推薦系統 embedding 技術實踐總結