當前位置:
首頁 > 知識 > 一文教你構建圖書推薦系統【附代碼】

一文教你構建圖書推薦系統【附代碼】

推薦系統在電子商務網站中廣泛被使用,如何向用戶推薦最適合其品味的產品是研究的重點。本文在Book Crossing數據集的基礎上進行圖書推薦系統的研究,詳細講解了構建推薦系統的步驟:載入數據集(圖書、用戶、評分表)、檢查各個數據集等,並實現了基於流行度的簡單推薦系統和基於協同過濾的推薦系統(基於用戶和基於item)。通讀本文,相信你一定能理解簡單推薦系統的構建過程。




作者 | Chhavi Saluja

編譯 | 專知


參與 | Yingying, Xiaowen




代碼下載方式


關注公眾號,後台回復


20180916



>傳送門<




構建圖書推薦系統之路


 


在線推薦系統是許多電子商務網站的技術核心。推薦系統向客戶推薦最適合他們品味和特點的產品。




Book Crossing數據集由Cai-Nicolas Ziegler於2004年推出,內含三張表,即用戶,書籍和評分表。顯式評分以1到10的等級表示(較高的值表示較高的分值)並且隱含的分值由0表示。




在構建任何機器學習模型之前,理解數據是什麼以及我們想要實現什麼是至關重要的。數據探索揭示了隱藏的趨勢和見解,並且數據預處理使數據可供機器學習演算法使用。




首先,我們載入數據集並檢查書籍、用戶和評分數據集的格式如下:




書籍




從書籍數據集開始,我們可以看到圖像URL欄目似乎不是分析所必需的,因此可以將它們刪除。





我們現在檢查每個列的數據類型,並更正缺失和不一致的條目。







  • 出版時間


現在我們檢查這個屬性的值。



出版時間中有一些不正確的條目。由於csv文件中存在一些錯誤,看起來像出版商名稱的"DK Publishing Inc"和"Gallimard"在數據集中被錯誤地載入為出版日期。此外,其中一些值是字元串,並且在某些地方輸入的年份與數字相同。 我們將對這些行進行必要的更正,並將出版日期的數據類型設置為int。





現在可以看到出版時間是int類型的,它的值在0-2050之間。由於這個數據集是在2004年建立的,我假設2006年以後的所有年份都是無效的,保持兩年的差值,以防數據集可能已被更新。對於所有無效條目(包括0),我將它們轉換為NaN,然後用剩餘年份的平均值替換它們。







  • 出版商


在「發布者」專欄中,我已經處理了兩個NaN值,將其替換為"other",因為在某些檢查後無法推斷出版商的名稱。






用戶數據集




現在我們探索用戶數據集,首先檢查它的大小,前幾列和數據類型。







  • 年齡


在檢查值時,userID看起來是正確的。然而,年齡欄有一個NaN和一些非常高的值。在我看來,5歲以下和90歲以上的年齡沒有太大意義,因此,這些會被NaN取代。然後所有的NaN都被平均年齡取代,其數據類型被設置為int。



我在這裡沒有對位置列進行任何處理。但是,如果你你希望處理位置數據,可以進一步將其拆分為城市,州和國家,並使用文本處理模型進行一些處理。





評分數據集


 


我們檢查評分數據集的大小和前幾行。它顯示我們的用戶-書籍評分矩陣將非常稀疏,因為與評分矩陣的大小(用戶數量×書籍數量)相比,實際評分相當低。



現在評分數據集應該具有各自表格中存在的用戶ID和ISBN,即,用戶和書籍。



很明顯,用戶對一些書籍進行了評分,這些書籍並不是原始書籍數據集的一部分。數據集的稀疏度可按如下方式計算:



1-10表示的顯式評分和0表示的隱性評分現在必須分開。我們將僅使用明確的評分來建立我們的圖書推薦系統。同樣,用戶也被分為明確評分和記錄隱性行為的人。



一份書評圖顯示,較高的打分率在用戶中更常見,評分為8的次數最多。






基於流行度的簡單推薦系統




此時,可以基於不同書籍的用戶評分計數來構建基於流行度的簡單推薦系統。 很明顯,j.k.羅琳寫的書很受歡迎。







基於協同過濾的推薦系統




為了配合機器的計算能力並減少數據集大小, 我們選擇至少對100本書籍進行打分的用戶,以及至少有100個評分的書籍。




構建基於CF的推薦系統的下一個關鍵步驟是從評分表中生成用戶-項目評分矩陣。



請注意,評分矩陣中的大部分值都是NaN,表示評分不存在,因此數據稀疏。另外請注意,這裡只考慮顯式評分。由於大多數機器學習演算法不能處理NaN,我們用0代替它們,表明沒有評分。





基於用戶的CF


 


我將會用到一個之前的分享(https://towardsdatascience.com/collaborative-filtering-based-recommendation-systems-exemplified-ecbffe1c20b1)中提過的函數。函數findksimilarusers輸入用戶ID和評分矩陣,並返回k個相似用戶的相似度和指數。



函數predict_userbased基於用戶的方法對特定的user-item組合進行評分。




函數recommendItem使用上述函數為基於用戶或基於項目的方法(基於選定的方法和度量標準組合)推薦書籍。如果圖書的預測評分大於或等於6,並且圖書尚未被打分,則給出推薦。你可以在調用此函數時選擇相似性度量(餘弦/相關)。



根據基於用戶的CF方法檢查用戶4385的top-10的書籍推薦。







基於item的CF


 


為基於item的CF編寫了類似的函數,可以找到k本類似的書籍,並預測每本書的用戶評分。相同的函數recommendItem可用於基於item的方法和選定的度量標準推薦圖書。如果圖書的預測評分大於或等於6,並且圖書尚未被評分,則進行推薦。




根據基於item的CF方法檢查用戶4385的top-10書籍推薦如下所示。這與基於用戶的方法有很大的不同。



在這篇文章中,交叉驗證、測試訓練拆分和推薦系統評估等領域還沒有涉及到,這些領域值得探索。




參考文獻:


https://towardsdatascience.com/how-did-we-build-book-recommender-systems-in-an-hour-the-fundamentals-dfee054f978e




https://cambridgespark.com/content/tutorials/implementing-your-own-recommender-systems-in-Python/index.html




參考鏈接:


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




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

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

TAG: |