為什麼主流APP的推薦總能符合你口味?推薦系統瞭解一下

點擊上方關注,All in AI中國

作者——James Kirk

許多產品使用推薦系統向用戶提供相關或個性化的物品(食物、電影、音樂、書籍、新聞等)。為此,它們從用戶與項目的互動中學習,以識別用戶的品味並作出改進。

這篇文章將帶領我們使用TensorRec(https://github.com/jfkirk/tensorrec)在Python中建立一個新的推薦系統原型,包括輸入數據操作、算法設計和預測用法。

你可以在這裡找到這篇文章的Python代碼。(https://github.com/jfkirk/tensorrec/blob/master/examples/getting_started.py)

為什麼主流APP的推薦總能符合你口味?推薦系統瞭解一下

系統概述

TensorRec是一個用於構建推薦系統的Python包。TensorRec推薦系統使用三個輸入數據:用戶特性、項目特性和交互。根據用戶/項目的特性,系統將預測要推薦的項目。在擬合模型時使用相互作用:將預測與相互作用進行比較,並計算損失/懲罰,然後系統學習減少損失/懲罰。

為什麼主流APP的推薦總能符合你口味?推薦系統瞭解一下

在我們構建系統原型時,我們將解決三個主要問題:如何處理交互、如何處理特性以及如何構建推薦程序本身。

交互數據

對於此示例,我們將使用MovieLens數據集(https://grouplens.org/datasets/movielens/)。此數據集包含電影的1-5星評級、有關這些電影的元數據以及用戶對於電影的標籤。對於我們的第一個原型,我們將專注於評級,但我們稍後將返回其他元數據。

原始形式的評級是這樣的:

為什麼主流APP的推薦總能符合你口味?推薦系統瞭解一下

每行代表一個評級:一個用戶對一部電影的想法。我們將使用這些評級作為我們的數據。我們訓練該系統的第一步是攝取和格式化這個交互數據。首先,我們在CSV文件中讀取評級。

為什麼主流APP的推薦總能符合你口味?推薦系統瞭解一下

在這一點上,我們將通過改組和拆分評級來將評級分解為訓練集和測試集。我們的原型將在訓練集上進行訓練,我們將使用測試集評估它們的程度。像這樣隨機拆分訓練/測試集是粗糙的,還有更嚴格的模型評估技術,但是對於這個例子而言它是快速而清晰的。

為什麼主流APP的推薦總能符合你口味?推薦系統瞭解一下

接下來,我們將這些評級重新組織為一個Scipy稀疏矩陣(https://docs.scipy.org/doc/scipy/reference/sparse.html)。在此矩陣中,每一行代表一個用戶,每一列代表一部電影。此矩陣中的[i,j]值是用戶i與電影j的交互。

為什麼主流APP的推薦總能符合你口味?推薦系統瞭解一下

協同過濾原型

協同過濾是一種算法,它可以瞭解哪些用戶有相似的品味,並根據相似用戶的喜好向用戶推薦商品。一種常見的方法是通過矩陣分解。在矩陣分解中,我們必須學習兩個矩陣(用戶表示和項目表示),當它們相乘時,它們會近似於交互:

為什麼主流APP的推薦總能符合你口味?推薦系統瞭解一下

在這種情況下,W的行是用戶表示,H的列是項目表示,V中的值是交互。我們需要學習W和H來得到V的最佳近似值。

W的寬度和H的高度是相同的——這個共享的維度被稱為"組件的數量。"具有更多組件的模型正在學習更復雜的用戶和項目表示,但這可能導致過度擬合訓練數據。一般來說,我們希望嘗試將大量信息壓縮到小型表示中。出於這個原因,在我們的原型中,我任意選擇使用5個組件。在進一步進行原型設計時,我們應該嘗試增加和減少組件的數量,並警惕過度擬合。

如果僅將身份矩陣作為用戶/項目特性給出,則TensorRec將默認執行矩陣分解。這些身份矩陣通常被稱為"指標特性"。

為什麼主流APP的推薦總能符合你口味?推薦系統瞭解一下

我們現在已經創建了兩個指標特性矩陣,構建了一個包含5個組件的簡單協同過濾模型,並且對模型進行了擬合!

接下來,我們希望看看該模型的表現如何。

為此,我們將查看一個名為"recall at K."的指標.Recall @ K表示,對於普通用戶來說,他們的測試項目中有多少百分比進入預測排名的前K名。換句話說,如果我們得到recall@ 10值為.06,那麼我喜歡的特定電影將有6%的可能性進入我的前10個推薦。

recall@K對於許多推薦系統來說是一個不錯的指標,因為它模仿了推薦產品的行為:如果一個電影網站只向我展示我的十大推薦,那麼他們的算法將能夠有效地將我喜歡的電影放入前十條推薦中。

在計算recall之前,我們要確定哪些交互應該算作"喜歡"。在這種情況下,我選擇使用至少4.0的所有評級作為"喜歡"而忽略其餘的評分。

為什麼主流APP的推薦總能符合你口味?推薦系統瞭解一下

為什麼主流APP的推薦總能符合你口味?推薦系統瞭解一下

我們來看看結果:

為什麼主流APP的推薦總能符合你口味?推薦系統瞭解一下

不是很好。這些結果告訴我們,在測試集電影中,只有0.1%的機會讓喜歡的電影進入前10名。這個推薦系統是無效的。

損失圖

我們可以配置TensorRec系統的一種方法是更改損失圖。損失圖接受預測和交互,並計算系統在學習過程中試圖減少的懲罰(損失)。

默認情況下,TensorRec使用RMSE(均方根誤差)作為損失圖。這意味著TensorRec正試圖準確估計交互的值:如果我給電影打4.5分,TensorRec試圖得到的分數正好是4.5分。

這很直觀,但它並不符合推薦系統在許多產品中的工作方式:電影網站不需要準確預測我的評級,它只需要能夠對我喜歡的電影進行排名。出於這個原因,許多系統通過"學習排名"來運行。我們可以通過使用名為WMRB的損失圖來使我們的TensorRec系統以這種方式工作。

WMRB(https://arxiv.org/abs/1711.04015),它通過隨機抽取用戶未與之交互的項目並將其預測與用戶喜歡的項目進行比較來工作。

我們可以令TensorRec在構造模型時指定WMRB,在擬合模型時指定樣本批量的大小。在這種情況下,我們只想在正評級(≥4.0)上訓練模型,以便WMRB將這些評級推到排名的首位。

為什麼主流APP的推薦總能符合你口味?推薦系統瞭解一下

我們來看看結果:

為什麼主流APP的推薦總能符合你口味?推薦系統瞭解一下

好多了!已經達到了7.76%。TensorRec允許你指定和自定義自己的損失圖,你可以在此處查看更多示例損失圖(https://github.com/jfkirk/tensorrec/blob/master/tensorrec/loss_graphs.py)。

添加元數據特性

為了繼續試驗,我們應該嘗試使用我們可用的其他數據。在MovieLens示例中,我們可以使用電影元數據(例如電影的類型)來豐富推薦。

在原始格式中,電影元數據文件如下所示:

為什麼主流APP的推薦總能符合你口味?推薦系統瞭解一下

首先,我們需要閱讀這些數據,將電影映射到我們的內部ID,並跟蹤每部電影的類型。然後我們將使用Scikit的MultiLabelBinarizer對類型標籤進行二值化。二值化輸出將是我們新推薦系統的特性。

運行此命令將打印出原始元數據和二值化類型的示例:

為什麼主流APP的推薦總能符合你口味?推薦系統瞭解一下

基於內容的推薦

現在我們有關於我們項目的元數據,我們可以嘗試的一件事是僅基於項目元數據進行推薦。

為此,我們將配置TensorRec模型以使用項目特性的傳遞表示圖。對我們而言,這意味著項目表示將與傳入的項目特性(僅僅是電影類型)相同,並且用戶表示將反映用戶對該特定類型的喜愛程度。

為什麼主流APP的推薦總能符合你口味?推薦系統瞭解一下

為什麼主流APP的推薦總能符合你口味?推薦系統瞭解一下

我們來看看結果:

為什麼主流APP的推薦總能符合你口味?推薦系統瞭解一下

它不如協同過濾那麼好,但是,當recall@ 10為1.3%時,它比我們的第一個協同過濾更有效。

這個系統存在一個主要的缺點:單獨的類型不是非常具有描述性,也不足以提供明智的推薦信息。如果我們有更多的描述性元數據(更多標籤、演員、子類型等),我們可以通過這個基於內容的推薦系統獲得更大的成功。

另一方面,該系統有一個主要優勢:僅依靠元數據特性,而不使用指示特性,我們可以推薦在訓練模型時不存在的電影。同樣,如果我們擁有有價值的用戶元數據,我們可以避免使用用戶指標特性,併為之前從未與電影進行過交互的用戶進行預測。這被稱為"冷啟動"推薦。

混合模型

我們知道我們的排名協同過濾給了我們最好的結果,但似乎使用電影元數據也有一些價值。讓我們結合這兩個:我們將使用指標特性來獲得協同過濾的優勢,我們還將使用內容特性來利用元數據。這種將協同過濾和基於內容的推薦相結合的系統稱為"混合"模型。

我們通過將兩組特性疊加在一起來實現此目的:

為什麼主流APP的推薦總能符合你口味?推薦系統瞭解一下

我們來看看結果:

為什麼主流APP的推薦總能符合你口味?推薦系統瞭解一下

recall@ 10的推薦率為7.94%,這是我們目前為止最強大的推薦系統。與純協同過濾的7.76%的結果相比,差異並不明顯,但仍然是一種改進。如果我們使用更多元數據而不僅僅是類型,我們可能會看到更大的改進變化。

提出建議

我們有一個經過訓練的模型,現在我們可以使用這個模型為我們的用戶提出建議。我們通過將用戶的特性向量和所有項目特性傳遞給predict_rank()並檢查結果的排名:

為什麼主流APP的推薦總能符合你口味?推薦系統瞭解一下

此代碼段將得出用戶432的前10個推薦。我選擇了用戶432,因為我熟悉他們評價過的電影,所以我覺得我可以站在他們的角度判斷他們的建議。

讓我們看看用戶432的訓練數據,看看他們喜歡什麼類型的電影:

為什麼主流APP的推薦總能符合你口味?推薦系統瞭解一下

一些犯罪片,一些黑暗喜劇,以及對Tarantino的熱愛。讓我們看看用戶432的混合模型建議:

為什麼主流APP的推薦總能符合你口味?推薦系統瞭解一下

更多帶有黑暗喜劇傾向的犯罪電影!這看起來相當不錯,但讓我們檢查一下用戶432的測試電影:

為什麼主流APP的推薦總能符合你口味?推薦系統瞭解一下

Fargo和Fight Club都在用戶432的推薦中——這是一個很好的結果!對於這個特定的用戶,我們實現了50%的召回率。

展望未來

為了繼續優化我們的推薦系統,我們應該嘗試更多的表示、預測和損失圖,為系統提供更多元數據,以不同方式設計這些元數據特性,以不同方式管理交互/反饋數據,以及優化系統的各種超參數。

為什麼主流APP的推薦總能符合你口味?推薦系統瞭解一下

相關推薦

推薦中...