使用 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. 视频流媒体平台是这里最大的例子,它使用用户评分、平均评分和相关内容来提供个性化建议。