德鲁周记09--Kaggle比赛 TMDB Box Office Prediction

一.问题定义:

该问题来源于kaggle,在这个世界上,2018年电影收入估计达到417亿美元,电影业比以往任何时候都更受欢迎。但是什么电影票房收入最高?一个导演有多重要?还是预算?

本题将通过电影数据库中7000多部电影的数据,以尝试预测它们在全球的总票房收入。提供的数据点包括演员、剧组、剧情关键词、预算、海报、发行日期、语言、制作公司和国家。该问题实际上还是一道回归问题。

从kaggle上获取数据后,为了更好的训练,每个样本的特征属性和标签需要进行相关处理(包括取出异常值,填充缺省值,特征转换,数据转换等),然后构建多种误差较小的模型(SVR,Ridge,Lasso,ElasticNet,Xgboost,ExtraTree,Lightbgm,AdaBoost,KernelRidge,BayesianRidge,LogisticRegression,RandomForestRegressor),找到最佳参数后将模型Averaging融合,获取更小的误差,达到更好的预测效果,然后将模型保存起来。本次题目使用MSE根均方误差作为衡量模型的标准,最终降到2左右。

二.获取数据:

TMDB票房预测中提供了两组数据:train.csv和test.csv,分别是训练集和测试集。Sample_submission.csv为提交样本示例。本实验为练手项目,所以数据就直接给了,不过有缺失的数据,需要我们来处理一下。

打开kaggle对应项目的数据栏

在这里插入图片描述

下载数据

在这里插入图片描述Train.csv
在这里插入图片描述
Test.csv

在这里插入图片描述
sample_submission.csv

导入numpy,pandas,matplotlib,seaborn包
在这里插入图片描述
导入train.csv和test.csv,并显示两个数据文件的尺寸
在这里插入图片描述
显示两个数据文件的相关信息

在这里插入图片描述

训练数据

在这里插入图片描述

测试数据

在这里插入图片描述
预览训练集
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

了解数据特征含义:

Index([‘id’,‘belong_to_collection’,‘budget’,‘genres’,‘homepage’,‘imdb_id’,‘original_language’,‘original_title’,‘overview’,‘popularity’,‘poster_path’,‘production_companies’,‘production_countries’,‘release_date’,‘runtime’,‘spoken_languages’,‘status’,‘tagline’,‘title’,‘Keywords’,‘cast’,‘crew’, ‘revenue’],dtype=‘object’)

id:序号

belong_to_collection:系列电影

budget:预算

genres:题材

homepage:主页

imdb_id:IMDB序号

original_language:原语言

original_title:原片名

overview:剧情简介

popularity:流行系数

poster_path:海报

production_companies:制作公司

production_countries:制作国家

release_date:发布日期

runtime:电影时长

spoken_languages:翻译成的语言

status:电影是否已上映

tagline:宣传标语

title:电影名

Keywords:关键词

cast:演员

crew:剧组

revenue:票房

其中revenue为预测目标值。

三.研究数据:

  1. 了解数据基本情况

经过观察我们可知,特征belongs_to_collection,generes, homepage, overview,poster_path,production_companies,production_countries,runtime,spoken_language,tagline,Keyword,cast,crew缺少数据;cast、crew是json的格式,需要将演员、导演读取出来,以字符串格式显示。数据中genres、keywords、production_companies也是json格式,需要转化成字符串。

这了使用ast.literal_eval将字符串型的json数据转化成字典列表。

在这里插入图片描述

再将这些不规则数据转化成特征,分为标签与编码,如关键演员、题材、分类、系列、发行方等,以及标签数量统计,如分类数量、演员数量、主题长度等。这里需要注意,因为数据集不多,为避免模型过拟合,应仅对TOP的标签进行编码:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

预览一下处理之后的效果(这里只截取了部分)

在这里插入图片描述

在这里插入图片描述

达到预期的效果,但是日期还是字符串格式,再转化一下日期为标准格式

在这里插入图片描述

再看一下处理日期之后的效果

在这里插入图片描述

  1. 可视化分析

①观察预算的分布情况,发现现大部分值比较小,数据不平衡,应做log处理,增加数值较小时的区分度,顺便将票房也一样的处理:

在这里插入图片描述
在这里插入图片描述

②是否有主页对票房票房的影响

这里把homepage转换成布尔值

有主页可以作为电影实力的象征,我们可以观察到票房高的电影一般都有主页。
在这里插入图片描述

③各个语言的电影票房票房情况

在这里插入图片描述
在这里插入图片描述

我们知道由于英文的使用范围更广,所以市场上的英文电影最多,导致高票房和低票房的英文电影都很多。由图可知票房最高的电影通常使用英语,但也有其他语言的高票房电影。

④展示电影标题中的常见词

在这里插入图片描述

绘制一个矩形词云图,可以看到电影标题中最常见的词为Man、Love、Last等。

⑤展示电影剧情摘要中的常见词

在这里插入图片描述

绘制一个矩形词云图,可以看到电影剧情摘要中最常见的词为Life、Find、Love、One等。

⑥预算对票房的影响

在这里插入图片描述

从上图可以看出预算和票房有一定的正相关性。通常预算越高的电影票房也越高。

⑦流行系数对票房的影响

在这里插入图片描述
从上图可以看出流行系数和电影票房的相关度较低。

⑧电影时长对票房的影响

在这里插入图片描述

从上图可以看出大部分电影的时长都是一个半小时到两个小时左右,而票房收入高的电影时长也集中在这个区域。这可能是由于在此区间内电影基数大,并不能说明它们之间有强相关性。

⑨剧组人数对票房的影响

在这里插入图片描述

由上图可以看出剧组人数和电影票房之间关系不是很大。小剧组高票房的电影和大剧组高票房的电影都有很多。

⑩演员人数对票房的影响

在这里插入图片描述

由上图可以看出演员人数和电影票房之间关系不是很大。

我们可以建立一个相关矩阵,来观察时长、流行度、预算、剧组人数、演员人数之间的相关性。

在这里插入图片描述

可以观察到在这几项中,对票房影响最大是预算和流行度

⑾是否是系列电影对票房的影响

在这里插入图片描述

发现系列电影的平均票房更高,可能是由于系列电影能积累粉丝,拥有更大的粉丝基础。

⑿电影题材数量对票房的影响

在这里插入图片描述

可以发现电影题材数量为三个时往往有更高的票房,多了或者少了都会使票房降低。

⒀电影上映日期对票房的影响

在这里插入图片描述

用箱线图看一下:
在这里插入图片描述

可以观察到周一到周三发行的电影很多是高票房的,而周五到周日发行的低票房的电影多。

四.准备数据

  1. 删除一些相关性低的特征

在这里插入图片描述

  1. 删除特征值唯一的特征

在这里插入图片描述

  1. 对分类标签进行编码,LabelEncoder会给每个标签分配一个0—n_classes-1之间的编码
    在这里插入图片描述

  2. 对文本变量构造新变量:总共有多少字符,有多少个单词

在这里插入图片描述

  1. 修正一些有错误的数据
    在这里插入图片描述

五.模型研究

5.1 验证方法我们采用k-折交叉验证, k = 5

5.2 评价标准是根均方误差(mean_squared_error)

5.3 可能的模型有如下16个:SVC,SVR, LinearRegression, Ridge, Lasso, ElasticNet, ExtraTree, AdaBoost, KernelRidge, BayesianRidge, LogisticRegression, DecisionTreeRegressor, RandomForestRegressor, LGBMRegressor, BaggingClassifer, KNeighborsClassifier。

5.4 分别测试了它们在训练集上的均分误差,5-折交叉验证集上的均方误差的平均值和方差。得到的数据如下图所示。

在这里插入图片描述

关键代码如下所示(以LinearRegression模型举例):
在这里插入图片描述

5.5 最终结合这三种数据(训练集上的RMSE, 验证集上的RMSE, 验证集上的方差)我们最终选则了4种模型,分别是LinearRegression, Ridge, BayesianRidge, LGBMRegressor。

六.模型微调和模型融合

6.1 选择最佳超参数,找到最好的模型

我们发现需要调节超参数的模型有LGBMRegressor,我们最初的模型参数为{learning_rate=0.01, max_depth=5,num_leaves=20}和训练结果分别如下图所示:
在这里插入图片描述

用网格搜索最佳超参数,关键代码如下所示:

在这里插入图片描述

不同参数组合得到结果如下所示:
在这里插入图片描述

得到的最佳参数为:{‘learning_rate’: 0.05, ‘max_depth’: 5, ‘num_leaves’: 30}

结论:可以看出模型微调后训练损失值从2.3577降到了2.1375。得到了超参数参数最佳的模型。

6.2 集成模型:将表现最好的模型组合起来

采用平均法将模型融合。关键代码如下:

在这里插入图片描述

结论:融合得到的训练损失可以看到降到了2.0264。

6.3 分析最佳模型和它们的误差

最佳模型的误差已经降到了2.0264, 可以看出比选出的4种模型(分别是LinearRegression, Ridge, BayesianRidge, LGBMRegressor)中最好的模型表现还要好。因此最佳模型已经达到了理想的效果。

6.4 用测试集评估系统

用测试集来评估我们的最佳模型,可以看出这个模型的根均方误差是要差一点。但是在预期之内,因为测试集上的评估结果通常要比训练集上的效果差一点。总体来说效果是令人满意的。

关键代码如下所示:
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值