电影推荐系统kaggle
一、推薦系統(tǒng)的時(shí)代
數(shù)據(jù)收集的快速增長(zhǎng)帶來(lái)了一個(gè)新的信息時(shí)代。數(shù)據(jù)正被用于創(chuàng)建更高效的系統(tǒng),而這正是推薦系統(tǒng)發(fā)揮作用的地方。推薦系統(tǒng)是一種信息過(guò)濾系統(tǒng),因?yàn)樗鼈兛梢蕴岣咚阉鹘Y(jié)果的質(zhì)量,并提供與搜索項(xiàng)目更相關(guān)或與用戶的搜索歷史更相關(guān)的項(xiàng)目。
它們用于預(yù)測(cè)用戶對(duì)某個(gè)項(xiàng)目的評(píng)分或偏好。幾乎每一家大型科技公司都以某種形式應(yīng)用了它們:亞馬遜用它來(lái)向客戶推薦產(chǎn)品,YouTube用它來(lái)決定下一步在autoplay上播放哪個(gè)視頻,Facebook用它來(lái)推薦喜歡的頁(yè)面和關(guān)注的人。此外,像Netflix和Spotify這樣的公司在很大程度上依賴其推薦引擎的有效性來(lái)實(shí)現(xiàn)其業(yè)務(wù)和成功。
在這個(gè)內(nèi)核中,我們將使用TMDB5000電影數(shù)據(jù)集構(gòu)建一個(gè)基線電影推薦系統(tǒng)。對(duì)于像我這樣的新手來(lái)說(shuō),這個(gè)內(nèi)核將在推薦系統(tǒng)中起到很好的基礎(chǔ)作用,并將為您提供一些東西。
那我們走吧!
推薦系統(tǒng)基本上有三種類型:-
人口統(tǒng)計(jì)過(guò)濾——根據(jù)電影人氣和/或類型,向每個(gè)用戶提供一般性建議。該系統(tǒng)向具有相似人口統(tǒng)計(jì)特征的用戶推薦相同的電影。由于每個(gè)用戶都是不同的,這種方法被認(rèn)為太簡(jiǎn)單了。這一體系背后的基本理念是,更受歡迎、更受好評(píng)的電影更容易受到普通觀眾的喜愛(ài)。
基于內(nèi)容的過(guò)濾-他們建議基于特定項(xiàng)目的類似項(xiàng)目。該系統(tǒng)使用項(xiàng)目元數(shù)據(jù),例如電影的類型、導(dǎo)演、描述、演員等,來(lái)提出這些建議。這些推薦系統(tǒng)背后的一般理念是,如果一個(gè)人喜歡某個(gè)特定的項(xiàng)目,他或她也會(huì)喜歡與之相似的項(xiàng)目。
協(xié)同過(guò)濾-此系統(tǒng)匹配具有相似興趣的人,并基于此匹配提供建議。與基于內(nèi)容的過(guò)濾器不同,協(xié)作過(guò)濾器不需要項(xiàng)目元數(shù)據(jù)。
二、加載數(shù)據(jù)
數(shù)據(jù)來(lái)源:Getting Started with a Movie Recommendation System | KaggleExplore and run machine learning code with Kaggle Notebooks | Using data from TMDB 5000 Movie Datasethttps://www.kaggle.com/ibtesama/getting-started-with-a-movie-recommendation-system/data
import pandas as pd import numpy as np df1=pd.read_csv('../input/tmdb-movie-metadata/tmdb_5000_credits.csv') df2=pd.read_csv('../input/tmdb-movie-metadata/tmdb_5000_movies.csv')第一個(gè)數(shù)據(jù)集包含以下功能:-
電影id-每部電影的唯一標(biāo)識(shí)符。
演員-主角和配角的名字。
劇組-導(dǎo)演、編輯、作曲家、作家等的姓名。
第二個(gè)數(shù)據(jù)集具有以下功能:-
預(yù)算-制作電影的預(yù)算。
類型-電影、動(dòng)作片、喜劇、驚悚片等的類型。
主頁(yè)-電影主頁(yè)的鏈接。
id-這實(shí)際上是第一個(gè)數(shù)據(jù)集中的電影id。
關(guān)鍵詞-與電影相關(guān)的關(guān)鍵詞或標(biāo)簽。
原創(chuàng)語(yǔ)言-電影制作時(shí)使用的語(yǔ)言。
原片名-翻譯或改編前的電影片名。
概述-電影的簡(jiǎn)要描述。
流行度-指定電影流行度的數(shù)字量。
制片公司——電影的制片公司。
生產(chǎn)國(guó)-生產(chǎn)該產(chǎn)品的國(guó)家。
發(fā)布日期-發(fā)布的日期。
收入-電影產(chǎn)生的全球收入。
runtime—電影的運(yùn)行時(shí)間(分鐘)。
狀態(tài)-“發(fā)布”或“傳聞”。
標(biāo)語(yǔ)-電影的標(biāo)語(yǔ)。
片名——電影的片名。
投票平均-電影的平均收視率。
計(jì)票-收到的票數(shù)。
讓我們將“id”列上的兩個(gè)數(shù)據(jù)集連接起來(lái)
df1.columns = ['id','tittle','cast','crew'] df2= df2.merge(df1,on='id')人口統(tǒng)計(jì)過(guò)濾-
在開(kāi)始之前-
我們需要一個(gè)指標(biāo)來(lái)評(píng)分或評(píng)價(jià)電影
計(jì)算每部電影的分?jǐn)?shù)
對(duì)分?jǐn)?shù)進(jìn)行排序,并向用戶推薦評(píng)級(jí)最好的電影。
我們可以用電影的平均收視率作為分?jǐn)?shù),但這樣做是不夠公平的,因?yàn)槠骄找暵蕿?.9且只有3票的電影不能被認(rèn)為比平均收視率為7.8但只有40票的電影更好。因此,我將使用IMDB的加權(quán)評(píng)級(jí)(wr),如下所示:-
哪里
v是電影的票數(shù);
m是圖表中列出的最低票數(shù);
R是電影的平均收視率;和
C是整個(gè)報(bào)告的平均投票數(shù)
我們已經(jīng)有了v(投票計(jì)數(shù))和R(投票平均數(shù)),C可以計(jì)算為
C= df2['vote_average'].mean()因此,所有電影的平均評(píng)分在10分制下約為6。下一步是確定m的適當(dāng)值,即圖表中列出的最低投票數(shù)。我們將使用第90百分位作為我們的分界點(diǎn)。換句話說(shuō),要讓一部電影在排行榜上占據(jù)一席之地,它必須擁有比列表中至少90%的電影更多的選票。
m= df2['vote_count'].quantile(0.9)現(xiàn)在,我們可以篩選出符合圖表要求的電影
q_movies = df2.copy().loc[df2['vote_count'] >= m] q_movies.shape我們看到有481部電影符合這個(gè)名單。現(xiàn)在,我們需要計(jì)算每部合格電影的指標(biāo)。為此,我們將定義一個(gè)函數(shù),weighted_rating(),并定義一個(gè)新的功能評(píng)分,我們將通過(guò)將此函數(shù)應(yīng)用于合格電影的數(shù)據(jù)幀來(lái)計(jì)算該值:
def weighted_rating(x, m=m, C=C):v = x['vote_count']R = x['vote_average']# 基于IMDB公式的計(jì)算return (v/(v+m) * R) + (m/(m+v) * C) # 定義一個(gè)新功能“分?jǐn)?shù)”,并使用“加權(quán)評(píng)分”(weighted_rating)計(jì)算其值` q_movies['score'] = q_movies.apply(weighted_rating, axis=1)最后,讓我們根據(jù)分?jǐn)?shù)特性對(duì)數(shù)據(jù)幀進(jìn)行排序,并輸出前10部電影的標(biāo)題、投票數(shù)、投票平均數(shù)和加權(quán)評(píng)級(jí)或分?jǐn)?shù)
#根據(jù)上面計(jì)算的分?jǐn)?shù)對(duì)電影進(jìn)行排序 q_movies = q_movies.sort_values('score', ascending=False)#Print the top 15 movies q_movies[['title', 'vote_count', 'vote_average', 'score']].head(10)萬(wàn)歲!我們已經(jīng)做了我們的第一個(gè)(雖然很基本)推薦人。在這些系統(tǒng)的“現(xiàn)在趨勢(shì)”選項(xiàng)卡下,我們可以找到非常受歡迎的電影,只需按“受歡迎程度”列對(duì)數(shù)據(jù)集進(jìn)行排序即可獲得。
pop= df2.sort_values('popularity', ascending=False) import matplotlib.pyplot as plt plt.figure(figsize=(12,4))plt.barh(pop['title'].head(6),pop['popularity'].head(6), align='center',color='skyblue') plt.gca().invert_yaxis() plt.xlabel("Popularity") plt.title("Popular Movies")現(xiàn)在需要記住的是,這些人口統(tǒng)計(jì)推薦人為所有用戶提供了一個(gè)推薦電影的通用圖表。他們對(duì)特定用戶的興趣和品味不敏感。這就是我們轉(zhuǎn)向更精細(xì)的系統(tǒng)——基于內(nèi)容的過(guò)濾的時(shí)候了。
三、基于內(nèi)容的過(guò)濾
在這個(gè)推薦系統(tǒng)中,電影的內(nèi)容(概述、演員陣容、劇組、關(guān)鍵詞、標(biāo)語(yǔ)等)被用來(lái)尋找與其他電影的相似之處。然后推薦最有可能相似的電影。
四、基于圖描述的推薦器
我們將根據(jù)情節(jié)描述計(jì)算所有電影的成對(duì)相似性分?jǐn)?shù),并根據(jù)該相似性分?jǐn)?shù)推薦電影。數(shù)據(jù)集的概述功能中給出了繪圖描述。讓我們看一下數(shù)據(jù)…
df2['overview'].head(5)對(duì)于任何之前做過(guò)一點(diǎn)文本處理的人來(lái)說(shuō),都知道我們需要轉(zhuǎn)換每個(gè)概述的單詞向量。現(xiàn)在,我們將為每個(gè)概述計(jì)算術(shù)語(yǔ)頻率逆文檔頻率(TF-IDF)向量。
現(xiàn)在,如果您想知道什么是術(shù)語(yǔ)頻率,那么它是文檔中一個(gè)單詞的相對(duì)頻率,并以(術(shù)語(yǔ)實(shí)例/總實(shí)例)的形式給出。反向文檔頻率是包含術(shù)語(yǔ)的文檔的相對(duì)計(jì)數(shù),以log(文檔數(shù)/包含術(shù)語(yǔ)的文檔數(shù))的形式給出。每個(gè)單詞對(duì)其出現(xiàn)的文檔的總體重要性等于TF*IDF
這將為您提供一個(gè)矩陣,其中每列表示概述詞匯表中的一個(gè)單詞(至少在一個(gè)文檔中出現(xiàn)的所有單詞),每行表示一部電影,如前所述。這樣做是為了降低情節(jié)概述中經(jīng)常出現(xiàn)的單詞的重要性,從而降低它們?cè)谟?jì)算最終相似性分?jǐn)?shù)時(shí)的重要性。
幸運(yùn)的是,scikit learn為您提供了一個(gè)內(nèi)置的TfIdfVectorizer類,該類在幾行中生成TF-IDF矩陣。太好了,不是嗎?
?
我們發(fā)現(xiàn),在我們的數(shù)據(jù)集中,有超過(guò)20000個(gè)不同的詞被用來(lái)描述4800部電影。
有了這個(gè)矩陣,我們現(xiàn)在可以計(jì)算相似性分?jǐn)?shù)了。這方面有幾個(gè)候選人;例如歐幾里得、皮爾遜和余弦相似性分?jǐn)?shù)。對(duì)于哪個(gè)分?jǐn)?shù)最好,沒(méi)有正確的答案。不同的分?jǐn)?shù)在不同的場(chǎng)景中效果很好,使用不同的指標(biāo)進(jìn)行實(shí)驗(yàn)通常是一個(gè)好主意。
我們將使用余弦相似性來(lái)計(jì)算表示兩部電影之間相似性的數(shù)字量。我們使用余弦相似性分?jǐn)?shù),因?yàn)樗c震級(jí)無(wú)關(guān),并且計(jì)算起來(lái)相對(duì)簡(jiǎn)單和快速。在數(shù)學(xué)上,其定義如下:
由于我們使用了TF-IDF矢量器,計(jì)算點(diǎn)積將直接得到余弦相似性分?jǐn)?shù)。因此,我們將使用sklearn的線性內(nèi)核()而不是余弦內(nèi)核(),因?yàn)樗俣雀臁?/p> # Import linear_kernel from sklearn.metrics.pairwise import linear_kernel# Compute the cosine similarity matrix cosine_sim = linear_kernel(tfidf_matrix, tfidf_matrix)
我們將定義一個(gè)函數(shù),該函數(shù)接收電影標(biāo)題作為輸入,并輸出10部最相似電影的列表。首先,為此,我們需要電影標(biāo)題和數(shù)據(jù)幀索引的反向映射。換句話說(shuō),我們需要一種機(jī)制來(lái)識(shí)別元數(shù)據(jù)數(shù)據(jù)框中給定電影標(biāo)題的電影索引。
#Construct a reverse map of indices and movie titles indices = pd.Series(df2.index, index=df2['title']).drop_duplicates()我們現(xiàn)在可以很好地定義我們的推薦函數(shù)。以下是我們將遵循的步驟:-
獲取給定電影標(biāo)題的電影索引。
獲取特定電影與所有電影的余弦相似性分?jǐn)?shù)列表。將其轉(zhuǎn)換為元組列表,其中第一個(gè)元素是其位置,第二個(gè)元素是相似性分?jǐn)?shù)。
根據(jù)相似度得分對(duì)上述元組列表進(jìn)行排序;即第二個(gè)要素。
獲取此列表的前10個(gè)元素。忽略第一個(gè)元素,因?yàn)樗傅氖亲晕?#xff08;與特定電影最相似的電影是電影本身)。
返回與頂部元素的索引相對(duì)應(yīng)的標(biāo)題。
# Function that takes in movie title as input and outputs most similar movies def get_recommendations(title, cosine_sim=cosine_sim):# Get the index of the movie that matches the titleidx = indices[title]# Get the pairwsie similarity scores of all movies with that moviesim_scores = list(enumerate(cosine_sim[idx]))# Sort the movies based on the similarity scoressim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)# Get the scores of the 10 most similar moviessim_scores = sim_scores[1:11]# Get the movie indicesmovie_indices = [i[0] for i in sim_scores]# Return the top 10 most similar moviesreturn df2['title'].iloc[movie_indices] get_recommendations('The Dark Knight Rises') get_recommendations('The Avengers')?
雖然我們的系統(tǒng)在尋找情節(jié)描述相似的電影方面做得不錯(cuò),但推薦的質(zhì)量并不是很好。《黑暗騎士崛起》將返回所有蝙蝠俠電影,而喜歡該電影的人更有可能更喜歡克里斯托弗·諾蘭的其他電影。這是當(dāng)前系統(tǒng)無(wú)法捕捉到的。
五、基于信用、類型和關(guān)鍵字的推薦器
不用說(shuō),隨著更好的元數(shù)據(jù)的使用,我們的推薦者的質(zhì)量將會(huì)提高。這正是我們?cè)诒竟?jié)要做的。我們將基于以下元數(shù)據(jù)構(gòu)建一個(gè)推薦器:3位頂級(jí)演員、導(dǎo)演、相關(guān)類型和電影情節(jié)關(guān)鍵詞。
從演員、劇組和關(guān)鍵詞特征中,我們需要提取三個(gè)最重要的演員,導(dǎo)演和與該電影相關(guān)的關(guān)鍵詞。現(xiàn)在,我們的數(shù)據(jù)以“字符串化”列表的形式存在,我們需要將其轉(zhuǎn)換為安全和可用的結(jié)構(gòu)
# Parse the stringified features into their corresponding python objects from ast import literal_evalfeatures = ['cast', 'crew', 'keywords', 'genres'] for feature in features:df2[feature] = df2[feature].apply(literal_eval)接下來(lái),我們將編寫(xiě)函數(shù),幫助我們從每個(gè)特性中提取所需的信息。
# Get the director's name from the crew feature. If director is not listed, return NaN def get_director(x):for i in x:if i['job'] == 'Director':return i['name']return np.nan # Returns the list top 3 elements or entire list; whichever is more. def get_list(x):if isinstance(x, list):names = [i['name'] for i in x]#Check if more than 3 elements exist. If yes, return only first three. If no, return entire list.if len(names) > 3:names = names[:3]return names#Return empty list in case of missing/malformed datareturn [] # Define new director, cast, genres and keywords features that are in a suitable form. df2['director'] = df2['crew'].apply(get_director)features = ['cast', 'keywords', 'genres'] for feature in features:df2[feature] = df2[feature].apply(get_list) # Print the new features of the first 3 films df2[['title', 'cast', 'director', 'keywords', 'genres']].head(3)下一步是將名稱和關(guān)鍵字實(shí)例轉(zhuǎn)換為小寫(xiě),并去掉它們之間的所有空格。這樣做是為了我們的矢量器不會(huì)將“Johnny Depp”和“Johnny Galecki”中的Johnny計(jì)算為相同的值。
# Function to convert all strings to lower case and strip names of spaces def clean_data(x):if isinstance(x, list):return [str.lower(i.replace(" ", "")) for i in x]else:#Check if director exists. If not, return empty stringif isinstance(x, str):return str.lower(x.replace(" ", ""))else:return '' # Apply clean_data function to your features. features = ['cast', 'keywords', 'director', 'genres']for feature in features:df2[feature] = df2[feature].apply(clean_data)?我們現(xiàn)在可以創(chuàng)建我們的“元數(shù)據(jù)湯”,它是一個(gè)字符串,包含我們想要提供給向量器的所有元數(shù)據(jù)(即參與者、導(dǎo)演和關(guān)鍵字)。
def create_soup(x):return ' '.join(x['keywords']) + ' ' + ' '.join(x['cast']) + ' ' + x['director'] + ' ' + ' '.join(x['genres']) df2['soup'] = df2.apply(create_soup, axis=1)?接下來(lái)的步驟與我們使用基于情節(jié)描述的推薦器所做的步驟相同。一個(gè)重要的區(qū)別是我們使用CountVectorizer()而不是TF-IDF。這是因?yàn)?#xff0c;如果一個(gè)演員/導(dǎo)演在相對(duì)較多的電影中表演或?qū)а?#xff0c;我們不想貶低他的存在。這沒(méi)有什么直觀的意義。
# Import CountVectorizer and create the count matrix from sklearn.feature_extraction.text import CountVectorizercount = CountVectorizer(stop_words='english') count_matrix = count.fit_transform(df2['soup']) # Compute the Cosine Similarity matrix based on the count_matrix from sklearn.metrics.pairwise import cosine_similaritycosine_sim2 = cosine_similarity(count_matrix, count_matrix) # Reset index of our main DataFrame and construct reverse mapping as before df2 = df2.reset_index() indices = pd.Series(df2.index, index=df2['title'])?現(xiàn)在,我們可以通過(guò)傳入新的cosine_sim2矩陣作為第二個(gè)參數(shù)來(lái)重用get_recommendations()函數(shù)。
get_recommendations('The Dark Knight Rises', cosine_sim2) get_recommendations('The Godfather', cosine_sim2)我們看到我們的推薦人由于更多的元數(shù)據(jù)而成功地捕獲了更多的信息,并且(可以說(shuō))給了我們更好的推薦。驚奇漫畫(huà)或DC漫畫(huà)迷更可能喜歡同一家制片公司的電影。因此,我們可以在上述功能的基礎(chǔ)上增加生產(chǎn)公司。我們還可以通過(guò)在湯中多次添加該功能來(lái)增加控制器的重量。
協(xié)同過(guò)濾
我們基于內(nèi)容的引擎受到一些嚴(yán)重限制。它只能推薦與某部電影相近的電影。也就是說(shuō),它無(wú)法捕捉品味并提供跨流派的推薦。
此外,我們構(gòu)建的引擎并不是真正的個(gè)性化引擎,因?yàn)樗荒懿蹲接脩舻膫€(gè)人喜好和偏見(jiàn)。任何查詢我們的引擎以獲得基于某部電影的推薦的人,無(wú)論她/他是誰(shuí),都將收到與該電影相同的推薦。
因此,在本節(jié)中,我們將使用一種稱為協(xié)同過(guò)濾的技術(shù)向電影觀眾提出建議。它基本上有兩種類型:
基于用戶的過(guò)濾
-這些系統(tǒng)向類似用戶喜歡的用戶推薦產(chǎn)品。為了測(cè)量?jī)蓚€(gè)用戶之間的相似性,我們可以使用皮爾遜相關(guān)或余弦相似性。這種過(guò)濾技術(shù)可以用一個(gè)例子來(lái)說(shuō)明。在下面的矩陣中,每一行代表一個(gè)用戶,而列對(duì)應(yīng)不同的電影,除了最后一個(gè)記錄該用戶和目標(biāo)用戶之間的相似性的電影。每個(gè)單元格表示用戶對(duì)該電影的評(píng)級(jí)。假設(shè)用戶E是目標(biāo)。
由于用戶A和F與用戶E沒(méi)有任何共同的電影評(píng)級(jí),因此它們與用戶E的相似性在Pearson相關(guān)性中沒(méi)有定義。因此,我們只需要考慮基于皮爾森相關(guān)的用戶B、C和D,我們就可以計(jì)算出以下相似性。
從上表中我們可以看出,用戶D與用戶E之間的Pearson相關(guān)性為負(fù),因此用戶D與用戶E非常不同。他在你之前給我的評(píng)分高于他的平均評(píng)分,而用戶E則相反。現(xiàn)在,我們可以開(kāi)始填寫(xiě)用戶沒(méi)有根據(jù)其他用戶評(píng)價(jià)的電影的空白。
雖然計(jì)算基于用戶的CF非常簡(jiǎn)單,但它存在幾個(gè)問(wèn)題。一個(gè)主要問(wèn)題是用戶的偏好會(huì)隨著時(shí)間的推移而改變。這表明基于相鄰用戶預(yù)計(jì)算矩陣可能會(huì)導(dǎo)致性能下降。為了解決這個(gè)問(wèn)題,我們可以應(yīng)用基于項(xiàng)目的CF。
基于項(xiàng)目的協(xié)同過(guò)濾-
基于項(xiàng)目的CF根據(jù)項(xiàng)目與目標(biāo)用戶評(píng)分的項(xiàng)目的相似性推薦項(xiàng)目,而不是測(cè)量用戶之間的相似性。同樣,相似性可以用皮爾遜相關(guān)或余弦相似性計(jì)算。主要區(qū)別在于,使用基于項(xiàng)目的協(xié)同過(guò)濾,我們垂直填充空白,與基于用戶的CF的水平方式相反。下表顯示了如何為電影“我在你面前”執(zhí)行此操作。
它成功地避免了動(dòng)態(tài)用戶偏好帶來(lái)的問(wèn)題,因?yàn)榛陧?xiàng)目的CF更加靜態(tài)。然而,這種方法仍然存在一些問(wèn)題。首先,主要問(wèn)題是可伸縮性。計(jì)算量隨著客戶和產(chǎn)品的增長(zhǎng)而增長(zhǎng)。最壞情況下的復(fù)雜度是O(mn),有m個(gè)用戶和n個(gè)項(xiàng)目。此外,稀疏性是另一個(gè)問(wèn)題。再看一下上面的表格。雖然只有一個(gè)用戶同時(shí)對(duì)《黑客帝國(guó)》和《泰坦尼克號(hào)》進(jìn)行了評(píng)級(jí),但兩者之間的相似性為1。在極端情況下,我們可以擁有數(shù)百萬(wàn)用戶,而兩部完全不同的電影之間的相似性可能非常高,這僅僅是因?yàn)橹挥幸晃挥脩魧?duì)這兩部電影進(jìn)行了排名,而這兩部電影的排名相似。
單值分解
處理CF產(chǎn)生的可伸縮性和稀疏性問(wèn)題的一種方法是利用潛在因素模型來(lái)捕獲用戶和項(xiàng)目之間的相似性。本質(zhì)上,我們希望將推薦問(wèn)題轉(zhuǎn)化為優(yōu)化問(wèn)題。我們可以將其視為我們?cè)陬A(yù)測(cè)給定用戶的項(xiàng)目評(píng)級(jí)方面有多好。一個(gè)常見(jiàn)的度量是均方根誤差(RMSE)。RMSE越低,性能越好。
現(xiàn)在談到潛在因素,你可能會(huì)想知道它是什么?它是一個(gè)廣義的概念,描述了用戶或項(xiàng)目所具有的屬性或概念。例如,對(duì)于音樂(lè),潛在因素可以指音樂(lè)所屬的流派。奇異值分解通過(guò)提取效用矩陣的潛在因子來(lái)降低效用矩陣的維數(shù)。本質(zhì)上,我們將每個(gè)用戶和每個(gè)項(xiàng)目映射到一個(gè)維度為r的潛在空間。因此,它有助于我們更好地理解用戶和項(xiàng)目之間的關(guān)系,因?yàn)樗鼈兙哂兄苯涌杀刃浴O聢D說(shuō)明了這一想法。
說(shuō)得夠多了,讓我們看看如何實(shí)現(xiàn)這一點(diǎn)。因?yàn)槲覀円郧笆褂玫臄?shù)據(jù)集沒(méi)有userId(這對(duì)于協(xié)作過(guò)濾是必需的),所以讓我們加載另一個(gè)數(shù)據(jù)集。我們將使用驚奇庫(kù)來(lái)實(shí)現(xiàn)SVD。?
?請(qǐng)注意,在這個(gè)數(shù)據(jù)集中,電影的評(píng)級(jí)為5級(jí),與之前的不同。
data = Dataset.load_from_df(ratings[['userId', 'movieId', 'rating']], reader) data.split(n_folds=5) svd = SVD() evaluate(svd, data, measures=['RMSE', 'MAE'])我們得到的平均根平均平方誤差約為0.89,這對(duì)于我們的情況來(lái)說(shuō)已經(jīng)足夠好了。現(xiàn)在讓我們對(duì)數(shù)據(jù)集進(jìn)行訓(xùn)練,并得出預(yù)測(cè)。
trainset = data.build_full_trainset() svd.fit(trainset)讓我們選擇用戶Id為1的用戶,并檢查她/他給出的評(píng)分。
ratings[ratings['userId'] == 1] svd.predict(1, 302, 3)對(duì)于ID為302的電影,我們得到的估計(jì)預(yù)測(cè)值為2.618。這個(gè)推薦系統(tǒng)的一個(gè)驚人的特點(diǎn)是它不在乎電影是什么(或包含什么)。它完全基于指定的電影ID工作,并嘗試根據(jù)其他用戶對(duì)電影的預(yù)測(cè)來(lái)預(yù)測(cè)收視率。
結(jié)論
我們使用人口統(tǒng)計(jì)、基于內(nèi)容和協(xié)作過(guò)濾創(chuàng)建推薦人。雖然人口統(tǒng)計(jì)過(guò)濾非常簡(jiǎn)單,無(wú)法實(shí)際使用,但混合系統(tǒng)可以利用基于內(nèi)容的過(guò)濾和協(xié)作過(guò)濾,因?yàn)檫@兩種方法幾乎是互補(bǔ)的。這個(gè)模型是非常基本的,只提供了一個(gè)基本的框架。
我想提一下我從中學(xué)到的一些很好的參考資料
https://hackernoon.com/introduction-to-recommender-system-part-1-collaborative-filtering-singular-value-decomposition-44c9659c5e75
https://www.kaggle.com/rounakbanik/movie-recommender-systems
http://trouvus.com/wp-content/uploads/2016/03/A-hybrid-movie-recommender-system-based-on-neural-networks.pdf
總結(jié)
以上是生活随笔為你收集整理的电影推荐系统kaggle的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: HDOJ 2526 HDU 2526 浪
- 下一篇: 毕业设计 - 题目: 基于协同过滤的电影