美文网首页
1 . spark ml 随机森林练习代码讲解

1 . spark ml 随机森林练习代码讲解

作者: 丑图高手 | 来源:发表于2019-04-25 11:22 被阅读0次

一,算法简介

        随机森林是决策树的集成算法。随机森林包含多个决策树来降低过拟合的风险。随机森林同样具有易解释性、可处理类别特征、易扩展到多分类问题、不需特征缩放等性质。随机森林分别训练一系列的决策树,所以训练过程是并行的。因算法中加入随机过程,所以每个决策树又有少量区别。通过合并每个树的预测结果来减少预测的方差,提高在测试集上的性能表现。

二.代码逐行讲解

1.操作数据

        操作数据采用官网样例数据,sample_libsvm_data.txt,找不到的小伙伴可以去链接:【https://pan.baidu.com/s/1N-03piaEv9-KyrqNjnSyNA 密码:nqv7 】下载,数据格式:

------------------------------------------------------------------------------

label(分类标签 0/1) features(特征值的位置:特征值)

0 128:51 129:159 130:253 131:159 132:50 155:48 156:238 157:252 158:252 159:252 160:237

1 159:124 160:253 161:255 162:63 186:96 187:244 188:251 189:253 190:62 214:127 215:251 

---------------------------------------------------------------------------------

以第一条数据为例,标签为0 => (128位置对应的特征值=>51,129位置对应的特征值=>159。。。)

2.实例代码以及注释

1.创建DataFrame读取数据

val spark:SparkSession = .........

val data =spark.read.format("libsvm").load(dataPath) //返回是一个DataFrame对象

方便理解show一下(图1)

图1

ps:

    label  ===> 为读取的标签

    features ===>  692代表特征向量的个数,第一个中括号是特征向量的位置,第二个中括号是特征向量值。 (特征个数,【特征值位置】,【特征值】)

2. 整理标签和特征向量

2.1  StringIndexer函数 

val labelStringIndexer = new StringIndexer()

.setInputCol("label")

.setOutputCol("indexerLabel")

.fit(data)

        作用 : 整理字符串类型字段转化为标签索引,数量即为不重复标签种类,从0开始计数,到最大数量为止,顺序为数量多的在前,举个例子:

0 特征向量_1

1 特征向量_2

2 特征向量_3

1 特征向量_4

2 特征向量_5

2 特征向量_6

2 特征向量_7

一共有三种标签(0,1,2) 分别对应的数量(1,2,4)  得出 = > (2,1,0)

几个参数

.setInputCol("label") : 指定dataFrame中的转换字段

setOutputCol("indexerLabel")  : 设置输出的字段名

setHandleInvalid("skip")  : 如果测试样本中存在训练样本中没有的标签,默认处理方式是报错,添加此参数,即表示忽略该标签,不会报错。

------------------------------------------

2.2  VectorIndexer() 函数

val featuresVectorIndexer =new VectorIndexer()

.setInputCol("features").setOutputCol("indexerFeature")

.setMaxCategories(4)

  .fit(data)

作用 : 封装整理特征向量 

几个参数

.setInputCol("features").setOutputCol("indexerFeature") //输入输出字段名称

.setMaxCategories(4) // 同一特征向量不重复超过4个值,即被视为连续值。

setHandleInvalid("skip")   //效果同上

    3. 切分训练数据和测试数据

    val Array(trainingData, testData) =                                                                                          data.randomSplit(Array(0.6, 0.4))

将数据切分为两部分 trainingData(训练数据集)  ,testData(测试数据集合)

    4. 创建随机森林估计器

val rf =new RandomForestClassifier()

.setLabelCol("indexerLabel")

.setFeaturesCol("indexerFeature")

.setNumTrees(10)//10个决策树

    5. 创建标签复原转化器

val labelConverter =new IndexToString()

.setInputCol("prediction")

.setOutputCol("predictionLabel")

.setLabels(labelStringIndexer.labels)

作用 : 前面我们为了方便计算把标签进行了转换,预测之后我们要把标签翻转回原来的格式。

 6.创建pipeline管道

val pipeline =new Pipeline()

.setStages(

Array(

labelStringIndexer, //标签转换

featuresVectorIndexer, //特征向量转换

rf, //估计器---随机森林

labelConverter//标签反转

))

7.建立模型并通过模型对测试数据进行分类

val model = pipeline.fit(trainingData)  // 通过管道训练模型

val forecastResult = model.transform(testData) // 对测试数据进行预测

8.对结果准确性进行校验

val evaluator =new MulticlassClassificationEvaluator()

.setLabelCol("indexerLabel")//真实值

  .setPredictionCol("prediction")//预测值

 .setMetricName("accuracy")  //准确度检查

// 评估指标的类型(accuracy:准确度,预测正确个数/预测失败的个数)

// 默认值为 F1 : F1-Measure(精准率和召回率)

val accuracy:Double = evaluator.evaluate(forecastResult) // 返回正确率

3.完整代码

import org.apache.spark.ml.Pipeline

import org.apache.spark.ml.classification.RandomForestClassifier

import org.apache.spark.ml.evaluation.MulticlassClassificationEvaluator

import org.apache.spark.ml.feature.{IndexToString, StringIndexer, VectorIndexer}

val dataPath ="sample_libsvm_data.txt"

val data =ss.read.format("libsvm").load(dataPath)

val labelStringIndexer =new StringIndexer()

.setInputCol("label")

.setOutputCol("indexerLabel")

.fit(data)

val featuresVectorIndexer =new VectorIndexer()

.setInputCol("features").setOutputCol("indexerFeature")

.setMaxCategories(4)// 同一特征向量不重复超过4个值,即被视为连续值。

  .fit(data)

// 数据切割

val Array(trainingData, testData) = data.randomSplit(Array(0.6, 0.4))

//创建随机森林

val rf =new RandomForestClassifier()

.setLabelCol("indexerLabel")

.setFeaturesCol("indexerFeature")

.setNumTrees(10)//10个决策树

val labelConverter =new IndexToString()

.setInputCol("prediction")

.setOutputCol("predictionLabel")

.setLabels(labelStringIndexer.labels)

val pipeline =new Pipeline()

.setStages(Array(labelStringIndexer, featuresVectorIndexer, rf, labelConverter))

val model = pipeline.fit(trainingData)

val forecastResult = model.transform(testData)

//    forecastResult.show()

val evaluator =new MulticlassClassificationEvaluator()

.setLabelCol("indexerLabel")//真实值

  .setPredictionCol("prediction")//预测值

// 评估指标的类型(accuracy:准确度,预测正确个数/预测失败的个数) 默认值为 F1 : F1-Measure(

  .setMetricName("accuracy")

val accuracy:Double = evaluator.evaluate(forecastResult)

println(s"预测错误率:${(1 - accuracy) *100} % ")

ss.stop()

相关文章

  • 1 . spark ml 随机森林练习代码讲解

    一,算法简介 随机森林是决策树的集成算法。随机森林包含多个决策树来降低过拟合的风险。随机森林同样具有易解释性、可处...

  • PySpark-ml-随机森林

    内容摘入自< > 附书源码下载地址[https://github.com/Shadow-Hunter-X/pyth...

  • ML三大神器与Logistic回归

    先占个坑~~~~~~~~~~~~~~~~~~ Logistic回归 ML三大神器 随机森林(Random Fore...

  • 随机森林代码实践

    从树到森林 示例文件下载地址:http://archive.ics.uci.edu/ml/machine-lear...

  • CS190 Scalable Machine Learning

    spark ML 参考文档: Apache SparkSpark's Python APIPython Spark...

  • spark-mongodb简单上手

    Spark提供的所有计算,不管是批处理,Spark SQL,Spark Streaming还是Spark ML,它...

  • 随机森林-Python

    这里随机森林分类器的预测可视化与决策树差不多,因为随机森林就是决策树投票得到的结果。代码: 关键代码:plt.sc...

  • Python机器学习之随机森林

    引言  随机森林的原理网上有一大堆,作为入门小白,下面来根据教材敲两个随机森林的代码。随机森林有两个比较重要的参数...

  • Spark ML

    MLLIB 包是基于RDD操作ML包是基于DataFrame操作的 ML包主要分成三个部分: 转换器 评估器 管道...

  • Spark核心编程:Spark基本工作原理与RDD

    Spark核心编程:Spark基本工作原理与RDD Spark基本工作原理 画图讲解Spark的基本工作原理1、分...

网友评论

      本文标题:1 . spark ml 随机森林练习代码讲解

      本文链接:https://www.haomeiwen.com/subject/wonwgqtx.html