SparkMLlib随机森林实现pm预测(自定义函数的使用)

标签: 随机森林 自定义函数 pm 预测
22人阅读 评论(0) 收藏 举报
分类:

本文主要是用SparkMLlib中的一些算法来对PM进行预测,其中涉及了dataframe中对列使用自定义函数的操作,很方便!!

任务:读取pm.csv,将含有缺失值的行扔掉(或用均值填充)将数据集分为两部分,0.8比例作为训练集,0.2比例作为测试集
(1)使用month,day,hour,DEWP,TEMP,PRES,cbwd,Iws,Is,Ir作为特征列(除去No,year,pm),pm作为label列,使用训练集、随机森林算法进行回归建模,使用回归模型对测试集进行预测,并评估。

1) 将数据读取到dataframe中然后将标签列和特征列选出,同时去除数值为空的数据

val conf = new SparkConf().setAppName("input").setMaster("local[*]")
val sparkContext = new SparkContext(conf)
val sqlContext = new SQLContext(sparkContext)
val url = "C:\\Users\\shuangmm\\Desktop\\pm.csv"
val dataDF =sqlContext.read.format("csv")
      .option("header","true")
      .option("inferSchema",true.toString)
      //这是自动推断属性列的数据类型。
      .load(url).na.drop()

2) 选取特征列,使用了VectorAssembler函数,将数据转换为向量,方便输进模型,但是有一列是字符格式的,需要进行处理
使用StringIndexer的方法将字符串改为索引的形式。

val index = new StringIndexer()
      .setInputCol("cbwd")
      .setOutputCol("cbwd_in")

val feat = new VectorAssembler()
    .setInputCols(Array("month","day","hour","DEWP","TEMP","PRES","cbwd_in","Iws","Is","Ir"))
      .setOutputCol("features")

3) 创建随机森林回归模型

4) 创建pineline

5) 划分数据集,8:2进行划分

6) 进行预测及模型的评估

    val rf = new RandomForestClassifier()
      .setLabelCol("levelnum")
      .setFeaturesCol("features")

      //.setNumTrees(10)
      .setMaxDepth(20)//20棵树  0.3189

    // Chain indexer and forest in a Pipeline
    val pipeline = new Pipeline()
      .setStages(Array(index,feat,rf))
    val Array(trainingData, testData) = features.randomSplit(Array(0.8, 0.2))

    // Train model.  This also runs the indexer.
    val model = pipeline.fit(trainingData)

    // Make predictions.
    val predictions = model.transform(testData)

    // Select example rows to display.
    val result = predictions.select("levelnum","prediction", "features","levelstr")//.show(100)
    result.show(100)
    val pre = result.withColumn("predtionStr",levelStr(result("prediction")))
    pre.show(100)
    // Select (prediction, true label) and compute test error
    val evaluator = new MulticlassClassificationEvaluator()
      .setLabelCol("levelnum")
      .setPredictionCol("prediction")
      .setMetricName("accuracy")
    val accuracy = evaluator.evaluate(predictions)
    println("Test Error = " + (1.0 - accuracy))

运行结果
这里写图片描述

(2)按照下面标准处理pm列,数字结果放进(levelNum)列,字符串结果放进(levelStr)列优(0) 50 良(1)50~100 轻度污染(2) 100~150 中度污染(3) 150~200 重度污染(4) 200~300 严重污染(5) 大于300及以上

划重点了

本题的需求是根据pm列的值来重新生成两个列,开始想着用rdd来处理这个列,就需要用dataframe和rdd之间来回转换,想起之前处理篮球信息的时候有一个z-socre的处理,当时有一个方法是selectexpr的方法比如直接列名加1,就会自动生成一列列名加一的数据。通过查资料看到dataframe中可以对列使用自定义函数。下面开始变魔法

  • 首先自定义两个函数,转换成相应的数值和对应的字符串
    Pm列的类型是double类型
 //将值和等级进行转换
 def testNum(x : Double) : Double = {
      var leveNum = 0
      if(x < 50)
        leveNum = 0
      if(x >= 50 & x <= 100)
        leveNum = 1
      if(x > 100 & x < 150)
        leveNum = 2
      if(x >= 150 & x <= 200)
        leveNum = 3
      if(x > 200 & x < 300)
        leveNum = 4
      if(x >= 300)
        leveNum = 5
      leveNum

    }
     //自定义函数,将字符串进行对应
    def testStr(x : Double) : String = {
      var leveStr = x match {
        case 0 => "优"
        case 1 => "良"
        case 2 => "轻度污染"
        case 3 => "中度污染"
        case 4 => "重度污染"
        case 5 => "严重污染"
      }
      leveStr
    }
!!!!注册自定义函数,这部分非常关键,给自定义函数起了一个新的名字,
方便之后的调用。必不可少的一步!!
    import org.apache.spark.sql.functions.{udf}
    val levelNum = udf(testNum _)
    val levelStr = udf(testStr _)
  • 读取数据存到dataframe中的过程和上面相同。
    使用自定义函数,withColumn的方法第一个参数是函数执行结束之后的新列名。
val level = dataDF.withColumn("levelnum",levelNum(dataDF("pm")))//.show(10)
val features = level.withColumn("levelstr",levelStr(level("levelnum")))//.show(10)

可以看到执行后的结果,将值和标准全部转换过来了
这里写图片描述

(3)使用month,day,hour,DEWP,TEMP,PRES,cbwd,Iws,Is,Ir作为特征列(除去No,year,pm),levelNum作为label列,使用训练集、随机森林算法进行分类建模。使用分类模型对测试集进行预测对预测结果df进行处理,基于prediction列生成predictionStr(0-5转换优-严重污染),对结果进行评估
思路:和随机森林的回归模型算法类似,不同的是
需要对预测出来的结果进行列的转化,用到之前的自定义函数。
  • 数据处理的过程都相同,进行模型的建立,之前没有设置参数,跑出来的结果不太好,然后设置了树的深度,在设置之后程序运行时间大大增加,不过准确率也增加了,之前准确率只有50%左右,现在能到70%多

  • Pineline创建

  • 模型预测

  • 数据处理

    val rf = new RandomForestClassifier()
      .setLabelCol("levelnum")
      .setFeaturesCol("features")

      //.setNumTrees(10)
      .setMaxDepth(20)//20棵树  0.3189

    // Chain indexer and forest in a Pipeline
    val pipeline = new Pipeline()
      .setStages(Array(index,feat,rf))
    val Array(trainingData, testData) = features.randomSplit(Array(0.8, 0.2))

    // Train model.  This also runs the indexer.
    val model = pipeline.fit(trainingData)

    // Make predictions.
    val predictions = model.transform(testData)

    // Select example rows to display.
    val result = predictions.select("levelnum","prediction", "features","levelstr")//.show(100)
    result.show(100)
    val pre = result.withColumn("predtionStr",levelStr(result("prediction")))
    pre.show(100)

结果
这里写图片描述

主要是自定义函数的使用,,注册函数的那部分一定要好好看,能省非常多的事。

源码看这里
如果有需要数据集当做练习的可以私信我,发给你数据集。

查看评论

PHP7自定义函数

King老师精心打造的PHP7自定义函数课程,在PHP中提供了强大的系统函数来帮我们完成功能,但有时候只用系统函数往往还是不够的,还需要根据业务来封装自定义函数,本课程讲解了如何自定义函数,以及自定义函数中常见问题,是PHP入门必看课程。 山哥出品,必属精品!
  • 2017年08月20日 09:57

Spark MLlib RandomForest(随机森林)建模与预测

我要做的是发现异常用户,而我们之前没有已经打上异常不异常标签的样本,所以对原始数据进行清洗、特征工程、降维后用Mahout/R做的聚类,打上了标签,本来打算继续用Mahout/R做分类,Mahout太...
  • Dr_Guo
  • Dr_Guo
  • 2016-11-21 12:03:57
  • 4630

使用opencv随机森林预测图像质量分类

1. 2. 参考链接: https://www.jianshu.com/p/d0d7809007a1 http://blog.csdn.net/lulumi2016/article/det...
  • qq_33392335
  • qq_33392335
  • 2018-01-04 09:37:09
  • 53

Spark mllib 随机森林算法的简单应用(附代码)

spark mllib 随机森林算法的应用
  • lo_cima
  • lo_cima
  • 2016-06-29 13:06:29
  • 2597

【大数据部落】基于ARIMA、SVM、随机森林销售的时间序列预测

原文链接 http://mp.weixin.qq.com/s/d2Yj6rwJkpKQgIc2qER9TA 如今DT(Data technology)时代,数据变得越来越重要,其核心应用”预测...
  • qq_19600291
  • qq_19600291
  • 2017-07-03 16:51:53
  • 2903

spark mllib实现 广告点击率预测

本文尝试使用Spark提供的机器学习算法 Gradient-Boosted Trees来预测一个用户是否会点击广告。 训练和测试数据使用Kaggle Avazu CTR 比赛的样例数据,下载地址:h...
  • xiaomage167
  • xiaomage167
  • 2017-03-11 21:04:14
  • 445

随机森林算法的总结和基于python的简单实现

第一次写博客,水平有限,恳请指正交流. 接触机器学习也有一段时间了,以前只是看看理论,调调sklearn的包,感觉并没有真正的明白算法的具体细节。 现在开始利用空闲时间,把自己学过的算法用py...
  • zwzen1
  • zwzen1
  • 2018-01-26 19:29:19
  • 658

随机森林的原理分析及Python代码实现

在讲随机森林前,我先讲一下什么是集成学习。集成学习通过构建并结合多个分类器来完成学习任务。集成学习通过将多个学习器进行结合,常可获得比单一学习器更好的泛化性能。 考虑一个简单例子:在二分类任务中,假定...
  • Flying_sfeng
  • Flying_sfeng
  • 2017-03-20 20:35:41
  • 17540

Spark随机森林算法对数据分类(一)——计算准确率和召回率

1.召回率和正确率计算对于一个KK元的分类结果,我们可以得到一个K∗KK*K的混淆矩阵,得到的举证结果如下图所示。 从上图所示的结果中不同的元素表示的含义如下: mijm_{ij} :表示实际分类...
  • redhatforyou
  • redhatforyou
  • 2017-07-23 15:40:23
  • 1456
    个人资料
    持之以恒
    等级:
    访问量: 487
    积分: 114
    排名: 122万+
    文章分类
    文章存档
    最新评论