使用 Python 創建自己的電影推薦系統
已發表: 2021-03-09您想知道 Netflix 是如何推薦與您的興趣如此一致的電影嗎? 或者,也許您也想構建一個可以向用戶提出此類建議的系統?
如果您的回答是肯定的,那麼您來對地方了,因為本文將教您如何使用 Python 構建電影推薦系統。
然而,在我們開始討論“如何”之前,我們必須熟悉“什麼”。
目錄
推薦系統:它是什麼?
推薦系統已經成為我們日常生活中不可或缺的一部分。 從亞馬遜和 Flipkart 等在線零售商到 YouTube 和 Facebook 等社交媒體平台,每家大型數字公司都使用推薦系統為其客戶提供個性化的用戶體驗。
日常生活中推薦系統的一些示例包括:
- 您在購買產品時從亞馬遜獲得的建議是推薦系統的結果。
- YouTube 使用推薦系統來推薦適合您口味的視頻。
- Netflix 有一個著名的推薦系統,可以根據您的興趣推薦節目和電影。
推薦系統通過使用數據向用戶推薦產品。 這些數據可能與用戶輸入的興趣、歷史等有關。如果您正在研究機器學習和人工智能,那麼必須研究推薦系統,因為它們變得越來越流行和先進。
推薦系統的類型
推薦系統有兩種:
1. 協同推薦系統
協作推薦系統根據相似用戶對該項目的相似度來建議項目。 它將具有相似興趣和品味的用戶分組,並相應地推薦他們的產品。
例如,假設您和另一位用戶喜歡 Sholay。 現在,在觀看了 Sholay 並喜歡它之後,另一個用戶喜歡了 Golmaal。 因為您和其他用戶有相似的興趣,推薦系統會根據這些數據建議您觀看 Golmaal。 這就是協同過濾。
2. 基於內容的推薦系統
基於內容的推薦系統根據從用戶那裡接收到的數據來推薦項目。 它可以基於顯式數據(“喜歡”、“分享”等)或隱式數據(觀看歷史記錄)。 推薦系統將使用這些數據來創建用戶特定的配置文件,並根據該配置文件推薦項目。
構建基本的電影推薦系統
現在我們已經介紹了推薦系統的基礎知識,讓我們開始構建電影推薦系統。
我們可以使用完整的MovieLens數據集開始構建基於 Python 的電影推薦系統。 該數據集包含超過 2600 萬個評分、750,000 個標籤應用程序,應用於超過 45,000 部電影。 該數據集中的標籤基因組數據具有超過 1200 萬個相關性分數。
我們正在使用完整的數據集來創建一個基本的電影推薦系統。 但是,您可以在此項目中隨意使用較小的數據集。 首先,我們必須導入所有必需的庫:
一個基於 Python 的基本電影推薦系統會根據電影的受歡迎程度和類型推薦電影。 該系統的工作原理是,獲得好評的流行電影很可能會受到普通觀眾的喜愛。 請記住,這樣的電影推薦系統不會提供個性化的建議。
為了實現它,我們將根據電影的受歡迎程度和收視率對電影進行排序,並傳入流派參數以獲取流派的熱門電影:
輸入
md = pd。 read_csv('../input/movies_metadata.csv')
md.head()
輸出
成人 | 屬於_to_collection | 預算 | 流派 | 視頻 | ID | imdb_id | original_title | 概述 | 收入 | 標題 | |||||||
錯誤的 | ('id'L 10194, 'name': '玩具總動員系列') | 30000000 | [{'id': 16, 'name': '動畫'}… | 錯誤的 | 862 | tt0114709 | 玩具總動員 | 在伍迪的帶領下,安迪的玩具們過著幸福的生活…… | 373554033 | 玩具總動員 | |||||||
1 | 錯誤的 | 鈉 | 65000000 | {{'id': 12, 'name': 'Adventure'}… | 錯誤的 | 8844 | tt0113497 | 勇敢者遊戲 | 當兄弟姐妹朱迪和彼得... | 262797249 | 勇敢者遊戲 | ||||||
2 | 錯誤的 | ('id': 119050, 'name': '脾氣暴躁的老人) | 0 | {{'id': 10749, 'name': '浪漫'}… | 錯誤的 | 15602 | tt0113228 | 脾氣暴躁的老人 | 一場家庭婚禮重新點燃了古老的…… | 0 | 脾氣暴躁的老人 | ||||||
3 | 錯誤的 | 鈉 | 16000000 | {{'id': 35, 'name': '喜劇'}… | 錯誤的 | 31357 | tt0114885 | 等待呼氣 | 被欺騙、虐待和踩踏…… | 81452156 | 等待呼氣 |
輸入
md['genres'] = md['genres'].fillna('[]').apply(literal_eval).apply(lambda x: [i['name'] for i in x] if isinstance(x, list ) 別的 [])
我們圖表的公式
為了創建我們的頂級電影圖表,我們使用了 TMDB 評級。 我們將使用 IMDB 的加權評級公式來創建我們的圖表,如下所示:
加權評級 (WR) = (iaouaouaouaouaou)
這裡,v 代表一部電影獲得的票數,m 是一部電影應該在圖表上獲得的最低票數,R 代表電影的平均評分,C 是整個報告的平均票數.
構建圖表
現在我們已經有了數據集和公式,我們可以開始構建圖表了。 我們只會將那些至少獲得 95% 票的電影添加到我們的圖表中。 我們將從創建前 250 名圖表開始。
輸入
vote_counts = md[md['vote_count'].notnull()]['vote_count'].astype('int')
vote_averages = md[md['vote_average'].notnull()]['vote_average'].astype('int')
C = vote_averages.mean()
C
輸出
5.244896612406511
輸入
m = vote_counts.quantile(0.95)
米
輸出
434.0
輸入
md['year'] = pd.to_datetime(md['release_date'], errors='coerce').apply(lambda x: str(x).split('-')[0] if x != np. nan 否則 np.nan)
輸入
合格 = md[(md['vote_count'] >= m) & (md['vote_count'].notnull()) & (md['vote_average'].notnull())][['title', '年份', 'vote_count', 'vote_average', '流行度', '流派']]
合格['vote_count'] = 合格['vote_count'].astype('int')
合格['vote_average'] = 合格['vote_average'].astype('int')
合格的形狀
輸出
(2274, 6)
如您所見,要在我們的排行榜上佔有一席之地,一部電影必須至少獲得 434 票。 您可能已經註意到,一部電影必須進入我們的圖表的平均評分是 5.24。
輸入
def weighted_rating(x):
v = x['vote_count']
R = x['vote_average']
返回 (v/(v+m) * R) + (m/(m+v) * C)
輸入
合格['wr'] = 合格.apply(weighted_rating, axis=1)
輸入
合格的=合格的.sort_values('wr',升序=假).head(250)
完成所有這些後,讓我們構建圖表:
總體熱門電影
輸入
合格的頭(15)
輸出
標題 | 年 | 投票計數 | 投票平均 | 人氣 | 流派 | 寫 | |
15480 | 成立之初 | 2010 | 14075 | 8 | 29.1081 | 【動作、驚悚、科幻、懸疑、驚悚…… | 7.917588 |
12481 | 黑闇騎士 | 2008年 | 12269 | 8 | 123.167 | [戲劇,動作,犯罪,驚悚] | 7.905871 |
22879 | 星際 | 2014 | 11187 | 8 | 32.2135 | [冒險、戲劇、科幻] | 7.897107 |
2843 | 搏擊俱樂部 | 1999 | 9678 | 8 | 63.8696 | [戲劇] | 7.881753 |
4863 | 指環王:魔戒團契 | 2001年 | 8892 | 8 | 32.0707 | 【冒險、奇幻、動作】 | 7.871787 |
292 | 低俗小說 | 1994 | 8670 | 8 | 140.95 | [驚悚、犯罪] | 7.868660 |
314 | 肖申克的救贖 | 1994 | 8358 | 8 | 51.6454 | [戲劇,犯罪] | 7.864000 |
7000 | 指環王:王者歸來 | 2003年 | 8226 | 8 | 29.3244 | 【冒險、奇幻、動作】 | 7.861927 |
351 | 阿甘 | 1994 | 8147 | 8 | 48.3072 | [喜劇,戲劇,浪漫] | 7.860656 |
5814 | 指環王:兩座塔樓 | 2002年 | 7641 | 8 | 29.4235 | 【冒險、奇幻、動作】 | 7.851924 |
256 | 星球大戰 | 1977年 | 6778 | 8 | 42.1497 | 【冒險、動作、科幻】 | 7.834205 |
1225 | 回到未來 | 1985年 | 6239 | 8 | 25.7785 | 【冒險、喜劇、科幻、家庭】 | 7.820813 |
834 | 教父 | 1972年 | 6024 | 8 | 41.1093 | [戲劇,犯罪] | 7.814847 |
1154 | 帝國反擊戰 | 1980 | 5998 | 8 | 19.471 | 【冒險、動作、科幻】 | 7.814099 |
46 | Se7en | 1995 | 5915 | 8 | 18.4574 | 【犯罪、懸疑、驚悚】 |
瞧,您已經創建了一個基於 Python 的基本電影推薦系統!
現在,我們將把推薦系統的建議範圍縮小到基於流派的建議,以便更精確。 畢竟,沒有必要讓每個人都平等地喜歡《教父》。
縮小類型
所以,現在我們將修改我們的推薦系統,使其更加針對特定類型:
輸入
s = md.apply(lambda x: pd.Series(x['genres']),axis=1).stack().reset_index(level=1, drop=True)
s.name = '流派'
gen_md = md.drop('genres', axis=1).join(s)
輸入
def build_chart(流派,百分位數=0.85):
df = gen_md[gen_md['流派'] == 流派]
vote_counts = df[df['vote_count'].notnull()]['vote_count'].astype('int')
vote_averages = df[df['vote_average'].notnull()]['vote_average'].astype('int')
C = vote_averages.mean()
m = vote_counts.quantile(percentile)
合格 = df[(df['vote_count'] >= m) & (df['vote_count'].notnull()) & (df['vote_average'].notnull())][['title', 'year ', 'vote_count', 'vote_average', '人氣']]
合格['vote_count'] = 合格['vote_count'].astype('int')
合格['vote_average'] = 合格['vote_average'].astype('int')
合格['wr'] = 合格.apply(lambda x: (x['vote_count']/(x['vote_count']+m) * x['vote_average']) + (m/(m+x[' vote_count']) * C), 軸=1)
合格的=合格的.sort_values('wr',升序=假).head(250)
返回合格
我們現在創建了一個推薦系統,可以對浪漫類型的電影進行分類並推薦排名靠前的電影。 我們選擇了浪漫類型,因為它在我們之前的圖表中沒有出現太多。
愛情片
輸入
build_chart('浪漫').head(15)
輸出
標題 | 年 | 投票計數 | 投票平均 | 人氣 | 寫 | |
10309 | Dilwale Dulhania Le Jayenge | 1995 | 661 | 9 | 34.457 | 8.565285 |
351 | 阿甘 | 1994 | 8147 | 8 | 48.3072 | 7.971357 |
876 | 眩暈 | 1958年 | 1162 | 8 | 18.2082 | 7.811667 |
40251 | 你的名字。 | 2016 年 | 1030 | 8 | 34.461252 | 7.789489 |
883 | 有些人喜歡它熱 | 1959年 | 835 | 8 | 11.8451 | 7.745154 |
1132 | 天堂電影院 | 1988年 | 834 | 8 | 14.177 | 7.744878 |
19901 | 紙人 | 2012 | 734 | 8 | 7.19863 | 7.713951 |
37863 | 唱街 | 2016 年 | 669 | 8 | 10.672862 | 7.689483 |
882 | 公寓 | 1960 | 498 | 8 | 11.9943 | 7.599317 |
38718 | 侍女 | 2016 年 | 453 | 8 | 16.727405 | 7.566166 |
3189 | 城市的燈光 | 1931年 | 444 | 8 | 10.8915 | 7.558867 |
24886 | 他的樣子 | 2014 | 262 | 8 | 5.71127 | 7.331363 |
45437 | 在心跳中 | 2017 | 146 | 8 | 20.82178 | 7.003959 |
1639 | 泰坦尼克號 | 1997 | 7770 | 7 | 26.8891 | 6.981546 |
19731 | 烏雲背後的幸福線 | 2012 | 4840 | 7 | 14.4881 | 6.970581 |
現在,您有一個電影推薦系統,可以根據所選類型推薦熱門電影。 我們建議將此推薦系統與其他類型(例如動作、戲劇、懸疑等)一起測試。在下面的評論部分分享推薦系統建議的您最喜歡的類型中的前三部電影
了解有關電影推薦系統的更多信息
您現在一定已經註意到,基於 Python 構建電影推薦系統非常簡單。 你所需要的只是一點數據科學知識和一點點努力來創建一個功能齊全的推薦系統。
但是,如果您想構建更高級的推薦系統怎麼辦? 如果您想創建一個大型公司可能會考慮使用的推薦系統怎麼辦?
如果您有興趣了解有關推薦系統和數據科學的更多信息,那麼我們建議您參加數據科學課程。 通過一門課程,您將學習數據科學和機器學習的所有基本和高級概念。 此外,您將向行業專家學習,他們將在整個課程中指導您,幫助您避免疑慮和困惑。
在 upGrad,我們提供多種數據科學和機器學習課程。 您可以根據自己的興趣從以下選擇任何人:
- 數據科學 PG 文憑
- 數據科學理學碩士
- 數據科學 PG 認證
- 機器學習和人工智能 PG 文憑
- 機器學習和人工智能理學碩士
除了這些課程,我們還提供許多其他數據科學和機器學習課程。 一定要檢查出來!
最後的想法
您現在知道如何構建電影推薦系統。 創建系統後,請務必與他人分享並向他們展示您的進度。 推薦系統有各種各樣的應用,因此了解它們肯定會讓您在行業中佔據上風。
協同過濾是一種基於用戶偏好構建模型的推薦系統。 用戶的歷史作為協同過濾的數據集。 協同過濾有以下兩種類型: 基於內容的過濾從用戶那裡收集數據並相應地建議項目。 它的一些優點和缺點如下所述: 協同過濾算法正在成為許多流行應用程序的主要驅動算法。 越來越多的企業專注於提供豐富的個性化內容。 例如,您可能已經在許多電子商務網站上看到此消息購買此商品的客戶也購買了。什麼是協同過濾,它的類型是什麼?
1. 基於用戶的協同過濾:這種協同過濾背後的思想是我們把一個用戶作為偏好,比如說“A”,然後找到其他有相似偏好的用戶,然後將這些用戶的偏好提供給“A”還沒遇到。
基於項目的協同過濾:這裡不是尋找具有相似偏好的用戶,而是尋找與“A”的口味相似的電影,並推薦那些它還沒有看過的電影。 基於內容的過濾有哪些優點和缺點?
優點
1. 與協同過濾不同,該模型不需要收集具有相似偏好的其他用戶的數據,因為它需要主用戶本身的建議。
2.模型可以根據你的喜好向你推荐一些只有少數人看過的最好的電影。
缺點
1. 這種技術需要關於某個領域的大量信息,因此它提供的特徵質量或多或少與手工設計的特徵相同。
2. 推薦電影的能力有限,因為它只根據用戶現有的興趣工作。 哪些流行的應用程序使用協同過濾算法?
以下是一些在全球擁有流行用戶群的應用程序:
1. YouTube 使用此算法和其他一些強大的算法在主頁上提供視頻推薦。
2、亞馬遜、Flipkart、Myntra等電商網站也使用該算法提供產品推薦。
3. 視頻流媒體平台是這裡最大的例子,它使用用戶評分、平均評分和相關內容來提供個性化建議。