如何在Python中使用LightFM構建可擴展的電子商務推薦系統?

AI 前線導讀:在我國,電商非常發達。今年雙 11 的成交額僅僅過了 12 小時就達到了驚人的 1491.6 億元!電商在我國的火爆程度由此可見一斑。不知你們有沒有發現,在網店瀏覽商品時,它們好像能讀懂你的內心,推薦的幾乎都是你想找的寶貝?其實,這背後的功臣就是人工智能的應用之一——推薦系統。今天,我們分享了一篇在 Python 中使用 LightFM 構建可擴展的電子商務推薦系統的文章,以饗讀者。

更多幹貨內容請關注微信公衆號“AI 前線”(ID:ai-front)

在過去的幾年裏,網購的形式發生了翻天覆地的變化。像 Amazon 這樣的網店,以更爲個性化的方式來接待客戶。這些網店根據客戶的網購活動(如查看商品、往購物車裏添加商品以及最終下單的商品等)來了解客戶對某些商品的興趣。例如,你在 Amazon 上搜索某件商品,然後點擊其中一些搜索結果。當你下一次再次登陸 Amazon 時,會看到頁面上有一塊特定部分:“與您瀏覽過的商品相關的推薦”,裏面羅列的是根據你上次搜索內容爲你推薦的類似商品。但故事並未就此結束,隨着你與網店進行更多的交互,你將會得到更多的個性化建議,包括 “購買此商品的顧客也同時購買……”,並向你顯示經常一起購買的商品列表。另外,一些商店還會發送促銷電郵,提供針對客戶更有可能購買的商品清單。

推薦系統是機器學習最常用的應用之一。由於本文的目標是專注於如何使用 LightFM 包來構建推薦系統,並提供明確的指標來衡量模型性能,因此,我將只會簡單提一下不同類型的推薦系統。要了解有關推薦系統的更多詳情,我推薦觀看 Siraj Raval 製作的這部短片, 並閱讀 Chhavi Aluja 撰寫的這篇文章《Recommendation Systems made simple!》

推薦系統有三種類型如下:

  • Content-Based(基於內容的推薦);

  • Collaborative Filtering(協同過濾,CF)(Item-Based、User-Based、Model-Based)

  • 混合方法(整合基於內容的推薦和協同過濾)

我最初的目標是構建一個混合模型,因爲它可以將基於內容的推薦整合到協同過濾中,並能夠通過純協同過濾推薦系統來解決冷啓動問題。然而,有着公開可用的良好數據集,且同時具有商品或用戶的元數據和評級交互,並不是很多。因此,我決定先研究協作過濾模型並理解推薦系統的不同方面,在下一篇文章中,我將會構建一個混合模型。

AI 前線注:所謂冷啓動問題,就是在對用戶一無所知的情況下,如何進行最有效的推薦。

實現方法

爲什麼選擇 LightFM?

我在研究推薦系統時,我無意碰到了許多相關的重大項目,然而,這些項目都缺少一個用於評估模型性能的明確指標。我認爲,如果你無法通過提供的明確指標來評估模型的性能,那麼你可能很難讓人相信這個推薦系統模型運行良好。因此,我選擇 LightFM 的原因是,它提供了明確的指標,可以用於評估訓練模型的性能的 AUC 得分、Precision@K 等。如果想構建更好的模型並實現更高的正確率(accuracy),這可能非常有用。

根據用例或我們要解決的問題類型,究竟是選擇 Precision@K 還是 AUC 分數,這可能是個棘手的問題。在這種情況下,我們將使用 AUC 分數,因爲它能夠測量綜合排名質量,並能夠被解釋爲隨機選擇的正向條目排名高於隨機的負向條目的概率。

根據 LightFM 的文檔可知,“LightFM 是針對隱式和顯式反饋的許多流行的推薦算法的 Python 實現,包括 BPR 和 WARP 排名損失的有效實現。它具備易用、快速(通過多線程模型估計)的特點,能夠產生高質量的結果。”

AI 前線注:LightFM 官方文檔網址爲:http://lyst.github.io/lightfm/docs/home.html

數據

對於這個項目,我們將使用 Book-Crossing 數據集 來實現基於矩陣分解(Matrix Factorization) 方法的純協同過濾模型。我們將利用 Chhavi Aluja 在博文《My Journey to building Book Recommendation System…》 中提到的方法,進行數據清洗,併爲數據集進行預處理。讓我們來看一下數據:

image

image

image
image

image
以上代碼塊的用途是常規數據清洗,以確保在將數據用於模型中的輸入之前,數據格式是正確的。此外,我們還需要確保評級數據幀中的所有行都代表了來自用戶和圖書數據幀的數據。接下來,評級必須只包括有效的評級分數(1-10),因此我們應該去掉所有評級值爲零的所有行。

image

這是評級值的分佈:

image

要完成數據預處理的最後一件事就是,爲已評級圖書的用戶數量和用戶評分的圖書數量指定一個閾值。換言之,我們必須有用戶和圖書的最低評級計算數量。我認爲,只有至少爲 20 本圖書評級的用戶和至少被 20 位用戶評級的圖書,這樣感覺就會很好。

image

ratings_explicit.shape
(217729, 3)

訓練模型

在此步驟中,我們將訓練模型,但問題有所不同。在協同過濾模型中,我們尋找基於 user-item 交互的每個商品(圖書)的潛在特徵,並尋找每個用戶對每個潛在特徵發現的相關性。這一過程是通過矩陣分解來完成的。首先我們需要將數據 (ratings_explict) 分成訓練集和測試集。這正是使事情變得棘手的地方。 很明顯,純協同過濾方法並不能解決冷啓動問題。因此,必須完成拆分訓練集和測試集,這樣,測試集中的用戶或圖書的實例就能在訓練集中有剩餘的實例:

image

函數 informed_train_test() 返回訓練集和測試集的 coo 矩陣,以及原始訓練數據幀,以便稍後評估模型。讓我們看看如何如何配合模型來評估其性能:

image

— Run time: 4.7663776795069377 mins —Train AUC Score: 0.9801499843597412Test AUC Score: 0.853681743144989

正如預期那樣,訓練集的 AUC 分數接近 1,我們的測試集中 AUC 得分爲 0.853,情況不算太差。使用隨機搜索來調整用於訓練 LightFM 模型的參數。由於 GridSearch 的運行成本太高,因此我決定在 scikit-optimize 包中使用函數 forest_minimize() 來調整參數。有關調整參數的函數更多詳情,請參閱本文的 GitHub 頁面。

我清楚,我之前提到的純協同過濾,對向沒有與網店進行任何交互的新用戶推薦商品(冷啓動問題)的預期效果不佳。在 LightFM 文檔中提供的示例中,他們還表明,使用電影數據集向新客戶推薦影片的純協同方法並不能得到令人滿意的結果。但是,出於好奇,我還是自己想測試一下 book-crossing 數據集。令人驚訝的是,測試結果顯示數據集對冷啓動問題反應良好,AUC 分數相對較高!在這種情況下訓練模型,唯一的區別是,我們隨機將數據集分成訓練集和測試集。這意味着在訓練集和測試集中具有共同的 user-item 交互的概率完全是隨機的:

image

現在,我們來看一看隨機訓練 - 測試分組中 AUC 分數的差異:

image

— Run time: 8.281255984306336 mins —Train AUC Score: 0.9871253967285156Test AUC Score: 0.6499683856964111

對於隨機拆分數據,預計可以得到 0.5 左右的 AUC 分數,但我們可以看到,因爲我們的 AUC 分數爲 0.649,相比通過擲硬幣來向新用戶推薦商品或想當前用戶推薦新商品,我們的表現則要好得多。我將此行爲的進一步分析留給本文讀者來做。

應用

讓我們假設,售出數據集中的圖書是我們正銷售的商品,數據集中的用戶實際上是預期的客戶。爲了更接近電子商務網店的實際情況,我們可以做的一件事是改變評級值,將其值的範圍從(1-10)縮小到(7-10)。客戶的互動行爲可歸納爲:

A - 瀏覽商品;B - 點擊商品;C - 將商品加到購物車中;D - 下單購買商品。

因此,在這種情況下,通過將評級值降低到前 4 個評級(7,8,9,10),我們就可以對上述 item-customer 互動進行更爲逼真的模擬。

推薦系統有三種主要方案可用於電子商務應用。 限於篇幅,在本文中,我不提供爲下一節中提供結果的函數的實際代碼,你可以在 GitHub repo 中的 Jupyter notebook 中看到:https://github.com/nxs5899/Recommender-System-LightFM

  • 最常見的情景是根據客戶的交易(如瀏覽和點擊商品)向特定客戶提供的典型建議:

image

User-Item 交互矩陣
user_dikt, item_dikt = user_item_dikts(user_item_matrix, books)

similar_recommendation(model, user_item_matrix, 254, user_dikt, item_dikt,threshold = 7)

Items that were liked (selected) by the User: 
1- The Devil You Know 
2- Harlequin Valentine 
3- Shout!: The Beatles in Their Generation 
4- Sandman: The Dream Hunters 
5- Dream Country (Sandman, Book 3) 
6- Assata: An Autobiography (Lawrence Hill & amp; Co.) 
7- The Golden Compass (His Dark Materials, Book 1) 
8- The Fellowship of the Ring (The Lord of the Rings, Part 1) 
9- The Hobbit: or There and Back Again 
10- Harry Potter and the Sorcerer's Stone (Book 1) 
11- Something Wicked This Way Comes 
12- Martian Chronicles 
13- Animal Farm 
14- 1984 
15- The Dark Half 
16- Harry Potter and the Goblet of Fire (Book 4) 
17- Harry Potter and the Prisoner of Azkaban (Book 3) 
18- Harry Potter and the Prisoner of Azkaban (Book 3) 
19- Harry Potter and the Chamber of Secrets (Book 2) 
20- Harry Potter and the Chamber of Secrets (Book 2) 
21- The Bonesetter's Daughter 
22- The Wolves in the Walls 
23- Stardust 
24- Martian Chronicles 
25- American Gods: A Novel

Recommended Items: 
1- The Lovely Bones: A Novel 
2- Harry Potter and the Order of the Phoenix (Book 5) 
3- The Catcher in the Rye 
4- The Da Vinci Code 
5- Harry Potter and the Sorcerer's Stone (Harry Potter (Paperback)) 
6- Red Dragon 
7- Interview with the Vampire 
8- Divine Secrets of the Ya-Ya Sisterhood: A Novel 
9- Sphere 
10- The Pelican Brief 
11- Little Altars Everywhere: A Novel 
12- To Kill a Mockingbird 
13- Coraline 
14- The Queen of the Damned (Vampire Chronicles (Paperback)) 
15- The Hours: A Novel

我們根據類似的 user-item 交互,向 ID 號爲 254 的用戶推薦了 15 個商品(圖書)。

  • 第二種最常見的情景是,當你計劃告知客戶有關向上銷售和交叉銷售的選項時。具體的例子是:“購買此商品的顧客也同時購買……”、“瀏覽過此商品的顧客也瀏覽過……” 爲完成這一任務,我不得不將用戶和圖書評級的閾值從 20 提高到 200,這樣我就可以獲得更小的評級數據幀。查找相似商品需要爲數據集中的所有商品創建 item embedding,它可能會佔用很多內存。我嘗試過運行幾次,但都遇到了 LowMemory 錯誤。因此如果你電腦有足夠的內存,那麼你可以試試它較低的閾值:
item_embedings = item_emdedding_distance_matrix(model,user_item_matrix) 
also_bought_recommendation(item_embedings,'B0000T6KHI' ,item_dikt)

Item of interest :Three Fates (ISBN: B0000T6KHI) 
Items that are frequently bought together: 
1- Surrender to Love (Avon Historical Romance) 
2- Landower Legacy 
3- Ranch Wife 
4- Sara's Song

AI 前線注:向上銷售 是指根據既有客戶過去的消費喜好,提供更高價值的產品或服務,刺激客戶做更多的消費。如向客戶銷售某一特定產品或服務的升級品、附加品、或者其他用以加強其原有功能或者用途的產品或服務,向上銷售也稱爲增量銷售。這裏的特定產品或者服務必須具有可延展性,追加的銷售標的與原產品或者服務相關甚至相同,有補充、加強或者升級的作用。所謂 交叉銷售,就是發現現有客戶的多種需求,並通過滿足其需求而實現銷售多種相關的服務或產品的營銷方式。促成交叉銷售的各種策略和方法即 “交叉營銷”。簡單地理解是,說服現有的顧客去購買另一種產品,也是根據客人的多種需求,在滿足其需求的基礎上實現銷售多種相關的服務或產品的營銷方式。

  • 推薦系統的第三個情景是,當你有一家網店,並決定通過向更有可能購買該商品的特定用戶推薦來投放促銷廣告時,它可以幫助改善客戶的體驗,並增加銷售量:
users_for_item(model, user_item_matrix, '0195153448', 10)
[98391, 5499, 136735, 156214, 96473, 83443, 67775, 28666, 115929, 42323]

我們推薦的 10 個用戶(ID),他們更有可能對 ISBN 編號爲 0195153448 的圖書感興趣。下一步可能就是向這些用戶發送促銷電郵,看看他們是否對提到的商品感興趣。

結語

值得注意的是,一般來說,協同過濾方法需要足夠的數據(user-item 交互)才能獲得良好的結果。

本文提到的該項目的 GitHub repo 的鏈接如下:

https://github.com/nxs5899/Recommender-System-LightFM

參考資料:

https://github.com/aayushmnit/cookbook/blob/master/recsys.py

https://towardsdatascience.com/my-journey-to-building-book-recommendation-system-5ec959c41847

https://towardsdatascience.com/challenges-solutions-for-production-recommendation-systems-d656024bbdca

原文鏈接:

https://towardsdatascience.com/if-you-cant-measure-it-you-can-t-improve-it-5c059014faad

會議推薦:


12月20-21,AICon將於北京開幕,在這裏可以學習來自Google、微軟、BAT、360、京東、美團等40+AI落地案例,與國內外一線技術大咖面對面交流。

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