當前位置:
首頁 > 知識 > 如何動手設計和構建推薦系統?看這裡

如何動手設計和構建推薦系統?看這裡

選自towardsdatascience

作者:Parul Pandey

機器之心編譯

參與:陳韻瑩、shooting

關於推薦系統,我們之前已經在相關文章中介紹了其概念、原理、目的等。本文中,作者進一步拓展,詳細描述了設計和構建推薦系統的流程。最後,她還附上了一些推薦系統專用的 Python 庫,以簡化流程。

選擇太少不好,但選擇太多會導致癱瘓。

你聽說過著名的果醬實驗嗎?在 2000 年,來自哥倫比亞大學和斯坦福大學的心理學家 Sheena Iyengar 和 Mark Lepper 基於現場實驗提出了一項研究。

平常,消費者在當地食品市場的一家高檔雜貨店購物,那裡有個試吃攤位提供了 24 種果醬。某天,同樣的試吃攤位只提供了 6 種果醬。

這項實驗的目的是判斷哪種情況能獲得更高的銷量,預想的是更多種類的果醬能吸引更多的人,從而帶來更多的生意。然而,研究人員觀察到一種奇怪的現象:儘管擺上 24 種果醬時攤位吸引了更多人的興趣,但與只呈上 6 種果醬時相比,銷售額反而更低(大約是後者的十分之一)。

圖源:The Paradox of Choice

所以為什麼會這樣?其實大量的選擇看起來確實很有吸引力,但是過量的選擇有時會讓客戶感到困惑和阻礙。因此,即使網上商店可以訪問數以百萬計的商品,但如果沒有好的推薦系統,這些選擇也會弊大於利。

在上一篇關於推薦系統的文章中,我們概述了神奇的推薦系統。現在讓我們更深入地了解它的架構和與推薦系統相關的各種術語。

術語和架構

下面是與推薦系統相關的一些重要術語。

物品/文檔

這些是系統推薦的實體,如 Netflix 上的電影,Youtube 上的視頻和 Spotify 上的歌曲。

查詢/上下文

系統利用一些信息來推薦上述物品,這些信息構成了查詢信息。查詢信息還可以是以下各項的組合:

用戶信息,可能包括用戶 ID 或用戶先前交互過的物品。

一些額外的上下文信息,如用戶設備、用戶位置等。

嵌入

嵌入是將分類特徵表示為連續值特徵的一種方法。換句話說,嵌入是將高維向量轉換到叫做嵌入空間的低維空間。在這種情況下,要推薦的查詢或物品必須映射到嵌入空間。很多推薦系統依賴於學習查詢和物品的適當嵌入表徵。

資源地址: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.pycon.ca/fr/talks/talk-PC-55468/

矩陣的每個單元格都為用戶對電影的評分。這個矩陣通常可用一個 scipy 稀疏矩陣來表示,因為一些特定的電影沒有評分,所有許多單元格都是空的。如果數據稀疏,協同過濾就沒什麼用,所以我們需要計算矩陣的稀疏度。

如果稀疏值達到 0.5 或以上,那麼協同過濾可能就不適合了。這裡需要注意的另一個重點是,空的單元格實際上代表新用戶和新電影。因此,如果新用戶的比例很高,那麼我們可能會考慮使用其他推薦方法,如基於內容的過濾或混合過濾。

歸一化

總是會有過於積極的用戶(總是打 4 或 5 分)或過於消極的用戶(評分都是 1 或 2)。因此,我們需要對評分進行歸一化,以權衡用戶和物品的偏差。這可以通過均值歸一化來實現。

圖源:Normalisation the Ratings

2. 模型訓練

數據經過預處理後,我們要開始建模構建流程。矩陣分解是協同過濾中常用的一種技術,儘管也有其它方法,如鄰域法(Neighbourhood method)。以下是相關步驟:

將用戶-物品矩陣分解為兩個潛在因子矩陣——用戶因子矩陣和物品因子矩陣。

用戶評分是由人生成的電影特徵。我們認為這些可以直接觀察到的特徵很重要。然而,也有一些不可直接觀察到的特定特徵,它們在評分預測中也很重要。這些隱性特徵被稱為潛在特徵(Latent Features)。

潛在因子方法的簡單圖示

潛在特徵可以被認為是用戶和物品之間交互的基礎特性。本質上,我們不清楚每個潛在特徵代表什麼,但可以假設一個特徵可能代表一個用戶喜歡喜劇電影,另一個潛在特徵可能代表該用戶喜歡動畫電影等等。

根據這兩個潛在矩陣的內積(inner product)來預測缺失評分。

圖源:https://2018.pycon.ca/fr/talks/talk-PC-55468/

這裡的潛在因子用 K 表示。這個重建的矩陣補充了原始用戶-物品矩陣中的空白單元格,因此現在已經知道未知的評分了。

但是我們如何實現上面所示的矩陣分解呢?好吧,事實證明,有很多方法可以做到這一點,方法如下:

交替最小二乘法(ALS)

隨機梯度下降(SGD)

奇異值分解(SVD)

3.超參優化

在調參之前,我們需要挑選一個評估指標。對於推薦系統來說,普遍的評估指標是 Precision@K,它需要查看前 K 個推薦,並計算那些推薦中與用戶實際相關的推薦所佔的比例。

因此,我們的目標是找到給出最佳 Precision@K 的參數或者想要優化的任何其它評估指標。一旦找到參數,我們就可以重新訓練模型,以獲得預測的評分,並且我們可以使用這些結果生成推薦。

4. 後處理

然後我們可以對所有預測的評分進行排序,並為用戶獲得前 N 個推薦。我們還希望排除或過濾掉用戶以前已經交互過的物品。就電影而言,沒有必要推薦用戶以前看過或不喜歡的電影。

5. 評估

我們之前已經討論過這個問題,但我們在這裡更詳細地討論一下。評估推薦系統的最佳方法是實踐。像 A/B 測試這樣的方法是最好的,因為我們可以從真實的用戶那裡得到真實的反饋。然而,如果這行不通,我們就必須求助於一些離線評估。

在傳統的機器學習中,我們通過分割原始數據集來創建一個訓練集和一個驗證集。然而,這對於推薦系統模型不起作用,因為如果我們在一個用戶群上訓練所有數據然後在另一個用戶群上驗證它,模型不會起作用。

因此,對於推薦系統,我們實際上需要隨機地屏蔽掉矩陣中一些已知的評分。然後,我們通過機器學習預測這些屏蔽的評分,然後將預測評分與實際評分進行比較。

線下評估推薦系統

早前,我們討論了 Precision 作為評估指標,這裡還有一些其他指標可以使用。

python 庫

有許多專門為了推薦目的而創建的 python 庫可供使用。以下是最受歡迎的幾個:

Surprise:python scikit 構建和分析推薦的系統。

Implicit:針對隱式數據集的快速 Python 協同過濾。

LightFM:針對隱式和顯式反饋,通過 Python 實現的很多流行推薦演算法。

pyspark.mlibz*.*recommendation:Apache Spark 的機器學習 API。

結論

在本文中,我們討論了推薦在縮小選擇範圍上的重要性。我們還講述了設計和構建推薦系統的流程。實際上,Python 可以訪問大量專門的庫來簡化這個過程。不如嘗試使用一個來構建自己的個性化推薦引擎吧。

本文為機器之心編譯,轉載請聯繫本公眾號獲得授權。

------------------------------------------------

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 機器之心 的精彩文章:

性能碾壓,價格僅為英特爾一半:AMD推出全新Ryzen旗艦處理器
前瞻研究:工業製造領域人工智慧發展與趨勢

TAG:機器之心 |