1. 程式人生 > >前輩被阿里巴巴挖走了,問前輩原來是做了Python電子商務推薦系

前輩被阿里巴巴挖走了,問前輩原來是做了Python電子商務推薦系

我國現如今是電商大國,電商非常發達。今年雙 11 的成交額僅僅過了 12 小時就達到了驚人的 1491.6 億元!電商在我國的火爆程度由此可見一斑。小到6~7歲的小孩子,大到50多歲的老人,的會網上購物了。
在這裡插入圖片描述
不知你們有沒有發現,在網店瀏覽商品時,它們好像能讀懂你的內心,推薦的幾乎都是你想找的寶貝?其實,這背後的功臣就是人工智慧的應用之一——推薦系統。今天,我們分享了一篇在 Python 中使用 LightFM 構建可擴充套件的電子商務推薦系統的文章,以饗讀者。

當然在學習Python的道路上肯定會困難,沒有好的學習資料,怎麼去學習呢?
學習Python中有不明白推薦加入交流群
號:883444106~~
群裡有志同道合的小夥伴,互幫互助,
群裡有不錯的視訊學習教程和PDF!
-


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

Content-Based(基於內容的推薦);
Collaborative Filtering(協同過濾,CF)(Item-Based、User-Based、Model-Based)
混合方法(整合基於內容的推薦和協同過濾)
前輩:我最初的目標是構建一個混合模型,因為它可以將基於內容的推薦整合到協同過濾中,並能夠通過純協同過濾推薦系統來解決冷啟動問題。然而,有著公開可用的良好資料集,且同時具有商品或使用者的元資料和評級互動,並不是很多。因此,我決定先研究協作過濾模型並理解推薦系統的不同方面,在下一篇文章中,我將會構建一個混合模型。
所謂冷啟動問題,就是在對使用者一無所知的情況下,如何進行最有效的推薦。
實現方法
為什麼選擇 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…》 中提到的方法,進行資料清洗,併為資料集進行預處理。讓我們來看一下資料:
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
以上程式碼塊的用途是常規資料清洗,以確保在將資料用於模型中的輸入之前,資料格式是正確的。此外,我們還需要確保評級資料幀中的所有行都代表了來自使用者和圖書資料幀的資料。接下來,評級必須只包括有效的評級分數(1-10),因此我們應該去掉所有評級值為零的所有行。
在這裡插入圖片描述
這是評級值的分佈:
在這裡插入圖片描述
要完成資料預處理的最後一件事就是,為已評級圖書的使用者數量和使用者評分的圖書數量指定一個閾值。換言之,我們必須有使用者和圖書的最低評級計算數量。我認為,只有至少為 20 本圖書評級的使用者和至少被 20 位使用者評級的圖書,這樣感覺就會很好。
在這裡插入圖片描述
ratings_explicit.shape (217729, 3)
訓練模型

在此步驟中,我們將訓練模型,但問題有所不同。在協同過濾模型中,我們尋找基於 user-item 互動的每個商品(圖書)的潛在特徵,並尋找每個使用者對每個潛在特徵發現的相關性。這一過程是通過矩陣分解來完成的。首先我們需要將資料 (ratings_explict) 分成訓練集和測試集。這正是使事情變得棘手的地方。 很明顯,純協同過濾方法並不能解決冷啟動問題。因此,必須完成拆分訓練集和測試集,這樣,測試集中的使用者或圖書的例項就能在訓練集中有剩餘的例項:
在這裡插入圖片描述
函式 informed_train_test() 返回訓練集和測試集的 coo 矩陣,以及原始訓練資料幀,以便稍後評估模型。讓我們看看如何如何配合模型來評估其效能:
在這裡插入圖片描述
— 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 互動的概率完全是隨機的:
在這裡插入圖片描述
現在,我們來看一看隨機訓練 - 測試分組中 AUC 分數的差異:
在這裡插入圖片描述
當然在學習Python的道路上肯定會困難,沒有好的學習資料,怎麼去學習呢?
學習Python中有不明白推薦加入交流群
號:883444106~~
群裡有志同道合的小夥伴,互幫互助,
群裡有不錯的視訊學習教程和PDF!
-