机器学习算法的电影推荐系统以及票房预测系统

一、实验概述

1. 实验目标

本项目希望基于电影数据集,依据电影的简介、关键词、预算、票房、用户评分等特征来对电影进行分析,并完成以下任务:

  • 对电影特征的可视化分析
  • 对电影票房的预测
  • 多功能个性化的电影推荐算法

2. 数据集

  • 针对票房预测部分,本项目使用了收集自 The Movie Database(TMDB)数据集的7398条电影信息, 包含了id、预算、电影主页、票房、语言、时长、评分、受欢迎度等特征,全部数据可见于Kaggle TMDB Box Office Prediction中。
  • 针对电影推荐部分,本项目使用了收集自 The Movie Database(TMDB)数据集的TMDB5000数据集以及收集自电影数据集MovieLens的部分数据,包含了id、预算、内容简介、关键词等特征,并且包含了用户对电影的评分矩阵,全部数据可见于LJSthu(github)中。

3. 实验完成情况

  • 完成了对电影特征的可视化分析。
  • 完成了基于电影特征的电影票房预测算法,并在Kaggle的TMDB Box Office Prediction比赛中最终取得了前 6.8%(95/1400)的成绩。
  • 完成了基于简单特征(内容、评分、关键词)的三种推荐算法、基于KNN的两种协同过滤算法、基于奇异值分解的推荐算法以及三种集成推荐算法,共设计并实现了九种电影推荐算法。

二、电影特征的可视化分析

本项目中,我首先对电影数据的一些特征进行了可视化分析,来为之后的票房预测和电影推荐做帮助。

  • 首先我分别绘制了票房与预算、欢迎程度(popularity)、戏剧性程度(theatrical)的关系图,如下图所示: 

     

  • 从图中可以看出,这三个特征与票房之间存在着比较强的相关关系,于是我选取了票房、预算、受欢迎程度、戏剧性、放映时间、id、上映年份7个特征,绘制了它们之间的相关关系图,如下图所示: 

  • 图中颜色越深代表相关关系越强,可以看出电影票房与预算、受欢迎程度、戏剧性三个特征有着很强的相关关系,而与上映时间、id等信息几乎没有相关关系,这也十分符合我们的预期。

  • 我还研究了电影语言与票房的关系,如下图所示: 

  • 最后我探究了电影预算与电影上映年份之间的关系,为了突出区别,我选取了1983、1984、1985、1991、2017五个年份的电影预算来进行密度估计,结果如图所示: 

  • 从图中可以看出上映年份对预算的分布影响比较大,较早的年份预算集中于比较低的部分,而越靠近现在,电影的预算分布相对越均匀,对应着越来越多的大制作电影,这里我认为上映年份这个特征对票房的影响主要是通过对预算的影响来体现的。

  • 备注:这部分代码参见上传项目

三、电影票房预测

1. Data Augmentation

  • 首先我对提供的数据进行了处理与清洗
  • 加入了一些额外的电影数据,包括电影上映日期、评分、受欢迎度等(全部使用的数据集参见项目代码)
  • 最终使用的特征包括了电影名称、发行公司、受欢迎程度、戏剧性程度、评分人数、评分、放映时长、预算等。
  • 对全部数据进行5折划分来进行5-折交叉验证。

2. 算法说明

  • 本次比赛中我主要使用了三种算法来进行预测,分别为catboost、XGBoost、LightGBM
  • 最终的结果为这三种算法的指数加权平均
2.1 XGBoost
  • 首先尝试了使用XGBoost算法来进行预测
  • 常用算法便不描述具体过程了
2.2 lightGBM
  • 在XGBoost的基础上,lightGBM使用了histogram算法,同时优化了对类别特征的支持,可以进行分布式训练,极大的提升了训练速度。相比于XGBoost, 在准确率相近的情况下,速度大大加快。
2.3 CatBoost
  • CatBoost中使用了梯度提升(Gradient Boost)与类别型特征(Categorical Features),基于梯度提升决策树。
  • 使用对称树结构来避免过拟合问题,并且用特殊的方式处理categorical features。
  • 算法的总流程伪代码如下所示(使用原论文中的伪代码) 

3. 实验结果

  • 最终我将三个模型的输出进行了指数加权,即最终的输出为:

  • 最终的排名为95/1400(top 7%) 

四、电影推荐算法

这里将分别介绍我实现的九种电影推荐算法。

1. 基于人口统计学的推荐

  • 这里我实现了一个基于评分的推荐算法,对每部电影计算评分如下:
  • 算法为用户推荐评分最高的10部电影。
结果示例:
title       									score
The Shawshank Redemption          				8.059258
Fight Club          							7.939256
The Dark Knight         						7.920020
Pulp Fiction          							7.904645
Inception         								7.863239
The Godfather          							7.851236
Interstellar         							7.809479
Forrest Gump         							7.803188
The Lord of the Rings: The Return of the King   7.727243
The Empire Strikes Back          				7.697884

2. 基于内容的推荐算法

  • 这里我实现了两种简单的推荐算法,相关代码参见代码
(1)基于电影简介文本的推荐算法
  • 首先将电影数据中的简介文本通过sklearn中的TfidfVectorizer,将简介文本变成向量,并使用cosine距离来度量向量之间的相似度。
  • 用户输入一个电影名字,算法推荐与之最相近的10部电影。
结果示例:
- 输入: The Dark Knight Rises
- 输出: The Dark Knight					
   		Batman Forever
   		Batman Returns
   		Batman
   		Batman: The Dark Knight Returns, Part 2
   		Batman Begins
   		Slow Burn
   		Batman v Superman: Dawn of Justice
   		JFK
   		Batman & Robin


  • 从结果可以看出,推荐的电影内容与输入电影十分相近,符合算法设计的初衷。
(2)基于电影内容的推荐算法
  • 这里我利用了电影中的关键词、类型、导演、演员等信息
  • 首先使用sklearn中的CountVectorizer将文本转换为词频矩阵,之后利用cosine距离来度量电影之间的相似度,与(1)算法很类似。
  • 用户输入一个电影名字,算法推荐与之最相近的10部电影。
结果示例:
- 输入: The Dark Knight Rises
- 输出: The Dark Knight
   		Batman Begins
   		Amidst the Devil's Wings
   		The Prestige
   		Romeo Is Bleeding
   		Black November
   		Takers
   		Faster
   		Catwoman
   		Gangster Squad



3. 基于KNN的协同过滤算法

  • 这里我实现了两种基于KNN的协同过滤算法,代码可见
  • 这里我使用了MovieLen数据集中的用户对电影的评分矩阵
(1)针对电影相似度的推荐算法
  • 这里我将全部的用户对某一电影的评分作为该电影的特征向量,使用KNN算法,对于用户输入的电影,选出与之最相似的十部电影进行推荐
结果示例:
- 输入: Avengers: Infinity War - Part I (2018)
- 输出: Thor: Ragnarok (2017)
		Captain America: Civil War (2016)
		Deadpool 2 (2018)
		Doctor Strange (2016)
		Guardians of the Galaxy 2 (2017)
		Iron Man (2008)
		Untitled Spider-Man Reboot (2017)
		Avengers, The (2012)
		Inception (2010)
		Logan (2017)

  • 可以看到,输入的电影为《复仇者联盟三》,推荐的十部电影中有九部为漫威出品的超级英雄电影,另外一部也是科幻大片,可见这种衡量电影之间相似性的方法是十分有效的。
(2)针对用户相似度的推荐算法
  • 之前的推荐算法大多基于电影之间的相似度来进行推荐,但对于不同的用户,推荐的结果并没有任何不同,没有实现对于不同用户的个性化推荐,当前的算法就是为了解决这样的问题。
  • 这里我将一个用户对于全部电影的评分作为该用户的特征向量,使用KNN算法,对于输入的用户ID
    • 首先选出10个与当前用户最相似的10个用户
    • 之后选出这10个最相似用户看过的且当前用户没有看过的电影
    • 最后在这些电影中选择出 平均评分最高的十部,推荐给用户
结果示例:
- 输入:用户id=2
- 输出: Forrest Gump (1994)
		Pulp Fiction (1994)
		Silence of the Lambs, The (1991)
		Matrix, The (1999)
		Donnie Darko (2001)
		
- 输入:用户id=6
- 输出: Beverly Hills Cop III (1994)
		Demolition Man (1993)
		Quiz Show (1994)
		Drop Zone (1994)
		Home Alone (1990)
  • 可以看到对于不同的用户,得到的推荐结果是互不相同的,做到了对用户个性化的推荐。
  • 测试结果
    • 我将用户评分矩阵的85%用来训练,15%用作测试,具体划分方法为:对每个用户对每个电影的评分,生成一个随机数,若大于0.85,则为测试;小于等于0.85,则为训练
    • 使用本方法对每个用户推荐了10部电影,总共推荐了6040部电影,其中出现在测试集中的电影数目为878部,占14.54%

4. 基于奇异值分解的推荐算法

  • 这里我实现了基于SVD分解的推荐算法,通过对用户-电影评分矩阵进行SVD分解,对用户未评分的电影预测评分。
  • 这里我主要希望将这个算法作为一个二级筛选方法,即对于输入的用户id与一系列电影id,去预测出当前用户对于这一系列电影的评分,从中挑选出评分最高的10部进行推荐。
  • 由于用户-电影评分矩阵是维度很高的系数矩阵,于是我使用了不同的算法来进行分解,包含了
    • 随机梯度下降算法(SGD)
    • 朗之万动态系统随机梯度方法(SGLD)
    • 随机梯度哈密顿蒙特卡洛方法(SGHMC)
  • 其中SGD为基于优化的方法,而SGLD与SGHMC为基于采样的贝叶斯概率矩阵分解算法。我在movielen数据集的mk-1m中进行了5-折交叉验证,最后的结果如图所示: 

  • 从图中可以看出,SGHMC算法的RMSE loss最低,达到了0.84117,是一种比较好的优化方法,得到的模型也具有比较好的推荐效果。

5. 集成推荐算法

  • 上述的推荐算法均为针对某一个方面进行推荐,并且没有实现对特定用户输入的特定电影进行推荐,这里我将上面的算法组合起来,实现了三种集成推荐算法,可以进行更加个性化的推荐。
5.1 KNN+文本的集成推荐
  • 我首先使用KNN算法对输入的当前用户ID,查找与之最邻近的10位用户,将这些相似用户看过的电影并且当前用户没有看过的电影作为候选电影。
  • 之后将用户输入的文本转换为向量,将候选电影的文本信息(简介、名称、导演等)编码为向量。
  • 最后依据提取的候选电影向量与输入文本向量之间的cosine距离来为用户推荐距离最近的前10部电影。
5.2 用户KNN+电影KNN
  • 我首先使用KNN算法对输入的当前用户ID,查找与之最邻近的10位用户,将这些相似用户看过的电影并且当前用户没有看过的电影作为候选电影。
  • 之后对于电影数据进行KNN处理,挑选出与用户输入电影最邻近的10部电影进行推荐
5.3 用户KNN+奇异值分解
  • 我首先使用KNN算法对输入的当前用户ID,查找与之最邻近的10位用户,将这些相似用户看过的电影并且当前用户没有看过的电影作为候选电影。
  • 之后利用矩阵分解,模拟当前用户对候选电影的评分,选择评分最高的十部电影进行推荐。
  • 测试结果
    • 这里采用了与3.2中相同的测试方法进行测试
    • 对每个用户推荐了10部电影,总共推荐了6040部电影,其中出现在测试集中的电影数目为602部,占9.97%,效果不如只使用用户KNN的算法
  • 分析原因
    • 用户、电影评分矩阵中包含了对于每部电影的评分,评分有高有低,即使是用户看过的电影也会有评分很低的,在本方法中会将这样的电影排除掉,为用户推荐的是模拟评分后分数高的电影
    • 测试中没有涉及到这个问题,因此带来了结果的差异

五、总结

  • 本项目从收集数据集、分析用户需求,到论文的查阅、算法的实现,最后到推荐系统的构建,一步步地完成了一个小型(微型)机器学习系统的搭建,将课上的知识学以致用,增强了从较大的方面分析问题的能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/730863.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

leetcode144. 二叉树的前序遍历

一、题目描述: 给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 二、输入输出实例: 示例 1: 输入:root [1,null,2,3] 输出:[1,2,3]示例 2: 输入:root [] 输出:[]…

经纬恒润EAS.HSM:驱动硬件信息安全

概述 HSM(Hardware Security Module)硬件安全模块,是一种用于保护和管理强认证系统所使用的密钥,并同时提供相关密码学操作的计算机硬件设备。 HSM 在汽车信息安全中扮演着至关重要的角色。随着汽车智能化和网联化的快速发展&am…

微型操作系统内核源码详解系列五(3):cm3下调度的开启

系列一:微型操作系统内核源码详解系列一:rtos内核源码概论篇(以freertos为例)-CSDN博客 系列二:微型操作系统内核源码详解系列二:数据结构和对象篇(以freertos为例)-CSDN博客 系列…

Pyqt QCustomPlot 简介、安装与实用代码示例(一)

目录 简介安装实用代码示例带有填充的简单衰减正弦函数及其红色的指数包络线具有数据点的 sinc 函数、相应的误差条和 2--sigma 置信带几种散点样式的演示展示 QCustomPlot 在设计绘图方面的多功能性 结语 所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转…

wordpress站群搭建3api代码生成和swagger使用

海鸥技术下午茶-wordpress站群搭建3api代码生成和swagger使用 目标:实现api编写和swagger使用 0.本次需要使用到的脚手架命令 生成 http server 代码 goctl api go -api all.api -dir ..生成swagger文档 goctl api plugin -plugin goctl-swagger"swagger -filename st…

vmware workstation下centos7屏幕切换及大小调整

虚拟机版本:vmware workstation15.5.2 操作系统版本:centos 7.9.2009 一 图形界面和命令行界面切换方法 在CentOS 7中,可以使用以下方法切换界面: 1 使用快捷键切换:按下Ctrl Alt F2(或F3&#xff0…

Vue70-路由的几个注意点

一、路由组件和一般组件 1-1、一般组件 1-2、路由组件 不用写组件标签。靠路由规则匹配出来,由路由器渲染出来的组件。 1-3、注意点1 一般组件和路由组件,一般放在不同的文件夹,便于管理。 一般组件放在components文件夹下。 1-4、注意点…

【SpringBoot】SpringBoot:打造现代化微服务架构

文章目录 引言微服务架构概述什么是微服务架构微服务的优势 使用SpringBoot构建微服务创建SpringBoot微服务项目示例:创建订单服务 配置数据库创建实体类和Repository创建服务层和控制器 微服务间通信使用RestTemplate进行同步通信示例:调用用户服务 使用…

用智能插件(Fitten Code: Faster and Better AI Assistant)再次修改vue3 <script setup>留言板

<template><div><button class"openForm" click"openForm" v-if"!formVisible">编辑</button><button click"closeForm" v-if"formVisible">取消编辑</button><hr /><formv-i…

手把手教你java CPU飙升300%如何优化

背景 今天有个项目运行一段时间后&#xff0c;cpu老是不堪负载。 排查 top 命令 TOP 命令 top t 按cpu 排序 top m 按内存使用率排序 从上面看很快看出是 pid 4338 这个进程资源消耗很高。 top -Hp pid top -Hp 4338 找到对应线程消耗的资源shftp cpu占用进行排序&#xf…

优维“态势感知监控”产品:像“上帝”一样掌控应用系统

什么是态势感知&#xff1f; 态势感知是一种基于环境的、动态、整体地洞悉全网安全风险的能力。它以安全大数据为基础&#xff0c;从全局视角对全网安全威胁进行发现识别、理解分析展示和响应处置&#xff0c;并预测发展趋势&#xff0c;为后续网络安全的相关决策与行动提供数据…

Redis 7.x 系列【4】命令手册

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 说明2. 命令手册2.1 Generic2.2 数据类型2.2.1 String2.2.2 Hash2.2.3 List2.2.4 S…

JavaScript--函数的参数列表以及arguments的用法

函数声明时&#xff0c;参数的问题 即使函数在定义时没有显示声明任何参数&#xff0c;你仍然可以在调用该函数时传递参数。 这是因为 JavaScript 函数内部有一个隐含的 arguments 对象&#xff0c;它包含了所有传递给函数的参数。 示例 我们来通过一些示例代码来更清楚地说…

拒绝零散碎片, 一文理清MySQL的各种锁

系列文章目录 学习MySQL先有全局观&#xff0c;细说其发展历程及特点 Mysql常用操作&#xff0c;谈谈排序与分页 拒绝零散碎片&#xff0c; 一文理清MySQL的各种锁&#xff08;收藏向&#xff09; 系列文章目录一、MySQL的锁指什么二、排他与共享三、全局锁&#xff08;Global…

PhotoShop批量生成存储jpg

1、说明 根据之前自动批量生成psd格式的文件。打印一般都是jpg格式的&#xff0c;那如果将这些psd的文件&#xff0c;生成jpg&#xff0c;本文采用ps的动作 2、生成动作 点击窗口-动作 录屏存储jpg动作 3、根据动作生成 选择相应动作之后选择需要处理的文件夹

Aidlux 1.4 部署Nextcloud 2024.6实录 没成功

Aidux阉割版Debain10&#xff0c;坑很多&#xff0c;比如找不到实际的系统日志&#xff0c;有知道的大神吗&#xff1f; 1 Apache2安装 # 测试Apache2 sudo apt update && sudo apt upgrade sudo apt install apache2 -y80端口疑似被禁止只能换端口 rootlocalhost:/…

定制化智能硬件解决方案:为您的业务量身打造的未来之选

在这个数字化转型的时代&#xff0c;企业必须适应快速变化的技术需求和激烈的市场竞争。定制化智能硬件解决方案提供了一种独特的方法&#xff0c;使企业能够通过优化流程和提高效率来满足其特定的业务需求。本文将探讨定制化智能硬件如何助力企业实现卓越性能和创新&#xff0…

mongosh常用命令详解及如何开启MongoDB身份验证

目录 Mongosh常用命令介绍 连接到MongoDB实例 基本命令 查看当前数据库 切换数据库 查看所有数据库 查看当前数据库中的集合 CRUD操作 插入文档 查询文档 更新文档 删除文档 替换文档 索引操作 创建索引 查看索引 删除索引 聚合操作 数据库管理 创建用户 …

计算机毕业设计Python+Vue.js知识图谱音乐推荐系统 音乐爬虫可视化 音乐数据分析 大数据毕设 大数据毕业设计 机器学习 深度学习 人工智能

开发技术 协同过滤算法、机器学习、LSTM、vue.js、echarts、django、Python、MySQL 创新点协同过滤推荐算法、爬虫、数据可视化、LSTM情感分析、短信、身份证识别 补充说明 适合大数据毕业设计、数据分析、爬虫类计算机毕业设计 介绍 音乐数据的爬取&#xff1a;爬取歌曲、…

(项目实战)业务场景中学透RocketMQ5.0-事务消息在预付卡系统中的应用

1 什么是事务消息 RocketMQ中事务消息主要是解决分布式场景下各业务系统事务一致性问题&#xff0c;常见的分布式事务解决方案有传统XA事务方案、TCC、本地消息表、MQ事务等。今天我们基于RocketMQ事务消息解决预付卡系统资金账户子系统和会员积分子系统、短信子系统分布式事务…