關于推薦系統,我們之前已經在相關文章中介紹了其概念、原理、目的等。本文中,作者進一步拓展,詳細描述了設計和構建推薦系統的流程。最后,她還附上了一些推薦系統專用的 Python 庫,以簡化流程。 選擇太少不好,但選擇太多會導致癱瘓。 你聽說過著名的果醬實驗嗎?在 2000 年,來自哥倫比亞大學和斯坦福大學的心理學家 Sheena Iyengar 和 Mark Lepper 基于現場實驗提出了一項研究。 平常,消費者在當地食品市場的一家高檔雜貨店購物,那里有個試吃攤位提供了 24 種果醬。某天,同樣的試吃攤位只提供了 6 種果醬。 這項實驗的目的是判斷哪種情況能獲得更高的銷量,預想的是更多種類的果醬能吸引更多的人,從而帶來更多的生意。然而,研究人員觀察到一種奇怪的現象:盡管擺上 24 種果醬時攤位吸引了更多人的興趣,但與只呈上 6 種果醬時相比,銷售額反而更低(大約是后者的十分之一)。 圖源:The Paradox of Choice 所以為什么會這樣?其實大量的選擇看起來確實很有吸引力,但是過量的選擇有時會讓客戶感到困惑和阻礙。因此,即使網上商店可以訪問數以百萬計的商品,但如果沒有好的推薦系統,這些選擇也會弊大于利。 在上一篇關于推薦系統的文章中,我們概述了神奇的推薦系統。現在讓我們更深入地了解它的架構和與推薦系統相關的各種術語。 術語和架構 下面是與推薦系統相關的一些重要術語。 物品/文檔 這些是系統推薦的實體,如 Netflix 上的電影,Youtube 上的視頻和 Spotify 上的歌曲。 查詢/上下文 系統利用一些信息來推薦上述物品,這些信息構成了查詢信息。查詢信息還可以是以下各項的組合:
嵌入 嵌入是將分類特征表示為連續值特征的一種方法。換句話說,嵌入是將高維向量轉換到叫做嵌入空間的低維空間。在這種情況下,要推薦的查詢或物品必須映射到嵌入空間。很多推薦系統依賴于學習查詢和物品的適當嵌入表征。 資源地址:https://developers.google.com/machine-learning/glossary/#embeddings 上面是一個很好的推薦系統資源,值得一讀。我在上面做了一些總結,但你可以詳細研究它。它從整體角度描述了推薦系統,特別是從谷歌的角度。 架構概述 推薦系統常見的架構包括以下三個基本組件: 1. 候選生成 這是推薦系統的第一階段,將用戶過去活動中的事件作為輸入,并從一個大型語料庫中檢索一小部分(數百)視頻。主要有兩種常見的候選生成方法:
基于內容的過濾是指根據物品本身的屬性來推薦物品。系統會給用戶推薦與其過去喜歡的物品相類似的東西。
協同過濾依賴于用戶-物品交互,并且基于相似用戶喜歡類似事物的概念,例如購買某物品的客戶也購買了此物品。 2. 評分 另一個模型通常以 10 分為滿分進一步對候選集進行排名和評分,這構成了第二階段。以 Youtube 為例,排名網絡通過豐富的視頻特征和用戶特征獲得期望的目標函數,基于此函數來為每個視頻評分。按其分數排名,評分最高的視頻將呈現給用戶。 3. 重新排名 這是第三階段,系統會考慮額外的限制,以確保多樣性,新鮮度和公平性。例如,系統刪除了之前用戶明確不喜歡的內容,并且還考慮了網站上的任何新物品。 典型推薦系統的整體結構 相似度計算 你如何定義兩個物品是否相似?事實證明,基于內容的過濾和協同過濾技術都應用了某種相似性度量。下面來看看兩種度量方法。 假設有兩部電影-電影 1 和電影 2 屬于兩種不同的類型。我們將兩部電影繪制在二維圖形上,如果電影不屬于某一類別,則賦值為 0;如果電影屬于某一類別,則賦值為 1。 這里,電影 1(1,1)屬于類別 1 和類別 2,而電影 2(1,0)只屬于類別 2。這些坐標可以被看作是向量,這些向量之間的夾角告訴我們它們的相似度。 余弦相似度 計算兩個向量之間夾角的余弦,similarity(movie1,movie2) = cos(movie1,movie2) = cos 45,結果約為 0.7。余弦為 1 時相似度最高,而余弦為 0 時表示相似度為 0。 點積 兩個向量的點積是角的余弦乘以范數的乘積,即 similarity(movie1,movie2) = ||movie1|| ||movie 2|| cos(movie1,movie2)。 推薦系統流程 典型的推薦系統流程包括以下五個階段: 典型的推薦系統流程 假設我們正在構建一個電影推薦系統。系統沒有關于用戶或電影的先驗知識,只知道用戶通過與電影進行交互給出的評分。下面是由電影 ID、用戶 ID 和電影評分組成的數據幀。 電影評分數據幀 因為我們只有自己打出的評分,可能不夠公正,所以我們可以使用協同過濾來搭建推薦系統。 1. 預處理
我們要先將電影評分數據幀轉換為用戶-物品矩陣,也稱為效用矩陣(utility matrix)。 圖源:https://2018./fr/talks/talk-PC-55468/ 矩陣的每個單元格都為用戶對電影的評分。這個矩陣通常可用一個 scipy 稀疏矩陣來表示,因為一些特定的電影沒有評分,所有許多單元格都是空的。如果數據稀疏,協同過濾就沒什么用,所以我們需要計算矩陣的稀疏度。 如果稀疏值達到 0.5 或以上,那么協同過濾可能就不適合了。這里需要注意的另一個重點是,空的單元格實際上代表新用戶和新電影。因此,如果新用戶的比例很高,那么我們可能會考慮使用其他推薦方法,如基于內容的過濾或混合過濾。
總是會有過于積極的用戶(總是打 4 或 5 分)或過于消極的用戶(評分都是 1 或 2)。因此,我們需要對評分進行歸一化,以權衡用戶和物品的偏差。這可以通過均值歸一化來實現。 圖源:Normalisation the Ratings 2. 模型訓練 數據經過預處理后,我們要開始建模構建流程。矩陣分解是協同過濾中常用的一種技術,盡管也有其它方法,如鄰域法(Neighbourhood method)。以下是相關步驟:
用戶評分是由人生成的電影特征。我們認為這些可以直接觀察到的特征很重要。然而,也有一些不可直接觀察到的特定特征,它們在評分預測中也很重要。這些隱性特征被稱為潛在特征(Latent Features)。 潛在因子方法的簡單圖示 潛在特征可以被認為是用戶和物品之間交互的基礎特性。本質上,我們不清楚每個潛在特征代表什么,但可以假設一個特征可能代表一個用戶喜歡喜劇電影,另一個潛在特征可能代表該用戶喜歡動畫電影等等。
圖源:https://2018./fr/talks/talk-PC-55468/ 這里的潛在因子用 K 表示。這個重建的矩陣補充了原始用戶-物品矩陣中的空白單元格,因此現在已經知道未知的評分了。 但是我們如何實現上面所示的矩陣分解呢?好吧,事實證明,有很多方法可以做到這一點,方法如下:
3.超參優化 在調參之前,我們需要挑選一個評估指標。對于推薦系統來說,普遍的評估指標是 Precision@K,它需要查看前 K 個推薦,并計算那些推薦中與用戶實際相關的推薦所占的比例。 因此,我們的目標是找到給出最佳 Precision@K 的參數或者想要優化的任何其它評估指標。一旦找到參數,我們就可以重新訓練模型,以獲得預測的評分,并且我們可以使用這些結果生成推薦。 4. 后處理 然后我們可以對所有預測的評分進行排序,并為用戶獲得前 N 個推薦。我們還希望排除或過濾掉用戶以前已經交互過的物品。就電影而言,沒有必要推薦用戶以前看過或不喜歡的電影。 5. 評估 我們之前已經討論過這個問題,但我們在這里更詳細地討論一下。評估推薦系統的最佳方法是實踐。像 A/B 測試這樣的方法是最好的,因為我們可以從真實的用戶那里得到真實的反饋。然而,如果這行不通,我們就必須求助于一些離線評估。 在傳統的機器學習中,我們通過分割原始數據集來創建一個訓練集和一個驗證集。然而,這對于推薦系統模型不起作用,因為如果我們在一個用戶群上訓練所有數據然后在另一個用戶群上驗證它,模型不會起作用。 因此,對于推薦系統,我們實際上需要隨機地屏蔽掉矩陣中一些已知的評分。然后,我們通過機器學習預測這些屏蔽的評分,然后將預測評分與實際評分進行比較。 線下評估推薦系統 早前,我們討論了 Precision 作為評估指標,這里還有一些其他指標可以使用。 python 庫 有許多專門為了推薦目的而創建的 python 庫可供使用。以下是最受歡迎的幾個:
結論 在本文中,我們討論了推薦在縮小選擇范圍上的重要性。我們還講述了設計和構建推薦系統的流程。實際上,Python 可以訪問大量專門的庫來簡化這個過程。不如嘗試使用一個來構建自己的個性化推薦引擎吧。 |
|