movielens推荐系统_基于内容推荐(二)
A content-based movie recommender system using MovieLens tags (用標簽構建一個簡單的電影推薦系統)
現在有很多電影。如果沒有某種推薦系統,您會擔心,隨著時間的流逝,用戶可能會被他們不關心的電影所淹沒。因此,您決定構建電影推薦系統。由于您的服務是新服務,因此您沒有足夠的數據來了解哪些用戶正在觀看哪些電影。這被稱為冷啟動問題,它使您無法僅根據用戶的歷史收視率來推薦電影。幸運的是,即使沒有足夠的收視數據,我們仍然可以使用電影元數據構建一個不錯的推薦系統。這就是MovieLens的用處。MovieLens為每個電影提供帶有關鍵字標簽的公共數據集。這些標簽非常有用。
這個轉化單功能多個分類值的辦法十分有用,整個數據集整理完之后為:
Source: https://datascience.stackexchange.com/questions/14847/multiple-categorical-values-for-a-single-feature-how-to-convert-them-to-binary-u
在本文的其余部分中,我將回答三個業務問題,這些問題對于使用MovieLens的標簽構建基于內容的簡單推薦系統至關重要:
第一個問題:每部電影需要幾個標簽?
MovieLens標簽基因組數據集中大約有10萬部唯一電影和一千個唯一標簽。每部電影對每個標簽都有一個相關性得分,因此大約有1000萬個電影標簽對,取值區間從0到1。但是并非每個標簽都與電影相關,因此我們只需要保留最相關的標簽。首先,我們可以根據相關性得分對每部電影的標簽進行排序。以玩具總動員為例:
接下來,我們在下面的圖表中確認,電影排名較高的標簽通常具有較高的中位數相關性突出。電影的第1級標簽的中位相關性幾乎幾乎為1。我們可以看到, 隨著大約第50級,中位相關性逐漸降低。
要查找電影的最相關標簽,我們可以根據相關性得分保留電影的前N個標簽。在這里,我們需要仔細選擇N。如果N很小,則我們具有非常相關的標簽。如果N大,則我們有很多標簽,但其中許多標簽可能無關緊要。下圖顯示了當我們從排名第1升至第100時,中位數相關性得分的變化百分比。當相關性得分開始變得更加穩定時,我們會在第50個等級附近看到一個拐點。因此,我們可以選擇N = 50作為每個電影要保留的合理數量的標簽。請注意,這是一種非常簡單的“彎頭方法”樣式的方法,以后可以對其進行優化。
現在,我們可以獲得每部電影的前50個標簽的列表,這些標簽將在下一部分中使用。例如,玩具總動員的50個標簽。
另外可以根據電影的名稱來查詢標簽
第二個問題:我們如何使用標簽來衡量電影之間的相似性?
在為用戶生成電影推薦之前,我們需要一種基于電影的前50個標簽來衡量電影之間相似度的方法。在基于內容的推薦器系統中,將向用戶推薦與他們已經看過的電影相似的電影。
在這里,我將演示兩種測量相似度的方法:
Jaccard 系數:
使用Jaccard Index的第一種方法是將兩個集合A和B之間的相似度作為交集的大小除以并集的大小。在衡量電影之間的相似性時,我們可以為兩組電影標簽計算此索引。
例如,假設我們下面有三部電影,以及前三部標簽:
- 電影A標簽=(動作,空間,友誼)
- 電影B標簽=(冒險,太空,友誼)
- 電影C標簽=(浪漫,喜劇,成年)
直觀地看,電影A與電影B相似,這是因為電影A和電影B共享兩個標簽(空格,友誼),而電影A和電影C沒有共享標簽。以下是根據Jaccard Index進行的類似于心靈捕手的前十部電影。 對于善意狩獵的觀眾來說,這些看起來像是合理的建議。 請注意,我在列表中包括了心靈捕手,以表明在將電影與其自身進行比較時,Jaccard Index = 1。
根據Jaccard 系數,與《星際穿越》相似的前十部電影以下。 對于《星際穿越》的觀眾來說,這些看起來也很合理。
為了進一步說明“ Jaccard Index”的有效性,請參見下文基于類似于《星際穿越》電影的標簽頻率的詞云。 在這里,我們可以看到哪些標簽在相似度計算中更為突出(例如科幻小說,偉大的結局,錯位的未來,哲學的,大腦的)。
余弦相似度(Cosine Similarity)
Jaccard Index的第一種方法幫助我們建立了與標簽相似意味著什么的直覺。 這里余弦相似度的第二種方法稍微復雜一些。 它要求我們將電影表示為矢量。 在這里,向量只是一組數字。
例如,我們可以用三個實數表示同一部電影:
電影A =(1.1,2.3,5.1)
電影B =(1.3,2.1,4.9)
電影C =(5.1,6.2,1.1)
憑直覺,我們再次可以看到電影A與電影B的相似度高于電影B,這是因為電影A和電影B在每個維度上的數字都更接近(例如,在第一維度上的數字是1.1與1.3)。為了找到電影的良好矢量表示,我使用本文中的Doc2Vec(PV-DBOW)技術拍攝電影(文檔),并根據其標簽(文檔中的單詞)學習到潛在K維矢量空間的映射。
Doc2Vec論文中PV-DBOW技術的可視化; 對于每個段落ID(電影),我們正在訓練一個模型來預測該段落中單詞(電影標簽)的出現
一旦我們可以將每個電影表示為矢量,就可以計算矢量之間的余弦相似度,以找到相似的電影。 我不會在這里詳細介紹余弦相似度,但是從較高的角度講,它可以告訴我們彼此之間相似的電影矢量之間的相似度,我們可以使用它們來生成推薦。 下面,我使用UMAP可視化二維的電影矢量,這是一種流行的非線性降維技術。 我們可以看到在此向量空間中距離更近的電影更加相似(例如玩具總動員和怪物工廠)。
第三個問題:我們如何使用標簽為用戶生成電影推薦?
現在,我們可以測量帶有標簽的電影之間的相似性,我們可以開始向用戶生成電影推薦。請記住,在基于內容的推薦器系統中,將向用戶推薦與他們已經看過的電影相似的電影。如果用戶僅看過一部電影(例如心靈捕手),我們可以像以前一樣簡單地使用Jaccard索引(或余弦相似度)來生成要推薦的類似電影的列表。
實際上,用戶將觀看一組電影,我們需要根據這些電影的組合屬性生成推薦。 一種簡單的方法是將用戶矢量計算為他們看過的電影矢量的平均值。 這些用戶向量可以代表用戶的電影偏好設置。
例如,如果用戶只看了下面的電影A和B:
電影A =(1、2、3)
電影B =(7,2,1)
用戶向量=電影A和電影B的平均值=(4、2、2)
以下是我觀看和欣賞的電影,包括星際穿越、心靈捕手、千鈞一發、幾乎成名、肖申克的救贖、明日邊緣、甜心先生、阿甘正傳和回到未來。我們如何使用這些電影中的標簽生成電影推薦呢?我的用戶向量將是上述九部電影的電影向量的平均值。 我可以利用用戶向量來查找尚未觀看的最相似的電影(基于余弦相似度)。 考慮到我們僅在這里使用電影標簽,以下是我的電影推薦,這些推薦出奇的好!
以下是我們基于內容的推薦系統的摘要。 請注意,如果我們將系統部署為API,則可以在批處理過程中預先計算用戶向量和相似性分數,以加快建議的提供。
輸入:用戶向量(從標記中學到的電影向量的平均值)
輸出:基于用戶和電影向量的余弦相似度,與用戶相似的電影列表
Source: Johnson Kuan, 2019. How to Build a Simple Movie Recommender System with Tags. Available from: https://towardsdatascience.com/how-to-build-a-simple-movie-recommender-system-with-tags-b9ab5cb3b616 [25 June 2020]
個人Github :
非商業應用,僅用于學術分享,侵權刪
總結
以上是生活随笔為你收集整理的movielens推荐系统_基于内容推荐(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: opencv在python环境下的安装_
- 下一篇: 网页跳转代码大全