1. 程式人生 > >小夥用Python實現可擴充套件的電子商務推薦系統,成功被阿里巴巴錄取

小夥用Python實現可擴充套件的電子商務推薦系統,成功被阿里巴巴錄取

 

AI 前線導讀:在我國,電商非常發達。今年雙 11 的成交額僅僅過了 12 小時就達到了驚人的 1491.6 億元!電商在我國的火爆程度由此可見一斑。

當然在學習Python的道路上肯定會困難,沒有好的學習資料,怎麼去學習呢?

學習Python中有不明白推薦加入交流群
                號:960410445
                群裡有志同道合的小夥伴,互幫互助,
                群裡有不錯的視訊學習教程和PDF!

不知你們有沒有發現,在網店瀏覽商品時,它們好像能讀懂你的內心,推薦的幾乎都是你想找的寶貝?其實,這背後的功臣就是人工智慧的應用之一——推薦系統。今天,我們分享了一篇在 Python 中使用 LightFM 構建可擴充套件的電子商務推薦系統的文章,以饗讀者。

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

推薦系統是機器學習最常用的應用之一。由於本文的目標是專注於如何使用 LightFM 包來構建推薦系統,並提供明確的指標來衡量模型效能,因此,我將只會簡單提一下不同型別的推薦系統。

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

  • Content-Based(基於內容的推薦);
  • Collaborative Filtering(協同過濾,CF)(Item-Based、User-Based、Model-Based)
  • 混合方法(整合基於內容的推薦和協同過濾)

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

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

實現方法

為什麼選擇 LightFM?

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

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

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

資料

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

小夥用Python實現可擴充套件的電子商務推薦系統,成功被阿里巴巴錄取

 

小夥用Python實現可擴充套件的電子商務推薦系統,成功被阿里巴巴錄取

 

小夥用Python實現可擴充套件的電子商務推薦系統,成功被阿里巴巴錄取

 

小夥用Python實現可擴充套件的電子商務推薦系統,成功被阿里巴巴錄取

 

小夥用Python實現可擴充套件的電子商務推薦系統,成功被阿里巴巴錄取

 

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

小夥用Python實現可擴充套件的電子商務推薦系統,成功被阿里巴巴錄取

 

這是評級值的分佈:

小夥用Python實現可擴充套件的電子商務推薦系統,成功被阿里巴巴錄取

 

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

小夥用Python實現可擴充套件的電子商務推薦系統,成功被阿里巴巴錄取

 

ratings_explicit.shape (217729, 3)

訓練模型

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

小夥用Python實現可擴充套件的電子商務推薦系統,成功被阿里巴巴錄取

 

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

小夥用Python實現可擴充套件的電子商務推薦系統,成功被阿里巴巴錄取

 

— 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 互動的概率完全是隨機的:

小夥用Python實現可擴充套件的電子商務推薦系統,成功被阿里巴巴錄取

 

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

小夥用Python實現可擴充套件的電子商務推薦系統,成功被阿里巴巴錄取

 

— 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

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

小夥用Python實現可擴充套件的電子商務推薦系統,成功被阿里巴巴錄取

 

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 BeatlesinTheir Generation

4- Sandman: The Dream Hunters

5- Dream Country (Sandman, Book3)

6- Assata: An Autobiography (Lawrence Hill & amp; Co.)

7- The Golden Compass (His Dark Materials, Book1)

8- The Fellowshipofthe Ring (The Lordofthe Rings, Part1)

9- The Hobbit:orThereandBack Again

10- Harry Potterandthe Sorcerer's Stone (Book1)

11- Something Wicked This Way Comes

12- Martian Chronicles

13- Animal Farm

14-1984

15- The Dark Half

16- Harry Potterandthe GobletofFire (Book4)

17- Harry Potterandthe PrisonerofAzkaban (Book3)

18- Harry Potterandthe PrisonerofAzkaban (Book3)

19- Harry Potterandthe ChamberofSecrets (Book2)

20- Harry Potterandthe ChamberofSecrets (Book2)

21- The Bonesetter's Daughter

22- The Wolvesinthe Walls

23- Stardust

24- Martian Chronicles

25- American Gods: A Novel

Recommended Items:

1- The Lovely Bones: A Novel

2- Harry Potterandthe Orderofthe Phoenix (Book5)

3- The Catcherinthe Rye

4- The Da Vinci Code

5- Harry Potterandthe Sorcerer's Stone (Harry Potter (Paperback))

6- Red Dragon

7- Interviewwiththe Vampire

8- Divine Secretsofthe 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 Queenofthe 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)
Itemof interest :Three Fates (ISBN:B0000T6KHI)
Itemsthat are frequentlyboughttogether:
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 的圖書感興趣。下一步可能就是向這些使用者傳送促銷電郵,看看他們是否對提到的商品感興趣。

結語

值得注意的是