用 Keras 實現圖書推薦系統
本文為 AI 研習社編譯的技術博客,原標題 :
Building a book Recommendation System using Keras
作者 |Gilbert Tanner
翻譯 |王逍遙、孫稚昊2、UPDATA
校對 | 就2 整理 | 菠蘿妹
https://towardsdatascience.com/building-a-book-recommendation-system-using-keras-1fba34180699
用 Keras 實現圖書推薦系統
圖 1: Photo by
Brandi ReddonUnsplash
推薦系統試圖依據用戶舊物品評級或偏好來預測對某一物品的評級或偏好。為了提高服務質量,幾乎每個大公司都使用推薦系統。
在本文中,我們將研究如何使用Embedding來創建圖書推薦系統。
對於我們的數據,我們將使用goodbooks-10k數據集,它包含1萬種不同的圖書和大約100萬個評級。它有三個特性:book_id、user_id和評級(rating)。
如果您不想自己從Kaggle下載數據集,可以從我的my Github repository中獲得本文所涉及的文件和完整代碼。
Embedding
嵌入是一種映射,從離散的對象(如單詞或在我們的例子里是圖書id)到連續值向量的映射。這可以用來發現離散對象之間的相似性,如果不使用嵌入層,模型就不會發現這些相似性。
嵌入向量是低維的並且在訓練網路時得到更新。下圖顯示了使用谷歌開源的高緯數據可視化 Tensorflows Embedding Projector 創建的嵌入示例。
圖 2:Projector Embeddings
獲取數據
首先使用Pandas載入數據集。之後將數據集拆分為訓練集和測試集,我們將創建兩個變數,分別用來存儲去重後的用戶id和書籍id(並不是用戶數量)。
圖3:Rating-Dataset Head
數據集已經被清洗過,所以我們無需做更多的數據清洗或者數據預處理的步驟。
建立嵌入模型
使用Keras 的深度學習框架可以很容易地創建神經網路嵌入模型,以及處理多個輸入和輸出層。
我們的模型有以下的結構:
1. 輸入:包括書和用戶
2. 嵌入層:書和用戶的嵌入
3.點乘:使用點乘來合併各個嵌入向量
在一個嵌入模型中,嵌入的權重要在訓練中學習得到。這些嵌入不僅能用來從數據中提取信息,他們本身也可以被提取或者可視化。
為了簡單起見,我不在模型最後加上全連接層,雖然加上可以提高不少準確率。如果你想要更精確的模型,你可以加上試試。
下面是創建模型的代碼:
訓練模型
現在我們已經建好了模型,準備訓練模型。由於模型包含兩個輸入層(一個是書籍輸入,一個是用戶輸入),我們需要將訓練集組合成一個數組作為 x 輸入。在本文中, 我對模型訓練了 10 epochs,如果想得到更好的結果,你可以訓練更長的時間。
下面是訓練代碼:
將嵌入可視化
嵌入可以被用來可視化一些概念,比如不同書之間的關係。為了可視化這些概念,我們需要減少向量維讀,通過一些降維的技術,比如 主成分分析 (PCA),或者t-分布領域嵌入演算法(t-SNE)。
從10000維開始 (每一維是一本書),我們通過嵌入模型把它減少到5維,再通過PCA 或t-SNE 把它減少到2維。
首先,我們用 get_layer 函數來提取嵌入:
現在我們用PCA來把嵌入轉化為2維向量,並且用Seaborn把結果畫成散點圖:
圖4:Visualizing embeddings with PCA
同樣的事也可以用t-SNE:
圖5:Visualizing embeddings with TSNE
進行推薦
使用我們訓練的模型進行推薦很簡單。我們只需要輸入一個用戶和所有圖書,然後選擇對該特定用戶具有最高預測評級的圖書。
下面的代碼顯示了對特定用戶進行預測的過程:
這段代碼輸出:
導入圖書 csv ,得到更多的信息:
結論
嵌入是一種把離散的物體,比如單詞,轉化為連續值向量的方法。嵌入對尋找物體相似度,可視化等目標很有幫助,並且可以用來做另一個機器學習模型的輸入。
這個例子肯定不是完美的,有很多方法可以被嘗試來提高準確率。但對於高級的問題,用嵌入來學習輸入是一個好的出髮帶你。
下面的方法可以得到更好的結果:
在點乘後加入全連接層
訓練更多輪
對評分列做歸一化
等等
如果你喜歡這篇文章,可以訂閱我的youtube頻道,並且在社交網路上關注我。
如果有任何問題,可以到我的twitter 上評論。
感謝Dipanjan (DJ) Sarkar.


※一文讀懂橫掃Kaggle的XGBoost原理與實戰(一)
※對話系統中的口語理解(一)
TAG:AI研習社 |