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

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

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

目录

一、决策树

什么是决策树

spark决策树

二、示例代码

完整代码

方法解析

代码效果

代码输出

拓展-spark决策树


一、决策树

什么是决策树

决策树模型

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

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

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

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

spark决策树

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

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

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

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

二、示例代码

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

完整代码

Scala 复制代码
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数据集,设置上述参数进行训练
相关推荐
Lossya3 小时前
【机器学习】参数学习的基本概念以及贝叶斯网络的参数学习和马尔可夫随机场的参数学习
人工智能·学习·机器学习·贝叶斯网络·马尔科夫随机场·参数学习
Trouvaille ~3 小时前
【Python篇】深度探索NumPy(下篇):从科学计算到机器学习的高效实战技巧
图像处理·python·机器学习·numpy·信号处理·时间序列分析·科学计算
勤劳兔码农5 小时前
文本分类实战项目:如何使用NLP构建情感分析模型
自然语言处理·分类·数据挖掘
qq_550337996 小时前
研1日记14
人工智能·深度学习·机器学习
i嗑盐の小F6 小时前
【IEEE&ACM Fellow、CCF组委】第三届人工智能与智能信息处理国际学术会议(AIIIP 2024)
人工智能·深度学习·算法·机器学习·自然语言处理·信号处理
xuehaisj8 小时前
论文内容分类与检测系统源码分享
人工智能·分类·数据挖掘
大耳朵爱学习8 小时前
大模型预训练的降本增效之路——从信息密度出发
人工智能·深度学习·机器学习·自然语言处理·大模型·llm·大语言模型
FOUR_A9 小时前
【机器学习导引】ch2-模型评估与选择
人工智能·机器学习
geekrabbit10 小时前
机器学习和深度学习的区别
运维·人工智能·深度学习·机器学习·浪浪云
不良人龍木木11 小时前
机器学习-聚类算法
算法·机器学习·聚类