德鲁周记09--Kaggle比赛 TMDB Box Office Prediction
作者:互联网
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为预测目标值。
三.研究数据:
- 了解数据基本情况
经过观察我们可知,特征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的标签进行编码:
预览一下处理之后的效果(这里只截取了部分)
达到预期的效果,但是日期还是字符串格式,再转化一下日期为标准格式
再看一下处理日期之后的效果
- 可视化分析
①观察预算的分布情况,发现现大部分值比较小,数据不平衡,应做log处理,增加数值较小时的区分度,顺便将票房也一样的处理:
②是否有主页对票房票房的影响
这里把homepage转换成布尔值
有主页可以作为电影实力的象征,我们可以观察到票房高的电影一般都有主页。
③各个语言的电影票房票房情况
我们知道由于英文的使用范围更广,所以市场上的英文电影最多,导致高票房和低票房的英文电影都很多。由图可知票房最高的电影通常使用英语,但也有其他语言的高票房电影。
④展示电影标题中的常见词
绘制一个矩形词云图,可以看到电影标题中最常见的词为Man、Love、Last等。
⑤展示电影剧情摘要中的常见词
绘制一个矩形词云图,可以看到电影剧情摘要中最常见的词为Life、Find、Love、One等。
⑥预算对票房的影响
从上图可以看出预算和票房有一定的正相关性。通常预算越高的电影票房也越高。
⑦流行系数对票房的影响
从上图可以看出流行系数和电影票房的相关度较低。
⑧电影时长对票房的影响
从上图可以看出大部分电影的时长都是一个半小时到两个小时左右,而票房收入高的电影时长也集中在这个区域。这可能是由于在此区间内电影基数大,并不能说明它们之间有强相关性。
⑨剧组人数对票房的影响
由上图可以看出剧组人数和电影票房之间关系不是很大。小剧组高票房的电影和大剧组高票房的电影都有很多。
⑩演员人数对票房的影响
由上图可以看出演员人数和电影票房之间关系不是很大。
我们可以建立一个相关矩阵,来观察时长、流行度、预算、剧组人数、演员人数之间的相关性。
可以观察到在这几项中,对票房影响最大是预算和流行度
⑾是否是系列电影对票房的影响
发现系列电影的平均票房更高,可能是由于系列电影能积累粉丝,拥有更大的粉丝基础。
⑿电影题材数量对票房的影响
可以发现电影题材数量为三个时往往有更高的票房,多了或者少了都会使票房降低。
⒀电影上映日期对票房的影响
用箱线图看一下:
可以观察到周一到周三发行的电影很多是高票房的,而周五到周日发行的低票房的电影多。
四.准备数据
- 删除一些相关性低的特征
- 删除特征值唯一的特征
-
对分类标签进行编码,LabelEncoder会给每个标签分配一个0—n_classes-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 用测试集评估系统
用测试集来评估我们的最佳模型,可以看出这个模型的根均方误差是要差一点。但是在预期之内,因为测试集上的评估结果通常要比训练集上的效果差一点。总体来说效果是令人满意的。
关键代码如下所示:
标签:Box,TMDB,票房,--,模型,电影,集上,csv,数据 来源: https://blog.csdn.net/qq_44047943/article/details/111177755