大数据分析(随机森林)
什么是随机森林
随机森林是多个决策树集成算法,树多了也就成了森林,随机森林包含多个决策树来降低过拟合, 那随机2字又该怎么解释呢??
随机体现在:
- 每次迭代时,对原始数据进行二次抽样来获得不同的训练数据。
- 对于每个树节点,考虑不同的随机特征子集来进行分裂。
spark代码实现
spark.ml支持二分类、多分类以及回归的随机森林算法
数据采用 spark和scala版本如下
接下来就开始写代码了
减少日志输出和构建SparkSession环境
Logger.getLogger("org").setLevel(Level.ERROR) val session: SparkSession = SparkSession.builder().master("local[*]") .appName("RandomForest") .getOrCreate()
读取数据集转换格式
val source: DataFrame = session.read.text("iris\iris.data") val data: DataFrame = source .map((_: Row).toString().split(",")) .map( (row: Array[String]) => (Vectors.dense(row(2).toDouble, row(3).toDouble),row(4).replace("]",""))) .toDF("features", "label")
使用索引器对数据进行转换
val indexedLabel: StringIndexerModel = new StringIndexer().setInputCol("label").setOutputCol("indexedLabel") .fit(data) val indexedFeatures: VectorIndexerModel = new VectorIndexer().setInputCol("features").setOutputCol("indexedFeatures") .fit(data)
数据随机切分(分的数量有些许偏差)
// 7分训练 3分测试 val Array(training, test) = data.randomSplit(Array(0.7, 0.3))
构建随机森林分类器
// 随机森林分类器 val classifier: RandomForestClassifier = new RandomForestClassifier() .setLabelCol("indexedLabel") .setFeaturesCol("indexedFeatures") .setMaxDepth(5) .setNumTrees(20) .setMaxBins(32)
对预测的结果转换成标签
val labelConverter: IndexToString = new IndexToString(). setInputCol("prediction"). setOutputCol("predictedLabel"). setLabels(indexedLabel.labels)
使用pipline构建模型,对7分数据进行训练,三分数据进行测试
val pipeline: Pipeline = new Pipeline() .setStages(Array(indexedLabel, indexedFeatures, classifier, labelConverter)) val model: PipelineModel = pipeline.fit(training) val predictions: DataFrame = model.transform(test)
输出观察一下预测结果
predictions.select("indexedLabel","prediction").show(150)
我们可以使用多分类评估器对我们的模型进行评估
val evaluator: MulticlassClassificationEvaluator = new MulticlassClassificationEvaluator() .setLabelCol("indexedLabel") .setPredictionCol("prediction") .setMetricName("accuracy") val d: Double = evaluator.evaluate(predictions) println(s"正确率:${ d}--错误:${ 1 - d}")
正确率:0.9333333333333333--错误:0.06666666666666665
可以看出,我们的模型预测正确率已经非常高了
到此,随机森林的简单使用已经完成
上一篇:
JS实现多线程数据分片下载
下一篇:
浅谈当下火热的ChatGPT