• Python实现基于内容的协同过滤推荐算法构建电影推荐系统


    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取。

    1.项目背景

    基于内容(Content Based,CB)的推荐算法,根据用户过去是一段时间内喜欢的物品,由此推测计算出用户的偏好,为用户推荐相似的物品,“内容就是”用户过去一段时间内喜欢的物品,以及由此计算出的用户偏好。该算法的原理非常简单,向用户推荐喜欢的Item的相似的Item。

    本项目使用训练数据得到用户的偏好信息矩阵和物品的特征信息矩阵,然后计算该用户对未进行评分电影偏好程度,选取前N个用户推荐给用户。

    本项目应用基于内容的协同过滤推荐算法进行相似度计算、给用户推荐及模型评估。

    2.数据获取

    本次建模数据来源于网络(本项目撰写人整理而成),数据项统计如下:

    数据详情如下(部分展示):

    ratings.dat数据

    数据解释:例如 1::1193::5::978300760

    该条记录队列的列是 UserID::MovieID::Rating::Timestamp,表示id为1的用户在978300760时对1193电影评分为5。

    users.dat数据:

     

    movies.dat数据:

    数据解释:例如 1::Toy Story (1995)    ::Animation|Children's|Comedy

    数据列以::进行间隔,第1列为电影ID,第2列为电影名称,第3列为电影类型,类型之间使用|进行分割。

    3.数据预处理

    3.1 用Pandas工具查看数据

    使用Pandas工具的head()方法查看前五行数据:

     关键代码:

    3.2 数据缺失查看

    使用Pandas工具的info()方法查看数据信息:

     从上图可以看出每种类型的数据样本数和数据项数,数据没有缺失值。

    关键代码:

    4.探索性数据分析

    4.1 评分变量直方图

    用Matplotlib工具的hist()方法绘制直方图:

    从上图可以看到,评分平均记录主要集中在3.0~4.5之间。

    5.特征工程

    5.1 电影特征信息矩阵

    关键代码如下: 

    部分结果展示: 

    从上图可以看出,特征矩阵是一个电影类型的矩阵信息,其中1代表属于这种电影类型,0代表不属于这种电影类型。

    5.2 用户特征信息矩阵

    关键代码如下: 

    电影类型偏好程度,部分结果展示: 

    6.构建电影推荐系统

    主要使用基于内容的协同过滤推荐算法构建电影推荐系统。

    6.1 获取用户喜好程度并对用户进行推荐

    对用户1进行推荐,推荐结果如下:

    关键代码如下:

    7.模型评估

    7.1 评估指标及结果

    评估指标主要包括准确率。随机选择100个用户进行推荐,计算推荐的准确率:

    从上表可以看出,准确率为19%,作为一个推荐系统,在数据量有限的情况下,此效果良好。

    关键代码如下:

    8.结论与展望

    综上所述,本项目采用了基于内容的协同过滤推荐算法来构建电影推荐系统,主要包括数据集的读取、探索性数据分析、特征信息矩阵构建、获取用户对电影类型的喜好程度、对用户进行推荐、模型的评估等,最终证明了我们提出的模型效果较好。 

    1. # 本次机器学习项目实战所需的资料,项目资源如下:
    2. # 项目说明:
    3. # 链接:https://pan.baidu.com/s/13teZEj4juDSuBt-A-kVTWg
    4. # 提取码:mwpu
    5. # 定义评分数据处理方法
    6. def process_rating_data(self, file='data/ratings.dat'):
    7. if os.path.exists("data/ratings.csv"): # 判断是否存在
    8. print("*******************************ratings.csv已经存在*******************************")
    9. # 读取数据
    10. fp = pd.read_table(file, sep='::', engine='python', names=['UserID', 'MovieID', 'Rating', 'Timestamp'])
    11. print('***************************查看数据前5行********************************')
    12. print(fp.head())
    13. print('***************************数据缺失查看********************************')
    14. print(fp.info())
    15. record_m = fp.groupby("UserID")["Rating"].mean()
    16. import matplotlib.pyplot as plt
    17. # y变量分布直方图
    18. fig = plt.figure(figsize=(8, 5)) # 设置画布大小
    19. plt.rcParams['font.sans-serif'] = 'SimHei' # 设置中文显示
    20. plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
    21. # 绘制直方图 bins:控制直方图中的区间个数 auto为自动填充个数 color:指定柱子的填充色
    22. plt.hist(record_m, bins='auto', color='g')
    23. plt.xlabel('Rating')
    24. plt.ylabel('数量')
    25. plt.title('Rating变量分布直方图')
    26. plt.show()
  • 相关阅读:
    【PAT(甲级)】1045 Favorite Color Stripe(映射转换成FIS)
    使用EVO
    【毕业设计】医学大数据分析 - 心血管疾病分析
    RK3568平台开发系列讲解(基础篇)内核是如何发送事件到用户空间
    前端实现克里金插值分析(一)
    2020ICPC南京站
    【PMP考前冲刺题-第一小节(2022.7)】
    Spring 随笔 ioc/di 1-源码走读
    实验2 数据表示实验
    【论文解读】Co-attention network with label embedding for text classification
  • 原文地址:https://blog.csdn.net/weixin_42163563/article/details/128176133