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 Pipeline
  Pipeline 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 error
  MulticlassClassificationEvaluator 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.0
  Else (feature 54 not in {0.0})
   Predict: 1.0
  Else (feature 21 not in {0.0})
  Predict: 0.0
  Else (feature 86 > 13698.87)
  If (feature 21 in {0.0})
  If (feature 85 <= 39646.9)
   Predict: 2.0
  Else (feature 85 > 39646.9)
   Predict: 3.0
  Else (feature 21 not in {0.0})
  Predict: 3.0
  Else (feature 48 > 110.0)
  If (feature 85 <= 15003.3)
  If (feature 9 in {0.0})
  If (feature 54 in {0.0})
   Predict: 0.0
  Else (feature 54 not in {0.0})
   Predict: 2.0
  Else (feature 9 not in {0.0})
  Predict: 2.0
  Else (feature 85 > 15003.3)
  If (feature 65 in {0.0})
  If (feature 85 <= 66065.0)
   Predict: 3.0
  Else (feature 85 > 66065.0)
   Predict: 2.0
  Else (feature 65 not in {0.0})
  Predict: 3.0
 Else (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.0
  Else (feature 50 > 1.0)
   Predict: 0.0
  Else (feature 11 not in {0.0})
  Predict: 0.0
  Else (feature 85 > 6958.4)
  If (feature 5 in {0.0})
  If (feature 4 in {0.0})
   Predict: 3.0
  Else (feature 4 not in {0.0})
   Predict: 1.0
  Else (feature 5 not in {0.0})
  Predict: 2.0
  Else (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.0
  Else (feature 6 not in {0.0})
   Predict: 0.0
  Else (feature 0 not in {0.0})
  If (feature 50 <= 4.0)
   Predict: 2.0
  Else (feature 50 > 4.0)
   Predict: 3.0
  Else (feature 48 > 148.0)
  If (feature 9 in {0.0})
  If (feature 49 <= 3.0)
   Predict: 2.0
  Else (feature 49 > 3.0)
   Predict: 0.0
  Else (feature 9 not in {0.0})
  If (feature 36 in {0.0})
   Predict: 3.0
  Else (feature 36 not in {0.0})
   Predict: 2.0

后记

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 基于Spark实现随机森林代码

    本文实例为大家分享了基于Spark实现随机森林的具体代码,供大家参考,具体内容如下 public class RandomForestClassficationTest extends TestCase implements Serializable { /** * */ private static final long serialVersionUID = 7802523720751354318L; class PredictResult implements Serializable{ /

  • java实现随机森林RandomForest的示例代码

    随机森林是由多棵树组成的分类或回归方法.主要思想来源于Bagging算法,Bagging技术思想主要是给定一弱分类器及训练集,让该学习算法训练多轮,每轮的训练集由原始训练集中有放回的随机抽取,大小一般跟原始训练集相当,这样依次训练多个弱分类器,最终的分类由这些弱分类器组合,对于分类问题一般采用多数投票法,对于回归问题一般采用简单平均法.随机森林在bagging的基础上,每个弱分类器都是决策树,决策树的生成过程中中,在属性的选择上增加了依一定概率选择属性,在这些属性中选择最佳属性及分割点,传统做法

  • Spark随机森林实现票房预测

    前言 最近一段时间都在处理电影领域的数据, 而电影票房预测是电影领域数据建模中的一个重要模块, 所以我们针对电影数据做了票房预测建模. 前期工作 一开始的做法是将这个问题看待成回归的问题, 采用GBDT回归树去做. 训练了不同残差的回归树, 然后做集成学习. 考虑的影响因子分别有电影的类型, 豆瓣评分, 导演的 影响力, 演员的影响力, 电影的出品公司. 不过预测的结果并不是那么理想, 准确率为真实值的0.3+/-区间情况下的80%, 且波动性较大, 不容易解析. 后期的改进 总结之前的失败经验

  • python机器学习之随机森林(七)

    机器学习之随机森林,供大家参考,具体内容如下 1.Bootstraping(自助法) 名字来自成语"pull up by your own bootstraps",意思是依靠你自己的资源,称为自助法,它是一种有放回的抽样方法,它是非参数统计中一种重要的估计统计量方差进而进行区间估计的统计方法.其核心思想和基本步骤如下: (1) 采用重抽样技术从原始样本中抽取一定数量(自己给定)的样本,此过程允许重复抽样. (2) 根据抽出的样本计算给定的统计量T. (3) 重复上述N次(一般大于100

  • pyspark 随机森林的实现

    随机森林是由许多决策树构成,是一种有监督机器学习方法,可以用于分类和回归,通过合并汇总来自个体决策树的结果来进行预测,采用多数选票作为分类结果,采用预测结果平均值作为回归结果. "森林"的概念很好理解,"随机"是针对森林中的每一颗决策树,有两种含义:第一种随机是数据采样随机,构建决策树的训练数据集通过有放回的随机采样,并且只会选择一定百分比的样本,这样可以在数据集合存在噪声点.异常点的情况下,有些决策树的构造过程中不会选择到这些噪声点.异常点从而达到一定的泛化作用在

  • 用Python实现随机森林算法的示例

    拥有高方差使得决策树(secision tress)在处理特定训练数据集时其结果显得相对脆弱.bagging(bootstrap aggregating 的缩写)算法从训练数据的样本中建立复合模型,可以有效降低决策树的方差,但树与树之间有高度关联(并不是理想的树的状态). 随机森林算法(Random forest algorithm)是对 bagging 算法的扩展.除了仍然根据从训练数据样本建立复合模型之外,随机森林对用做构建树(tree)的数据特征做了一定限制,使得生成的决策树之间没有关联,

  • python实现随机森林random forest的原理及方法

    引言 想通过随机森林来获取数据的主要特征 1.理论 随机森林是一个高度灵活的机器学习方法,拥有广泛的应用前景,从市场营销到医疗保健保险. 既可以用来做市场营销模拟的建模,统计客户来源,保留和流失.也可用来预测疾病的风险和病患者的易感性. 根据个体学习器的生成方式,目前的集成学习方法大致可分为两大类,即个体学习器之间存在强依赖关系,必须串行生成的序列化方法,以及个体学习器间不存在强依赖关系,可同时生成的并行化方法: 前者的代表是Boosting,后者的代表是Bagging和"随机森林"(

  • Python决策树和随机森林算法实例详解

    本文实例讲述了Python决策树和随机森林算法.分享给大家供大家参考,具体如下: 决策树和随机森林都是常用的分类算法,它们的判断逻辑和人的思维方式非常类似,人们常常在遇到多个条件组合问题的时候,也通常可以画出一颗决策树来帮助决策判断.本文简要介绍了决策树和随机森林的算法以及实现,并使用随机森林算法和决策树算法来检测FTP暴力破解和POP3暴力破解,详细代码可以参考: https://github.com/traviszeng/MLWithWebSecurity 决策树算法 决策树表现了对象属性和

  • python实现决策树、随机森林的简单原理

    本文申明:此文为学习记录过程,中间多处引用大师讲义和内容. 一.概念 决策树(Decision Tree)是一种简单但是广泛使用的分类器.通过训练数据构建决策树,可以高效的对未知的数据进行分类.决策数有两大优点:1)决策树模型可以读性好,具有描述性,有助于人工分析:2)效率高,决策树只需要一次构建,反复使用,每一次预测的最大计算次数不超过决策树的深度. 看了一遍概念后,我们先从一个简单的案例开始,如下图我们样本: 对于上面的样本数据,根据不同特征值我们最后是选择是否约会,我们先自定义的一个决策树

  • python 随机森林算法及其优化详解

    前言 优化随机森林算法,正确率提高1%~5%(已经有90%+的正确率,再调高会导致过拟合) 论文当然是参考的,毕竟出现早的算法都被人研究烂了,什么优化基本都做过.而人类最高明之处就是懂得利用前人总结的经验和制造的工具(说了这么多就是为偷懒找借口.hhhh) 优化思路 1. 计算传统模型准确率 2. 计算设定树木颗数时最佳树深度,以最佳深度重新生成随机森林 3. 计算新生成森林中每棵树的AUC,选取AUC靠前的一定百分比的树 4. 通过计算各个树的数据相似度,排除相似度超过设定值且AUC较小的树

  • python实现H2O中的随机森林算法介绍及其项目实战

    H2O中的随机森林算法介绍及其项目实战(python实现) 包的引入:from h2o.estimators.random_forest import H2ORandomForestEstimator H2ORandomForestEstimator 的常用方法和参数介绍: (一)建模方法: model =H2ORandomForestEstimator(ntrees=n,max_depth =m) model.train(x=random_pv.names,y='Catrgory',train

随机推荐