0


Spark-机器学习(7)分类学习之决策树

在之前的文章中,我们学习了分类学习之支持向量机,并带来简单案例,学习用法。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。

Spark-机器学习(6)分类学习之支持向量机-CSDN博客文章浏览阅读1.5k次,点赞28次,收藏25次。今天的文章,我们来学习分类学习之支持向量机,并带来简单案例,学习用法。希望大家能有所收获。同时,希望我的文章能帮助到每一个正在学习的你们。也欢迎大家来我的文章下交流讨论,共同进步。https://blog.csdn.net/qq_49513817/article/details/138260328今天的文章,我们来学习分类学习之决策树,并带来简单案例,学习用法。希望大家能有所收获。

一、决策树

什么是决策树

决策树模型

决策树是一种基本的分类与回归方法。它主要被用于分类问题,但也可以用于回归问题。决策树模型呈树形结构,其中每个内部节点表示一个属性上的判断条件,每个分支代表一个判断条件的输出,每个叶节点代表一个类别。

决策树学习的目的是根据给定的训练数据集构建一个决策树模型,以便能够对新样本进行正确的分类。决策树学习通常包括三个步骤:特征选择、决策树的生成和决策树的剪枝。

  1. 特征选择:选择对训练数据具有分类能力的特征。特征选择的目的是决定用哪个特征来划分空间。常用的选择准则有信息增益、增益率和基尼指数。
  2. 决策树的生成:基于特征选择的结果,递归地构建决策树。从根节点开始,对每个特征进行测试,根据测试结果将样本分配到子节点,直到满足停止条件(例如,所有样本属于同一类,或没有剩余特征可用)为止。
  3. 决策树的剪枝:为了避免过拟合,通常需要对决策树进行剪枝。剪枝的主要目的是简化模型,提高模型的泛化能力。剪枝可以通过预剪枝(在决策树生成过程中进行剪枝)或后剪枝(在决策树生成完成后进行剪枝)来实现。

决策树具有直观、易于理解和实现的优点。然而,它也可能导致过拟合,特别是在处理具有复杂关系的数据集时。此外,决策树对输入数据的预处理(如缺失值和异常值的处理)和参数设置(如停止条件和剪枝策略)也比较敏感。

spark决策树

Spark决策树是Apache Spark MLlib库中提供的一种机器学习算法,用于分类和回归问题。Spark决策树基于传统的决策树算法,并结合了Spark的分布式计算能力,以处理大规模数据集。

Spark决策树在构建过程中,通过递归地将数据集分割成子集来创建树形结构。每个内部节点代表一个特征上的判断条件,根据该条件将数据集划分为不同的子集,并分配给子节点。这个过程一直进行到满足停止条件为止,例如所有样本属于同一类或者没有剩余特征可用。

Spark决策树支持多种特征选择准则,如信息增益、增益率和基尼指数,以便根据数据的特性选择最合适的划分策略。同时,为了防止过拟合,Spark决策树也提供了剪枝机制,可以在决策树生成过程中或生成完成后进行剪枝。

由于Spark的分布式计算能力,Spark决策树可以有效地处理大规模数据集,并且具有良好的扩展性。这使得它成为处理大规模机器学习问题的一种有效方法。

二、示例代码

下面的示例代码的主要作用是训练一个决策树分类模型 ,通过直接在程序中模拟数据来达到我们展示一个决策树的过程,仅作为学习阶段的示例。在工作中,数据往往庞大而复杂,需要我们花费更长的时间来处理数据和优化模型。

完整代码

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.ml.Pipeline
import org.apache.spark.ml.classification.DecisionTreeClassifier
import org.apache.spark.ml.evaluation.MulticlassClassificationEvaluator
import org.apache.spark.ml.feature.{StringIndexer, VectorAssembler}
import org.apache.spark.sql.SparkSession
object p7{
  def main(args: Array[String]): Unit = {
    // 初始化Spark  
    val conf = new SparkConf().setAppName("Peng0426.").setMaster("local[*]")
    val sc = new SparkContext(conf)
    val spark = SparkSession.builder().appName("SimpleDecisionTreeExample").getOrCreate()
    import spark.implicits._
    // 创建模拟数据  
    val data = Seq(
      (1.0, 0.0, "A"), (1.5, 1.0, "A"), (5.0, 5.0, "B"), (5.0, 8.0, "B"), (1.0, 4.0, "A"), (1.5, 1.0, "A"), (5.5, 5.0, "B"), (8.0, 7.0, "B"), (1.0, 0.0, "A"), (2.5, 1.0, "A"), (5.5, 5.0, "B"), (8.0, 6.0, "B"),
    ).toDF("feature1", "feature2", "label")
    // 将标签列从字符串类型转换为数值类型  
    val labelIndexer = new StringIndexer()
      .setInputCol("label")
      .setOutputCol("indexedLabel")
      .fit(data)
    // 将特征列组合成一个特征向量  
    val assembler = new VectorAssembler()
      .setInputCols(Array("feature1", "feature2"))
      .setOutputCol("features")
    // 创建决策树分类器  
    val dt = new DecisionTreeClassifier()
      .setLabelCol("indexedLabel")
      .setFeaturesCol("features")
    // 创建管道  
    val pipeline = new Pipeline()
      .setStages(Array(labelIndexer, assembler, dt))
    // 将数据划分为训练集和测试集  
    val Array(trainingData, testData) = data.randomSplit(Array(0.7, 0.3))
    // 训练模型  
    val model = pipeline.fit(trainingData)
    // 预测测试集  
    val predictions = model.transform(testData)
    //计算测试误差
    val evaluator = new MulticlassClassificationEvaluator()
      .setLabelCol("indexedLabel")
      .setPredictionCol("prediction")
      .setMetricName("accuracy")
    val accuracy = evaluator.evaluate(predictions)
    println(s"Test Accuracy = $accuracy")
  }
}

方法解析

  • SparkConf 和 SparkContext: 用于初始化Spark应用程序的配置和上下文。
  • SparkSession: 是Spark 2.0及以上版本中引入的新概念,用于替代SparkContext来创建DataFrame、Dataset和读取数据。
  • Pipeline: 在Spark ML中,Pipeline是一个用于组合多个转换步骤(如特征转换、模型训练等)的框架。
  • StringIndexer: 用于将字符串类型的标签列转换为数值类型,以便用于机器学习模型。
  • VectorAssembler: 将多个特征列组合成一个特征向量,这通常是机器学习模型所需要的输入格式。
  • DecisionTreeClassifier: 决策树分类器,用于训练决策树模型。
  • MulticlassClassificationEvaluator: 用于评估多分类模型性能的评估器。
  • DataFrame API: Spark的DataFrame API用于处理结构化数据。

代码效果

  • 初始化Spark: 通过设置SparkConfSparkSession来初始化Spark应用程序。
  • 创建模拟数据: 创建一个包含两个特征列和一个标签列的DataFrame。
  • 数据预处理: 使用StringIndexerVectorAssembler进行数据预处理,将标签转换为数值类型,并将特征组合成特征向量。
  • 构建模型管道: 使用Pipeline将预处理步骤和决策树分类器组合在一起。
  • 划分数据集: 将数据随机划分为训练集和测试集。
  • 训练模型: 使用训练数据拟合管道,从而训练决策树模型。
  • 预测和评估: 对测试集进行预测,并使用MulticlassClassificationEvaluator计算准确率。

代码输出

这段代码最后会输出我们的测试集的准确率,这个值表示模型在测试集上的预测准确率。现在运行代码来看看输出的是多少。

可以看到运行代码后得到了1.0。Accuracy的值只会在0到1之间,越接近1代表我们的模型分类的效果越强,但是我这里的1.0是基于数据集特小,数据不复杂的情况下,在真实的环境中往往很难达到。在实际应用中,我们只需要努力将模型的Accuracy值接近1.0即可。

拓展-spark决策树

关键字描述例子特征列(featuresCol)指定输入数据中的特征列名featuresCol="features"标签列(labelCol)指定输入数据中的标签列名labelCol="label"不纯度度量(impurity)选择不纯度度量方式,如基尼不纯度或熵impurity="gini"最大深度(maxDepth)设置决策树的最大深度maxDepth=5最小信息增益(minInfoGain)设置分裂节点时所需的最小信息增益minInfoGain=0.01最小实例数(minInstancesPerNode)设置分裂后每个节点至少包含的实例数量minInstancesPerNode=2预测列(predictionCol)指定输出数据中的预测结果列名predictionCol="prediction"概率列(probabilityCol)指定输出数据中的类别概率预测结果列名probabilityCol="probability"阈值(thresholds)用于多分类问题的阈值设置thresholds=[0.3, 0.7]示例数据集使用iris数据集进行分类任务加载iris数据集,设置上述参数进行训练


本文转载自: https://blog.csdn.net/qq_49513817/article/details/138294454
版权归原作者 Peng0426. 所有, 如有侵权,请联系我们删除。

“Spark-机器学习(7)分类学习之决策树”的评论:

还没有评论