推薦系統系列 - 引導 - 5類系統推薦算法,非常好使,非常全

原文鏈接:https://sq.163yun.com/blog/article/232582687685324800

  ◆ ◆ ◆

  序言

  最近因爲PAC平臺自動化的需求,開始探坑推薦系統。這個乍一聽去樂趣無窮的課題,對於算法大神們來說是這樣的:

  

  而對於剛接觸這個領域的我來說,是這樣的:

  

  在深坑外圍徘徊了一週後,我整理了一些推薦系統的基本概念以及一些有代表性的簡單的算法,作爲初探總結,也希望能拋磚引玉,給同樣想入坑的夥伴們提供一些思路。

  ◆ ◆ ◆

  什麼是推薦系統

  1. 什麼是推薦系統?

  推薦系統是啥?

  如果你是個多年電商(剁手)黨,你會說是這個:

  

  如果你是名充滿文藝細胞的音樂發燒友,你會答這個:

  

  如果你是位活躍在各大社交平臺的點贊狂魔,你會答這個:

  

  沒錯,猜你喜歡、個性歌單、熱點微博,這些都是推薦系統的輸出內容。從這些我們就可以總結出,推薦系統到底是做什麼的。

  目的1. 幫助用戶找到想要的商品(新聞/音樂/……),發掘長尾

  幫用戶找到想要的東西,談何容易。商品茫茫多,甚至是我們自己,也經常點開淘寶,面對眼花繚亂的打折活動不知道要買啥。在經濟學中,有一個著名理論叫長尾理論(The Long Tail)。

  

  套用在互聯網領域中,指的就是最熱的那一小部分資源將得到絕大部分的關注,而剩下的很大一部分資源卻鮮少有人問津。這不僅造成了資源利用上的浪費,也讓很多口味偏小衆的用戶無法找到自己感興趣的內容。

  目的2. 降低信息過載

  互聯網時代信息量已然處於爆炸狀態,若是將所有內容都放在網站首頁上用戶是無從閱讀的,信息的利用率將會十分低下。因此我們需要推薦系統來幫助用戶過濾掉低價值的信息。

  目的3. 提高站點的點擊率/轉化率

  好的推薦系統能讓用戶更頻繁地訪問一個站點,並且總是能爲用戶找到他想要購買的商品或者閱讀的內容。

  目的4. 加深對用戶的瞭解,爲用戶提供定製化服務

  可以想見,每當系統成功推薦了一個用戶感興趣的內容後,我們對該用戶的興趣愛好等維度上的形象是越來越清晰的。當我們能夠精確描繪出每個用戶的形象之後,就可以爲他們定製一系列服務,讓擁有各種需求的用戶都能在我們的平臺上得到滿足。

  ◆ ◆ ◆

  推薦算法

  算法是什麼?我們可以把它簡化爲一個函數。函數接受若干個參數,輸出一個返回值。

  

  算法如上圖,輸入參數是用戶和item的各種屬性和特徵,包括年齡、性別、地域、商品的類別、發佈時間等等。經過推薦算法處理後,返回一個按照用戶喜好度排序的item列表。

  推薦算法大致可以分爲以下幾類[1]:

  • 基於流行度的算法

  • 協同過濾算法

  • 基於內容的算法

  • 基於模型的算法

  • 混合算法

  2.1 基於流行度的算法

  基於流行度的算法非常簡單粗暴,類似於各大新聞、微博熱榜等,根據PV、UV、日均PV或分享率等數據來按某種熱度排序來推薦給用戶。

  

  這種算法的優點是簡單,適用於剛註冊的新用戶。缺點也很明顯,它無法針對用戶提供個性化的推薦。基於這種算法也可做一些優化,比如加入用戶分羣的流行度排序,例如把熱榜上的體育內容優先推薦給體育迷,把政要熱文推給熱愛談論政治的用戶。

  2.2 協同過濾算法

  協同過濾算法(Collaborative Filtering, CF)是很常用的一種算法,在很多電商網站上都有用到。CF算法包括基於用戶的CF(User-based CF)和基於物品的CF(Item-based CF)。

  基於用戶的CF原理如下:

  1. 分析各個用戶對item的評價(通過瀏覽記錄、購買記錄等);

  2. 依據用戶對item的評價計算得出所有用戶之間的相似度;

  3. 選出與當前用戶最相似的N個用戶;

  4. 將這N個用戶評價最高並且當前用戶又沒有瀏覽過的item推薦給當前用戶。

  示意圖如下:

  

  基於物品的CF原理大同小異,只是主體在於物品:

  1. 分析各個用戶對item的瀏覽記錄。

  2. 依據瀏覽記錄分析得出所有item之間的相似度;

  3. 對於當前用戶評價高的item,找出與之相似度最高的N個item;

  4. 將這N個item推薦給用戶。

  示意圖如下:

  

  舉個栗子,基於用戶的CF算法大致的計算流程如下:

  首先我們根據網站的記錄計算出一個用戶與item的關聯矩陣,如下:

  

  

  圖中,行是不同的用戶,列是所有物品,(x, y)的值則是x用戶對y物品的評分(喜好程度)。我們可以把每一行視爲一個用戶對物品偏好的向量,然後計算每兩個用戶之間的向量距離,這裏我們用餘弦相似度來算:

  

  然後得出用戶向量之間相似度如下,其中值越接近1表示這兩個用戶越相似:

  

  最後,我們要爲用戶1推薦物品,則找出與用戶1相似度最高的N名用戶(設N=2)評價的物品,去掉用戶1評價過的物品,則是推薦結果。

  基於物品的CF計算方式大致相同,只是關聯矩陣變爲了item和item之間的關係,若用戶同時瀏覽過item1和item2,則(1,1)的值爲1,最後計算出所有item之間的關聯關係如下:

  

  我們可以看到,CF算法確實簡單,而且很多時候推薦也是很準確的。然而它也存在一些問題:

  1. 依賴於準確的用戶評分;

  2. 在計算的過程中,那些大熱的物品會有更大的機率被推薦給用戶;

  3. 冷啓動問題。當有一名新用戶或者新物品進入系統時,推薦將無從依據;

  4. 在一些item生存週期短(如新聞、廣告)的系統中,由於更新速度快,大量item不會有用戶評分,造成評分矩陣稀疏,不利於這些內容的推薦。

  對於矩陣稀疏的問題,有很多方法來改進CF算法。比如通過矩陣因子分解(如LFM),我們可以把一個nm的矩陣分解爲一個nk的矩陣乘以一個k*m的矩陣,如下圖:

  

  這裏的k可以是用戶的特徵、興趣愛好與物品屬性的一些聯繫,通過因子分解,可以找到用戶和物品之間的一些潛在關聯,從而填補之前矩陣中的缺失值。

  2.3 基於內容的算法

  CF算法看起來很好很強大,通過改進也能克服各種缺點。那麼問題來了,假如我是個《指環王》的忠實讀者,我買過一本《雙塔奇兵》,這時庫裏新進了第三部:《王者歸來》,那麼顯然我會很感興趣。然而基於之前的算法,無論是用戶評分還是書名的檢索都不太好使,於是基於內容的推薦算法呼之欲出。

  舉個栗子,現在系統裏有一個用戶和一條新聞。通過分析用戶的行爲以及新聞的文本內容,我們提取出數個關鍵字,如下圖:

  

  將這些關鍵字作爲屬性,把用戶和新聞分解成向量,如下圖:

  

  之後再計算向量距離,便可以得出該用戶和新聞的相似度了。這種方法很簡單,如果在爲一名熱愛觀看英超聯賽的足球迷推薦新聞時,新聞裏同時存在關鍵字體育、足球、英超,顯然匹配前兩個詞都不如直接匹配英超來得準確,系統該如何體現出關鍵詞的這種“重要性”呢?這時我們便可以引入詞權的概念。在大量的語料庫中通過計算(比如典型的TF-IDF算法),我們可以算出新聞中每一個關鍵詞的權重,在計算相似度時引入這個權重的影響,就可以達到更精確的效果。

  sim(user, item) = 文本相似度(user, item) * 詞權

  然而,經常接觸體育新聞方面數據的同學就會要提出問題了:要是用戶的興趣是足球,而新聞的關鍵詞是德甲、英超,按照上面的文本匹配方法顯然無法將他們關聯到一起。在此,我們可以引用話題聚類:

  

  利用word2vec一類工具,可以將文本的關鍵詞聚類,然後根據topic將文本向量化。如可以將德甲、英超、西甲聚類到“足球”的topic下,將lv、Gucci聚類到“奢侈品”topic下,再根據topic爲文本內容與用戶作相似度計算。

  綜上,基於內容的推薦算法能夠很好地解決冷啓動問題,並且也不會囿於熱度的限制,因爲它是直接基於內容匹配的,而與瀏覽記錄無關。然而它也會存在一些弊端,比如過度專業化(over-specialisation)的問題。這種方法會一直推薦給用戶內容密切關聯的item,而失去了推薦內容的多樣性。

  2.4 基於模型的算法

  基於模型的方法有很多,用到的諸如機器學習的方法也可以很深,這裏只簡單介紹下比較簡單的方法——Logistics迴歸預測。我們通過分析系統中用戶的行爲和購買記錄等數據,得到如下表:

  

  表中的行是一種物品,x1~xn是影響用戶行爲的各種特徵屬性,如用戶年齡段、性別、地域、物品的價格、類別等等,y則是用戶對於該物品的喜好程度,可以是購買記錄、瀏覽、收藏等等。通過大量這類的數據,我們可以迴歸擬合出一個函數,計算出x1~xn對應的係數,這即是各特徵屬性對應的權重,權重值越大則表明該屬性對於用戶選擇商品越重要。

  在擬合函數的時候我們會想到,單一的某種屬性和另一種屬性可能並不存在強關聯。比如,年齡與購買護膚品這個行爲並不呈強關聯,性別與購買護膚品也不強關聯,但當我們把年齡與性別綜合在一起考慮時,它們便和購買行爲產生了強關聯。比如(我只是比如),20~30歲的女性用戶更傾向於購買護膚品,這就叫交叉屬性。通過反覆測試和經驗,我們可以調整特徵屬性的組合,擬合出最準確的迴歸函數。最後得出的屬性權重如下:

  

  基於模型的算法由於快速、準確,適用於實時性比較高的業務如新聞、廣告等,而若是需要這種算法達到更好的效果,則需要人工干預反覆的進行屬性的組合和篩選,也就是常說的Feature Engineering。而由於新聞的時效性,系統也需要反覆更新線上的數學模型,以適應變化。

  2.5 混合算法

  現實應用中,其實很少有直接用某種算法來做推薦的系統。在一些大的網站如Netflix,就是融合了數十種算法的推薦系統。我們可以通過給不同算法的結果加權重來綜合結果,或者是在不同的計算環節中運用不同的算法來混合,達到更貼合自己業務的目的。

  2.6 結果列表

  在算法最後得出推薦結果之後,我們往往還需要對結果進行處理。比如當推薦的內容裏包含敏感詞彙、涉及用戶隱私的內容等等,就需要系統將其篩除;若數次推薦後用戶依然對某個item毫無興趣,我們就需要將這個item降低權重,調整排序;另外,有時系統還要考慮話題多樣性的問題,同樣要在不同話題中篩選內容。

  ◆ ◆ ◆

  推薦結果評估

  當推薦算法完成後,怎樣來評估這個算法的效果?CTR(點擊率)、CVR(轉化率)、停留時間等都是很直觀的數據。在完成算法後,可以通過線下計算算法的RMSE(均方根誤差)或者線上進行ABTest來對比效果。

  ◆ ◆ ◆

  改進策略

  用戶畫像是最近經常被提及的一個名詞,引入用戶畫像可以爲推薦系統帶來很多改進的餘地,比如:

  1. 打通公司各大業務平臺,通過獲取其他平臺的用戶數據,徹底解決冷啓動問題;

  2. 在不同設備上同步用戶數據,包括QQID、設備號、手機號等;

  3. 豐富用戶的人口屬性,包括年齡、職業、地域等;

  4. 更完善的用戶興趣狀態,方便生成用戶標籤和匹配內容。

  另外,公司的優勢——社交平臺也是一個很好利用的地方。利用用戶的社交網絡,可以很方便地通過用戶的好友、興趣羣的成員等更快捷地找到相似用戶以及用戶可能感興趣的內容,提高推薦的準確度。

  ◆ ◆ ◆

  總結

  隨着大數據和機器學習的火熱,推薦系統也將愈發成熟,需要學習的地方還有很多,坑還有很深,希望有志的同學共勉~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章