Using the Recommendation System in a Real World Program
目錄
1.對存在的用戶推薦
2.新用戶怎么處理
3.尋找相似的產品
1.對存在的用戶推薦
這章讓我們來談談把我們的推薦系統應用于現實世界中的最佳實踐。讓我們打開Chapter 7/train_recommender.py。
這個文件包含代回顧數據集的代碼。我們使用read csv函數讀取數據集,然后使用數據透視表函數創建評分矩陣,將矩陣的因子分解為U和M,然后乘以U和M得到預測的評分。由于我們的電影評論數據集較少,這個過程運行得非常快。但是對于更大的數據集,分解過程可能需要幾分鐘甚至幾小時才能運行。
每當我們想要建立一個用戶推薦時,我們并不需要每次都分解這個矩陣。相反,將矩陣只分解一次更為實用,并將生成的模型保存到文件中。然后,我們可以稍后使用這些文件來給出推薦,而不需要執行任何計算。 Python提供了一個功能,可以輕松保存和加載來自Pickle(.pkl)文件的數據。所以在代碼的最后幾行,我們將使用Python的pickle.dump來生成U矩陣,將其命名為user_features.dat。然后,我們將M矩陣生成為product_features.dat。
如果我們要計算產品相似度,這個數據對于保存是有用的。我們還會將預測評級寫入一個名為“predicted_ratings.dat”的文件。這是我們需要提供推薦的數據文件。讓我們運行腳本來生成這些文件。
該文件的邏輯就是將我們上面生成的數據來推薦電影。首先,我們將使用Pickle重新加載U,M和predicted_ratings文件。我們還會將movie.csv中的電影標題列表加載到df dataframe中,因為我們希望能夠訪問電影標題。然后,我們要求輸入用戶ID,然后打印出用戶預測評級最高的電影。讓我們運行該程序,請注意,當我輸入用戶ID并按回車時,建議幾乎是瞬間的。
那是因為所有的辛苦工作已經提前完成,并保存在數據文件中。將模型生成的緩慢步驟與給出推薦的步驟分開很重要,以減少不必要的等待。
2. 新用戶怎么處理
推薦系統在用戶已經輸入了大量評論的情況下效果很好,但是對于第一次使用者而言,我們對用戶還不夠了解,而沒有提供個性化的建議。有三種方法可以解決這個問題。
第一種,我們可能不會對新用戶提出任何推薦。對于某些應用程序,在提出建議之前可能需要等待用戶的評價。
第二種方法是使用產品相似性來向沒有評價任何內容的用戶建議類似的產品,而不是直接給出個性化的推薦。
第三種選擇是使用產品的平均評級來提出建議。換句話說,就是向新用戶推薦具有最佳綜合評級的產品。這可能是有幫助的,因為一些電影通常被多數人認可。如果一部電影對所有用戶的平均評分為5星,那么對于推薦給全新用戶的電影來說,這可能是比所有用戶都有一星評級的電影更好的電影。
首先,我們將計算所有用戶對電影的平均評分。在這種情況下,電影的平均評分是4.2分。接下來我們將從每個用戶的評分中減去平均評分。對于用戶編號1,而不是將等級記錄為4,我們將減去4.2并記錄為-0.2。這個想法是,這個用戶在平均評分下評為0.2星。這些調整的評級是我們將用來做矩陣分解和推薦的。讓我們看看這是如何改變的。
假設我們的系統預測特定用戶的評分為0.8。我們知道這部電影的平均評分是4.2,所以我們只需要重新加入平均得到用戶的最終評分。所以這個用戶的預測評級是5星。但最酷的部分是這是如何為全新用戶制定出來的。我們可以假設,尚未查看任何內容的全新用戶將獲得每部電影的預測評分為零。但是現在我們將重新加入平均評分,而電影的預測評分最終為4.2星。所以,即使這個用戶還沒有看過任何東西,我們可以基于其與其他用戶的普及程度來推薦這部電影。
看看如何在代碼中做到這一點。這個文件包含了分解評論數據的代碼。我們使用read_csv函數讀取數據集,然后使用pivot_table函數創建評分矩陣。現在我們有一個覆蓋每部電影的評論矩陣,我們要計算每部電影的平均評分。我們可以使用matrix_factorization_utilities.normalized_ratings函數來做到這一點。這個函數需要一個評級數組來進行平均。所以我們將通過ratings_df數據集。我們調用as_matrix函數來確保評分數據以NumPy數組數據類型的形式傳入。
這個函數也返回兩個結果。首先它返回每個電影的平均評分。其次它返回一個名為normalized_ratings的評分矩陣的新副本。該副本的平均評分是從每個用戶評論中減去的。接下來,我們將矩陣分解為U和M,然后乘以U和M得到預測評分。然后在這里,在我們預測所有用戶的評分后,我們需要重新添加每部電影的平均評分。
最后,在底部,我們使用pickle.dump函數將一個方法的副本保存到一個名為means.dat的文件中。讓我們來運行程序。我們可以看到文件如期生成。
我們在這個文件中的目標是推薦電影給一個全新的用戶。首先我們使用pickle.load來加載means.dat文件。然后我們加載電影列表CSV文件,所以我們可以打印出電影標題。
接下來我們使用平均評分作為用戶的預測評分。最后,我們會按照平均評分的順序將影片推薦給用戶。讓我們運行它,看看結果。右鍵單擊,選擇運行。程序推薦了我們擁有的前五名最高平均評分電影。
然鵝,總是向新用戶推薦評價最高的電影可能并不完美,但在用戶點評某些產品之前,這是一個很好的開始。
3. 尋找相似的產品
在之前的小節中,我們創建了這四個數據文件。如果您現在想創建它們,請在繼續之前運行train_recommender_cold_start final.py。現在我們來打開product_similarity_from_data_files.py。當您在真實應用程序中顯示相關產品時,您不希望每次重構矩陣,因為它太慢了。相反,您可以使用product_features.dat文件快速計算產品相似度。
首先,我們將使用Python的pickle.load函數加載product_features.dat文件。我們剛剛加載的M矩陣每個電影都有一列。
讓我們轉置矩陣,使每一列成為一個行。這只是使數據更容易處理,但它不會改變數據。接下來,我們將使用read_csv加載電影列表,以便我們可以訪問電影標題。我們將選擇一個電影找到類似的電影。我已經選擇了movie_id = 5.接下來,我們將在movies_df數據框中查找這部電影,然后打印出電影的標題和流派。現在我們準備好計算電影相似度了。
第一步是從其他電影的特征中減去這部電影的特征。
接下來,我們取這個差值的絕對值,以確保所有的數字是正的。然后,我們將每個電影的不同特征差異總和看作該電影的一個特別的總分。然后,我們將這些特別的分數保存到movies_df數據框中。然后對電影列表進行排序,以便最少的不同電影在列表中排在第一位。最后,我們可以列出列表中的前五部電影。讓我們來運行這個。右鍵單擊,選擇運行。
好,我們的電影被稱為大城市法官2.這個列表中的第一部電影是電影本身。那是因為一部電影與它本身最相似。
讓我們忽略那一個。其他四部電影看起來與我們的電影非常相似。他們都像犯罪或法律劇情。在列表中我們甚至可以看到續集-大城市法官3。但請注意,這幾乎是瞬間運行的,因為所有計算電影功能的辛苦工作都是提前完成的。現在,我們可以在數據文件中使用這些功能,我們可以使用這些功能來即時查找類似的產品,而不會對用戶造成任何延遲。
結尾
在本課程中,我們介紹了您需要知道如何構建推薦系統的基本技能。 我鼓勵你用自己的數據嘗試你get到的新技能。 去折騰一些東西。 如果您沒有任何自己的產品數據可供使用,則可以在網上下載真實數據集。 您可以嘗試的一個數據集是免費的MovieLens數據集。 MovieLens數據集包含數以千萬計的電影評論,這將讓你有機會嘗試用你所學到的知識處理大規模數據。 如果您更擅長Java編碼,那么您也可以嘗試使用Apache Mahout。 Apache Mahout是一個開源應用程序,它實現了我們在本課程中學到的同類協作過濾算法。
Apache Mahout旨在跨多臺計算機運行,這對于大型數據集非常有用,而這些數據集太慢而無法在單臺計算機上運行。
哦了, 推薦系統入門課程到此結束。
你的 關注-收藏-轉發 是我繼續分享的動力!