本文将余弦相似度与 KNN、Seaborn、Scikit-learn 和 Pandas 结合使用,创建一个使用用户评分数据的电影推荐系统。

在日常数据挖掘工作中,除了会涉及到使用Python处理分类或预测任务,有时候还会涉及推荐系统相关任务。

推荐系统用于各个领域,常见的例子包括视频和音乐服务的播放列表生成器、在线商店的产品推荐器或社交媒体平台的内容推荐器。在这个项目中,我们创建一个电影推荐器。

协同过滤通过收集许多用户的偏好或品味信息,对用户的兴趣进行自动预测(过滤)。到目前为止,推荐系统已经发展很长一段时间了,它们的模型基于各种技术,如加权平均、相关性、机器学习、深度学习等等。

自 1995 年以来,Movielens 20M dataset 拥有超过 2000 万个电影评级和标记活动。在本文中,我们将从movie.csv & rating.csv文件中检索信息。使用Python库:Pandas, Seaborn, Scikit-learn和SciPy,使用k-近邻算法中的余弦相似度训练模型。

以下是该项目的核心步骤:

  1. 导入和合并数据集并创建 Pandas DataFrame

  2. 添加必要的特征来分析数据

  3. 使用 Seaborn 可视化数据并分析数据

  4. 通过设置阈值过滤无效数据

  5. 创建一个以用户为索引、以电影为列的数据透视表

  6. 创建 KNN 模型并输出与每部电影相似的 5 个推荐

导入数据

导入和合并数据集并创建 Pandas DataFrame

MovieLens 20M 数据集自 1995 年以来超过 2000 万的电影评级和标记活动。数据集获取:在公众号:『机器学习研习院』后台回复:movies

# usecols 允许选择自己选择的特征,并通过dtype设定对应类型
movies_df=pd.read_csv('movies.csv', usecols=['movieId','title'], dtype={'movieId':'int32','title':'str'})
movies_df.head()

ratings_df=pd.read_csv('ratings.csv',usecols=['userId', 'movieId', 'rating','timestamp'],dtype={'userId': 'int32', 'movieId': 'int32', 'rating': 'float32'})
ratings_df.head()

检查是否存在任何空值以及两个数据中的条目数。

# 检查缺失值
movies_df.isnull().sum()
movieId    0
title      0
dtype: int64
ratings_df.isnull().sum()
userId       0
movieId      0
rating       0
timestamp    0
dtype: int64
print("Movies:",movies_df.shape)
print("Ratings:",ratings_df.shape)
Movies: (9742, 2)
Ratings: (100836, 4)

合并列上的数据帧 'movieId'

# movies_df.info()
# ratings_df.info()
movies_merged_df=movies_df.merge(ratings_df, on='movieId')
movies_merged_df.head()

现在已经成功合并了导入的数据集。

添加衍生特征

添加必要的特征来分析数据。

通过按电影标题对用户评分进行分组来创建'Average Rating' & 'Rating Count'列。

movies_average_rating=movies_merged_df.groupby('title')['rating']\.mean().sort_values(ascending=False)\.reset_index().rename(columns={'rating':'Average Rating'})
movies_average_rating.head()

movies_rating_count=movies_merged_df.groupby('title')['rating']\.count().sort_values(ascending=True)\.reset_index().rename(columns={'rating':'Rating Count'}) #ascending=False
movies_rating_count_avg=movies_rating_count.merge(movies_average_rating, on='title')
movies_rating_count_avg.head()

目前已经创建了 2 个新的衍生特征。

数据可视化

使用 Seaborn 可视化数据:

  • 经过分析发现,许多电影在近 10 万用户评分的数据集上都有完美的 5 星平均评分。这表明存在异常值,我们需要通过可视化进一步确认。

  • 多部电影的评分比较单一,建议设置一个评分门槛值,以便产生有价值的推荐。

使用 seaborn & matplotlib 可视化数据,以便更好地观察和分析数据。

将新创建的特征绘制直方图,并查看它们的分布。设置 bin 大小为80,该值的设置需要具体分析,并合理设置。

# 导入可视化库
import seaborn as sns
import matplotlib.pyplot as plt
sns.set(font_scale = 1)
plt.rcParams["axes.grid"] = False
plt.style.use('dark_background')
%matplotlib inline# 绘制图形
plt.figure(figsize=(12,4))
plt.hist(movies_rating_count_avg['Rating Count'],bins=80,color='tab:purple')
plt.ylabel('Ratings Count(Scaled)', fontsize=16)
plt.savefig('ratingcounthist.jpg')plt.figure(figsize=(12,4))
plt.hist(movies_rating_count_avg['Average Rating'],bins=80,color='tab:purple')
plt.ylabel('Average Rating',fontsize=16)
plt.savefig('avgratinghist.jpg')

图1 Average Rating直方图

图2 Rating Count的直方图

现在创建一个joinplot二维图表,将这两个特征一起可视化。

plot=sns.jointplot(x='Average Rating',y='Rating Count',data=movies_rating_count_avg,alpha=0.5, color='tab:pink')
plot.savefig('joinplot.jpg')

Average Rating和Rating Count的二维图

分析

  • 图1证实了,大部分电影的评分都是较低的。除了设置阈值之外,我们还可以在这个用例中使用一些更高百分比的分位数。

  • 直方图 2 展示了“Average Rating”的分布函数。

数据清洗

运用describe()函数得到数据集的描述统计值,如分位数和标准差等。

pd.set_option('display.float_format', lambda x: '%.3f' % x)
print(rating_with_RatingCount['Rating Count'].describe())
count   100836.000
mean        58.759
std         61.965
min          1.000
25%         13.000
50%         39.000
75%         84.000
max        329.000
Name: Rating Count, dtype: float64

设置阈值并筛选出高于阈值的数据。

popularity_threshold = 50
popular_movies= rating_with_RatingCount[rating_with_RatingCount['Rating Count']>=popularity_threshold]
popular_movies.head()
# popular_movies.shape

至此已经通过过滤掉了评论低于阈值的电影来清洗数据。

创建数据透视表

创建一个以用户为索引、以电影为列的数据透视表

为了稍后将数据加载到模型中,需要创建一个数据透视表。并设置'title'作为索引,'userId'为列,'rating'为值。

import os
movie_features_df=popular_movies.pivot_table(index='title',columns='userId',values='rating').fillna(0)
movie_features_df.head()
movie_features_df.to_excel('output.xlsx')

接下来将创建的数据透视表加载到模型。

建立 kNN 模型

建立 kNN 模型并输出与每部电影相似的 5 个推荐

使用scipy.sparse模块中的csr_matrix方法,将数据透视表转换为用于拟合模型的数组矩阵。

from scipy.sparse import csr_matrix
movie_features_df_matrix = csr_matrix(movie_features_df.values)

最后,使用之前生成的矩阵数据,来训练来自sklearn中的NearestNeighbors算法。并设置参数:metric = 'cosine', algorithm = 'brute'

from sklearn.neighbors import NearestNeighbors
model_knn = NearestNeighbors(metric = 'cosine',algorithm = 'brute')
model_knn.fit(movie_features_df_matrix)

现在向模型传递一个索引,根据'kneighbors'算法要求,需要将数据转换为单行数组,并设置n_neighbors的值。

query_index = np.random.choice(movie_features_df.shape[0])
distances, indices = model_knn.kneighbors(movie_features_df.iloc[query_index,:].values.reshape(1, -1),n_neighbors = 6)

最后在 query_index 中输出出电影推荐。

for i in range(0, len(distances.flatten())):if i == 0:print('Recommendations for {0}:\n'.format(movie_features_df.index[query_index]))else:print('{0}: {1}, with distance of {2}:'.format(i, movie_features_df.index[indices.flatten()[i]],distances.flatten()[i]))
Recommendations for Harry Potter and the Order of the Phoenix (2007):1: Harry Potter and the Half-Blood Prince (2009), with distance of 0.2346513867378235:
2: Harry Potter and the Order of the Phoenix (2007), with distance of 0.3396233320236206:
3: Harry Potter and the Goblet of Fire (2005), with distance of 0.4170845150947571:
4: Harry Potter and the Prisoner of Azkaban (2004), with distance of 0.4499547481536865:
5: Harry Potter and the Chamber of Secrets (2002), with distance of 0.4506162405014038:

至此我们已经能够成功构建了一个仅基于用户评分的推荐引擎。

总结

以下是我们构建电影推荐系统的步骤摘要:

  1. 导入和合并数据集并创建 Pandas DataFrame

  2. 为了更好分析数据创建衍生变量

  3. 使用 Seaborn 可视化数据

  4. 通过设置阈值来清洗数据

  5. 创建了一个以用户为索引、以电影为列的数据透视表

  6. 建立一个 kNN 模型,并输出 5 个与每部电影最相似的推荐

写在最后

以下是可以扩展项目的一些方法:

  • 这个数据集不是很大,可以在项目中的包含数据集中的其他文件来扩展这个项目的范围。

  • 可以利用' ratings.csv' 中时间戳,分析评级在一段时间内的变化情况,并且可以在解析我们的模型时,根据时间戳对评级进行加权。

  • 该模型的性能远优于加权平均或相关模型,但仍有提升的空间,如使用高级 ML 算法甚至 DL 模型。

往期精彩回顾适合初学者入门人工智能的路线及资料下载(图文+视频)机器学习入门系列下载中国大学慕课《机器学习》(黄海广主讲)机器学习及深度学习笔记等资料打印《统计学习方法》的代码复现专辑
AI基础下载机器学习交流qq群955171419,加入微信群请扫码:

【机器学习】使用 Python 构建电影推荐系统相关推荐

  1. Python实现基于用户的协同过滤推荐算法构建电影推荐系统

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 基于用户的协同过滤推荐(User-based CF)的原理假设: ...

  2. Python实现基于物品的协同过滤推荐算法构建电影推荐系统

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 基于物品的协同过滤推荐(Item-based CF)的假设原理为 ...

  3. 使用Python构建一个推荐系统需要几步

    ​ 在我看来,作为一位中国人的我们不管做什么决定都在面临多种选择.例如,如果我这个时候想要买一本书,但是我却不知道我想看什么书.不知道类型.不知道方向,那么这个时候打开各种进行软件搜索可能会出现各种各 ...

  4. python实现电影推荐系统_[转]使用Python MrJob的MapReduce实现电影推荐系统

    最近发现一个很好玩的Python库,可以方便的使用在Python下编写MapReduce任务,直接使用Hadoop Streaming在Hadoop上跑.对于一般的Hadoop而言,如果任务需要大量的 ...

  5. Python+Django电影推荐系统搭建

    文章目录 1. 新建虚拟环境 2. 数据库设置 2.1 安装PostGreSQL 2.2 为MovieGEEK创建数据库 2.3 安装Python数据库驱动程序 2.4 配置Django数据库连接以连 ...

  6. 计算机毕业设计之吊炸天Python+Spark电影推荐系统 电影采集大数据分析 电影购票系统 电影购票小程序app 电影院管理系统 电影数据分析大屏

    一 管理端 1.1 电影管理 支持excel 导入(豆瓣TOP250数据)和导出 支持手动添加 兼容豆瓣在线图片(处理防盗链) + 本地图片 1.2 排片管理 选择电影厅.场次(时间段).价格然后该电 ...

  7. 使用Python构建推荐系统的机器学习

    Recommender systems are widely used in product recommendations such as recommendations of music, mov ...

  8. Python机器学习实战教学——基于协同过滤的电影推荐系统(超详细教学,算法分析)

    注重版权,转载请注明原作者和原文链接 作者:Yuan-Programmer 结尾处有效果展示 文章目录 引言 一.技术原理 (一)推荐算法介绍 (二)主流距离计算法 (三)余弦距离计算法 二.数据介绍 ...

  9. 在线电影推荐网 Python+Django+Mysql 协同过滤推荐算法在电影网站中的运用 基于用户、物品的协同过滤推荐算法 开发在线电影推荐系统 电影网站推荐系统 人工智能、大数据、机器学习开发

    在线电影推荐网 Python+Django+Mysql 协同过滤推荐算法在电影网站中的运用 基于用户.物品的协同过滤推荐算法 开发在线电影推荐系统 电影网站推荐系统 人工智能.大数据.机器学习开发 M ...

最新文章

  1. Django项目之小博客
  2. 10.利用STM32定时器的PWM输出功能,直接获取PWM波形。
  3. 手机算通用计算机还是,电脑手机通用的便签是哪个?有人知道吗
  4. POJ 2230 DFS
  5. C语言 从指定文件中依次读出字符直至文件结束
  6. 用C语言编写小学四则运算程序,用C语言编写生成小学四则运算程序
  7. u8系统怎么连接服务器,用友U8 怎么连接远程服务器
  8. 《计算机导论》课程论文,计算机导论课程论文
  9. 爱链工具 v1.11.24.0
  10. 今天开始,吾使用手机上的五笔输入法
  11. 从excel表格生成ArcGIS Pro样式符号
  12. Flask开发实现在线问答系统首页功能
  13. led大屏按实际尺寸设计画面_微间距LED大屏幕拼接显示系统设计方案
  14. IP数据报首部的格式identification
  15. 基于Android的家庭医生app
  16. 互联网创业公司的管理
  17. iOS 【适配iPhone XR/iPhone XS Max】
  18. android intent开启前置摄像头
  19. js刷新页面得重新加载和页面的刷新
  20. cap分析zk是cp还是ap

热门文章

  1. 反手发力动作--乒在民间
  2. 整型的赋值超出该类型的取值范围
  3. 2014年度工作总结
  4. WPF中实现文件夹对话框(OpenFileDialog in WPF)
  5. ubuntu php多版本共存切换
  6. 判断IE浏览器的版本号
  7. Oracle存储过程小解
  8. 【Zookeeper】源码分析之持久化(三)之FileTxnSnapLog
  9. 如何判断PeopleEditor的值为空
  10. python字符串截取拼接_Python字符串拼接、截取及替换方法总结分析