利用spark的随机森林做票房预测

2023-11-02 17:50

本文主要是介绍利用spark的随机森林做票房预测,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

最近一段时间都在处理电影领域的数据, 而电影票房预测是电影领域数据建模中的一个重要模块, 所以我们针对电影数据做了票房预测建模.

前期工作

一开始的做法是将这个问题看待成回归的问题, 采用GBDT回归树去做. 训练了不同残差的回归树, 然后做集成学习. 考虑的影响因子分别有电影的类型, 豆瓣评分, 导演的 影响力, 演员的影响力, 电影的出品公司. 不过预测的结果并不是那么理想, 准确率为真实值的0.3+/-区间情况下的80%, 且波动性较大, 不容易解析.

后期的改进

总结之前的失败经验, 主要归纳了以下几点:

  • 1.影响因子不够多, 难以建模
  • 2.票房成绩的区间较大(一百万到10亿不等),分布不均匀, 大多数集中与亿级, 所以不适合采用回归方法解决.
  • 3.数据样本量比较少, 不均匀, 预测百万级的电影较多, 影响预测结果

后期, 我们重新规范了数据的输入格式, 即影响因子, 具体如下:

第一行: 电影名字
第二行: 电影票房(也就是用于预测的, 以万为单位)
第三行: 电影类型
第四行: 片长(以分钟为单位)
第五行:上映时间(按月份)
第六行: 制式( 一般分为2D, 3D, IMAX)
第七行: 制作国家
第八行: 导演影响 (以导演的平均票房成绩为衡量, 以万为单位 )
第九行: 演员影响 ( 以所有演员的平均票房成绩为衡量, 以万为单位 )
第十行:制作公司影响 ( 以所有制作公司的平均票房成绩为衡量, 以万为单位 )
第十一行: 发行公式影响 ( 以所有制作公司的平均票房成绩为衡量,以万为单位 )

收集了05-17年的来自中国,日本,美国,英国的电影, 共1058部电影. 由于处理成为分类问题, 故按将电影票房分为以下等级:
这里写图片描述

在构建模型之前, 先将数据处理成libsvm格式文件, 然后采用随机森林模型训练.
随机森林由许多的决策树组成, 因为这些决策树的形成采用随机的策略, 每个决策树都随机生成, 相互之间独立.模型最后输出的类别是由每个树输出的类别的众数而定.在构建每个决策树的时候采用的策略是信息熵, 决策树为多元分类决策树.随机森林的流程图如下图所示:
这里写图片描述
随机森林是采用spark-mllib提供的random forest, 由于超过10亿的电影的数据相对比较少, 为了平衡各数据的分布, 采用了过分抽样的方法, 训练模型的代码如下:

public void predict() throws IOException{SparkConf conf = new SparkConf().setAppName("SVM").setMaster("local");conf.set("spark.testing.memory", "2147480000");SparkContext sc = new SparkContext(conf);SQLContext sqlContext = new SQLContext(sc);// Load and parse the data file, converting it to a DataFrame.DataFrame trainData = sqlContext.read().format("libsvm").load(this.trainFile);DataFrame testData = sqlContext.read().format("libsvm").load(this.testFile);// Index labels, adding metadata to the label column.// Fit on whole dataset to include all labels in index.StringIndexerModel labelIndexer = new StringIndexer().setInputCol("label").setOutputCol("indexedLabel").fit(trainData);// Automatically identify categorical features, and index them.// Set maxCategories so features with > 4 distinct values are treated as continuous.VectorIndexerModel featureIndexer = new VectorIndexer().setInputCol("features").setOutputCol("indexedFeatures").setMaxCategories(4).fit(trainData);// Split the data into training and test sets (30% held out for testing)
//      DataFrame[] splits = trainData.randomSplit(new double[] {0.9, 0.1});
//      trainData = splits[0];
//      testData = splits[1];// Train a RandomForest model.RandomForestClassifier rf = new RandomForestClassifier().setLabelCol("indexedLabel").setFeaturesCol("indexedFeatures").setNumTrees(20);// Convert indexed labels back to original labels.IndexToString labelConverter = new IndexToString().setInputCol("prediction").setOutputCol("predictedLabel").setLabels(labelIndexer.labels());// Chain indexers and forest in a PipelinePipeline pipeline = new Pipeline().setStages(new PipelineStage[] {labelIndexer, featureIndexer, rf, labelConverter});// Train model. This also runs the indexers.PipelineModel model = pipeline.fit(trainData);// Make predictions.DataFrame predictions = model.transform(testData);// Select example rows to display.predictions.select("predictedLabel", "label", "features").show(200);// Select (prediction, true label) and compute test errorMulticlassClassificationEvaluator evaluator = new MulticlassClassificationEvaluator().setLabelCol("indexedLabel").setPredictionCol("prediction").setMetricName("precision");double accuracy = evaluator.evaluate(predictions);System.out.println("Test Error = " + (1.0 - accuracy));RandomForestClassificationModel rfModel = (RandomForestClassificationModel)(model.stages()[2]);
//      System.out.println("Learned classification forest model:\n" + rfModel.toDebugString());DataFrame resultDF = predictions.select("predictedLabel");JavaRDD<Row> resultRow = resultDF.toJavaRDD();JavaRDD<String> result = resultRow.map(new Result());this.resultList = result.collect();for(String one: resultList){System.out.println(one);}}

下面为其中一个的决策树情况:

Tree 16 (weight 1.0):If (feature 10 in {0.0})If (feature 48 <= 110.0)If (feature 86 <= 13698.87)If (feature 21 in {0.0})If (feature 54 in {0.0})Predict: 0.0Else (feature 54 not in {0.0})Predict: 1.0Else (feature 21 not in {0.0})Predict: 0.0Else (feature 86 > 13698.87)If (feature 21 in {0.0})If (feature 85 <= 39646.9)Predict: 2.0Else (feature 85 > 39646.9)Predict: 3.0Else (feature 21 not in {0.0})Predict: 3.0Else (feature 48 > 110.0)If (feature 85 <= 15003.3)If (feature 9 in {0.0})If (feature 54 in {0.0})Predict: 0.0Else (feature 54 not in {0.0})Predict: 2.0Else (feature 9 not in {0.0})Predict: 2.0Else (feature 85 > 15003.3)If (feature 65 in {0.0})If (feature 85 <= 66065.0)Predict: 3.0Else (feature 85 > 66065.0)Predict: 2.0Else (feature 65 not in {0.0})Predict: 3.0Else (feature 10 not in {0.0})If (feature 51 in {0.0})If (feature 85 <= 6958.4)If (feature 11 in {0.0})If (feature 50 <= 1.0)Predict: 1.0Else (feature 50 > 1.0)Predict: 0.0Else (feature 11 not in {0.0})Predict: 0.0Else (feature 85 > 6958.4)If (feature 5 in {0.0})If (feature 4 in {0.0})Predict: 3.0Else (feature 4 not in {0.0})Predict: 1.0Else (feature 5 not in {0.0})Predict: 2.0Else (feature 51 not in {0.0})If (feature 48 <= 148.0)If (feature 0 in {0.0})If (feature 6 in {0.0})Predict: 2.0Else (feature 6 not in {0.0})Predict: 0.0Else (feature 0 not in {0.0})If (feature 50 <= 4.0)Predict: 2.0Else (feature 50 > 4.0)Predict: 3.0Else (feature 48 > 148.0)If (feature 9 in {0.0})If (feature 49 <= 3.0)Predict: 2.0Else (feature 49 > 3.0)Predict: 0.0Else (feature 9 not in {0.0})If (feature 36 in {0.0})Predict: 3.0Else (feature 36 not in {0.0})Predict: 2.0

后记

该模型预测的平均准确率为80%, 但相对之前的做法规范了很多, 对结果的解析也更加的合理, 不过如何增强预测的效果, 可以考虑更多的因子, 形如:电影是否有前续;电影网站的口碑指数;预告片的播放量;相关微博的阅读数;百度指数等;

这篇关于利用spark的随机森林做票房预测的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/332269

相关文章

Spark MLlib模型训练—聚类算法 PIC(Power Iteration Clustering)

Spark MLlib模型训练—聚类算法 PIC(Power Iteration Clustering) Power Iteration Clustering (PIC) 是一种基于图的聚类算法,用于在大规模数据集上进行高效的社区检测。PIC 算法的核心思想是通过迭代图的幂运算来发现数据中的潜在簇。该算法适用于处理大规模图数据,特别是在社交网络分析、推荐系统和生物信息学等领域具有广泛应用。Spa

AI学习指南深度学习篇-带动量的随机梯度下降法的基本原理

AI学习指南深度学习篇——带动量的随机梯度下降法的基本原理 引言 在深度学习中,优化算法被广泛应用于训练神经网络模型。随机梯度下降法(SGD)是最常用的优化算法之一,但单独使用SGD在收敛速度和稳定性方面存在一些问题。为了应对这些挑战,动量法应运而生。本文将详细介绍动量法的原理,包括动量的概念、指数加权移动平均、参数更新等内容,最后通过实际示例展示动量如何帮助SGD在参数更新过程中平稳地前进。

AI学习指南深度学习篇-带动量的随机梯度下降法简介

AI学习指南深度学习篇 - 带动量的随机梯度下降法简介 引言 在深度学习的广阔领域中,优化算法扮演着至关重要的角色。它们不仅决定了模型训练的效率,还直接影响到模型的最终表现之一。随着神经网络模型的不断深化和复杂化,传统的优化算法在许多领域逐渐暴露出其不足之处。带动量的随机梯度下降法(Momentum SGD)应运而生,并被广泛应用于各类深度学习模型中。 在本篇文章中,我们将深入探讨带动量的随

Tensorflow lstm实现的小说撰写预测

最近,在研究深度学习方面的知识,结合Tensorflow,完成了基于lstm的小说预测程序demo。 lstm是改进的RNN,具有长期记忆功能,相对于RNN,增加了多个门来控制输入与输出。原理方面的知识网上很多,在此,我只是将我短暂学习的tensorflow写一个预测小说的demo,如果有错误,还望大家指出。 1、将小说进行分词,去除空格,建立词汇表与id的字典,生成初始输入模型的x与y d

临床基础两手抓!这个12+神经网络模型太贪了,免疫治疗预测、通路重要性、基因重要性、通路交互作用性全部拿下!

生信碱移 IRnet介绍 用于预测病人免疫治疗反应类型的生物过程嵌入神经网络,提供通路、通路交互、基因重要性的多重可解释性评估。 临床实践中常常遇到许多复杂的问题,常见的两种是: 二分类或多分类:预测患者对治疗有无耐受(二分类)、判断患者的疾病分级(多分类); 连续数值的预测:预测癌症病人的风险、预测患者的白细胞数值水平; 尽管传统的机器学习提供了高效的建模预测与初步的特征重

HDD 顺序和随机文件拷贝和存储优化策略

对于机械硬盘(HDD),顺序拷贝和随机拷贝涉及到磁头的移动方式和数据的读取/写入模式。理解这些概念对于优化硬盘性能和管理文件操作非常重要。 1. 顺序拷贝 定义: 顺序拷贝指的是数据从硬盘的一个位置到另一个位置按顺序连续读取和写入。这意味着数据在硬盘上的位置是线性的,没有跳跃或回溯。 特点: 磁头移动最小化:由于数据是连续的,磁头在读取或写入数据时只需要在磁盘的一个方向上移动,减少了寻道时

结合Python与GUI实现比赛预测与游戏数据分析

在现代软件开发中,用户界面设计和数据处理紧密结合,以提升用户体验和功能性。本篇博客将基于Python代码和相关数据分析进行讨论,尤其是如何通过PyQt5等图形界面库实现交互式功能。同时,我们将探讨如何通过嵌入式预测模型为用户提供赛果预测服务。 本文的主要内容包括: 基于PyQt5的图形用户界面设计。结合数据进行比赛预测。文件处理和数据分析流程。 1. PyQt5 图形用户界面设计

算法:将数组随机打乱顺序,生成一个新的数组

一、思路 核心:缩小原数组的可随机取数范围 1、创建一个与原数组长度相同的新数组; 2、从原数组的有效的可取数范围 (不断缩小) 中随机取出一个数据,添加进新的数组; 3、将取出的随机数与原数组的最后一个数据进行置换; 4、重复步骤2和3。 二、代码 public class ArrayRandomTest {//将数组随机打乱顺序,生成一个新的数组public static int

CNN-LSTM模型中应用贝叶斯推断进行时间序列预测

这篇论文的标题是《在混合CNN-LSTM模型中应用贝叶斯推断进行时间序列预测》,作者是Thi-Lich Nghiem, Viet-Duc Le, Thi-Lan Le, Pierre Maréchal, Daniel Delahaye, Andrija Vidosavljevic。论文发表在2022年10月于越南富国岛举行的国际多媒体分析与模式识别会议(MAPR)上。 摘要部分提到,卷积