Spark 数据挖掘 - 利用决策树预测森林覆盖类型

http://my.oschina.net/u/1244232/blog/525145

摘要  Spark 数据挖掘 利用决策树预测森林覆盖类型

Spark 数据挖掘—利用决策树预测森林覆盖类型

1 前言

预测问题记住一点:最垃圾的预测就是使用平均值,如果你的预测连比直接给出平均值效果都要差,那就省省吧!
统计学诞生一个多世纪之后,随着现在机器学习和数据科学的产生,我们依旧使用回归的思想来进行预测,尽管回归 就是用平均值向后不断回滚来预测。回归的技术和分类的技术紧密相关。通常情况下,当目标变量是连续数值时指的是回归,例如预测 身高和体重。当预测的目标变量是名义或者说是类别变量时,指的就是分类,例如预测邮件是否是垃圾邮件。
无论是分类还是回归,都需要给定已知信息去预测未知信息,所以它们都需要从输入输出来学习。它们需要包括问题和答案。这类算法因此也称为监督学习的方法。
回归和分类是使用年代最近研究的最充分的预测分析技术。很多算法开源包都包含通用的这些方法。比如:支持向量机,逻辑回归,朴素贝叶斯,神经网络和深度学习。
本文的重点是讨论:决策树和它的扩展随机森林。决策树是通用而且灵活的分类回归算法。

2 一些基本概念

注意:特别小心分类变量(尤其是那些用数字表示的分类变量,不要随便放到算法中去训练)和数值变量
注意:不是所有的算法都能处理分类变量,或者都能处理回归分类问题,但是放心决策树都可以

3 算法简介

决策树

   
算法名字决策树,DT,Decision Trees
算法描述适合任何数据类型的分类和回归算法 关键概念:树、信息增益、停止条件、过拟合
算法原理根据已有样本训练得到一颗树,树的叶子节点就是预测的值,新的样本将按照样本的值遍历树的相对应节点最后到达叶子节点,叶子节点的值就是新样本的预测值。<br/> 决策树原理非常简单,如下图:<br/> 决策树示例图
使用场景强大的算法,适合回归和预测的很多场合
算法优缺点优点: 1. 能够自然处理分类和数值特征 2. 容易并行计算 3. 对异常值具有很好的鲁棒性(意味着小量的异常值或者错误数据不影响分类结果) 4. 可以处理不同类型和不同维度的数据不需要数据预处理或者预先正则化数据 5. 结果容易理解和解释<br />缺点: 1. 容易过拟合(不过它的变种随机森林已经改进了这个问题)
数据类型数值型和标称型数据
参考资料1. 算法原理 机器学习实战 <br /> 2. MLlib实现 DesisionTree<br /> 3. MLlib实现 RandomForest

4 数据集

本文将使用著名的 Covtype 数据集合,可以在 http://bit.ly/1KiJRfg 这里下载。下载之后是一个压缩的 csv 文件, linux 用户可以用命令:tar -xzvf 解压缩,windows用户可以使用 .7-zip 解压缩,同时下载数据集的描述文件 covtype.info 数据集记录的是美国 Colorado 植被覆盖类型数据,也是唯一一个关心真实森林的数据。每条记录都包含很多指标描述每一块土地。 例如:高度、坡度、到水的距离、树荫下的面积、土壤的类型等等。森林的覆盖类型是需要根据其他54个特征进行预测的特征。 这是一个有趣的数据集,它包含分类和数值特征。总共有581012条记录。每条记录有55列,其中一列是土壤的类型,其他54列是输入特征。 虽然这个数据集还不能算得上真正的大数据,但是也能说明很多问题。很幸运,这个数据集已经是csv文件,所以不需要太多的数据清洗或者其他的准备就可以给 Spark Mllib 使用。 数据集可上传到 HDFS,当然也可以先放到本地进行这个有趣的测试。不管哪种方式,Spark 都只需要改变一两个参数。 这里不得不再次提醒一个问题,分类变量如何编码,下面是编码的方式:

  • 一个合适的编码方式是:one-hot 或者 1 of n 编码 一个分类变量:编码为 n(分类特征个数)个变量
  • 另一种编码方式:就是给每个值一个固定的数字,例如: 1, 2, 3, ..., n

当算法中把编码当作数字的时候只能使用第一种编码,第二种编码会得出滑稽的结果。具体原因是没有大小的东西被强制成有大小之分。
Covtype 数据集中有很多类型的特征,不过很幸运,它已经帮我们转换成 one-hot 形势,具体来说:

  • 11到14列,其实表示的是 Wilderness_Area,Wilderness_Area 本身有 4 个类别
  • 15到54列,其实表示的是 Soil_Type,Soil_Type 本身有 40个属性值
  • 55列是表示目标值,当然它不需要表示成为 one-hot形式。

这个数据集每一列的变量单位都不一定相同,有的表示距离,有的表示度数等等

5 Spark 决策树模型

下面给出一个初步的利用Spark MLlib 实验的决策树模型,具体的意图,代码都有详细的注释:

  //本地测试
  val rootDir = "your sample data directory"
  def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("SparkInAction").setMaster("local[4]")
    val sc = new SparkContext(conf)
    val covTypeData = sc.textFile(rootDir + "/covtype.data")
    val data = dataPrepare(covTypeData)
    //选择测试集合和训练集合
    val Array(train, cvData, test) =
      data.randomSplit(Array(0.8, 0.1, 0.1))
    train.cache()
    cvData.cache()
    test.cache()

    val model = buildDecisionTree(train, cvData)
  }


  /**
   * Spark MLlib 表示特征向量的对象是 LabeledPoint
   * 这个对象由表示特征的向量和目标变量组成
   */
  def dataPrepare(data: RDD[String]) = {
    val sample = data.map{
      line =>
        //全部数据转化为 double
        val array = line.split(",").map(_.toDouble)
        //前面54列是特征向量,后面一列是目标变量 label
        val featureVector = Vectors.dense(array.init)
        //决策树目标变量必须从0开始,按照1递增
        LabeledPoint(array.last - 1, featureVector)
    }
    sample
  }

  /**
   * 决策树模型建立,这里很容易改进为十择交叉验证。
   * 对每一份数据建立模型时,都需要随机选出部分数据来调整模型参数到最优。
   * 通过交叉验证的方式调整参数。
   * @param train
   * @param cvData
   */
  def buildDecisionTree(train: RDD[LabeledPoint], cvData: RDD[LabeledPoint]) = {
    def getMetrics(model: DecisionTreeModel, data: RDD[LabeledPoint]) = {
      val predictionsAndLabels = data.map {
        example =>
          (model.predict(example.features), example.label)
      }
      new MulticlassMetrics(predictionsAndLabels)
    }
    val model = DecisionTree.trainClassifier(
      train, 7, Map[Int, Int](), "gini", 4, 100
    )
    val matrics = getMetrics(model, cvData)
    println(matrics.confusionMatrix)
    (0 until 7).map(
      cat => (matrics.precision(cat), matrics.recall(cat))
    ).foreach(println)
  }

这个是初步的运行结果:

#整体的准确率和召回率
(0.7012384971978136,0.7012384971978136)
#每一个类别的准确率和召回率
(0.685108051158916,0.6668097486526446)
(0.7255299659774928,0.7930627570177007)
(0.6194455768446799,0.8685338668190912)
(0.3771043771043771,0.39436619718309857)
(0.55,0.011727078891257996)
(0.0,0.0)
(0.7174657534246576,0.4134188455846078)

70%的准确率和召回率似乎效果还不错,但是我们现在不能盲目的认为我们的效果就真的不错了,有时候瞎猜效果也会不错。 例如:70%的数据属于类别1,每次都猜测类别是1,那么效果也能达到70%的准确率,下面我们确定一下瞎猜的准确率: 回答瞎猜猜对的概率,这个问题也不是简单的,回到概率论课堂上,在训练样本每类概率已知的情况下,测试样本瞎猜对的概率有多大呢? 随机给出一个样本:猜测类A的概率是由训练样本决定的,同时猜对的概率是由测试样本决定的,所以瞎猜猜对的概率是训练样本每类的概率分别 乘以测试样本对应类的概率之和

 /**
   * 获取模型瞎猜的概率
   * @param train 测试数据集
   * @param cvData 验证数据集
   */
  def guessProb(train: RDD[LabeledPoint], cvData: RDD[LabeledPoint]) {
    /**
     * 返回数据集合中,每一个类别的概率
     * @param data 训练数据集
     */
    def labelProb(data: RDD[LabeledPoint]): Array[Double] = {
      val labelCnt = data.map(_.label).countByValue()
      val labelProb = labelCnt.toArray.sortBy(_._1).map(_._2)
      labelProb.map(_.toDouble/labelProb.sum)
    }

    val trainProb = labelProb(train)
    val cvProb = labelProb(cvData)
    val prob = trainProb.zip(cvProb).map {
      case (a, b) => a * b
    }.sum
    println(prob)
  }

可以看到瞎猜的结果只有:0.3771281350885772 的准确率。说明70%的准确率效果确实不错,但是请注意,我们还没有优化参数, 说明我们的模型还有优化的空间。

6 决策树参数选择

主要的参数有下面几个:

  • Maximum Depth: 决策树树的最大深度,控制深度防止过拟合
  • 决策树训练算法迭代最大次数
  • 纯度测量算法 Gini Entropy (Gini纯度和熵) 通过反复查看不同参数模型评估效果,下面给出测试代码:
 /**
  * 模型评估
  * @param trainData 训练数据
  * @param cvData 交叉验证数据
  */
 def evaluate(trainData: RDD[LabeledPoint], cvData: RDD[LabeledPoint]): Unit = {
   val evaluations =
     for (impurity <- Array("gini", "entropy");
          depth <- Array(1, 20);
          bins <- Array(10, 300))
       yield {
         val model = DecisionTree.trainClassifier(
           trainData, 7, Map[Int,Int](), impurity, depth, bins)
         val predictionsAndLabels = cvData.map(example =>
           (model.predict(example.features), example.label)
         )
         val accuracy =
           new MulticlassMetrics(predictionsAndLabels).precision
         ((impurity, depth, bins), accuracy)
       }
   evaluations.sortBy(_._2).reverse.foreach(println)
 }
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 非常感谢您的提问。关于数据挖掘工具Spark的使用练习,我可以给您一些简单的介绍。 Spark是一种基于内存的分布式计算框架,可以用于大规模数据处理和分析。它提供了许多机器学习算法的实现,包括分类、回归、聚类、推荐等。在使用Spark进行机器学习时,可以使用其机器学习库MLlib。 为了练习Spark的机器学习功能,您可以选择一些数据集进行实验。例如,可以使用UCI机器学习库中的数据集,如鸢尾花数据集、波士顿房价数据集等。您可以使用Spark的API来读取这些数据集,并使用MLlib中的算法进行训练和预测。 在使用Spark进行机器学习时,需要注意一些问题。首先,需要对数据进行预处理,包括数据清洗、特征选择、特征缩放等。其次,需要选择合适的算法和参数,以达到最好的性能。最后,需要进行模型评估和调优,以提高模型的准确性和泛化能力。 希望这些信息对您有所帮助。如果您有其他问题,欢迎随时联系我。 ### 回答2: Spark是目前最流行,也是最强大的开源大数据处理框架之一,其在数据挖掘、机器学习等应用领域也有广泛的应用。本篇文章将深入探讨Spark中的机器学习工具——ml。 ml是Spark Machine Learning Library的简称,是Spark的核心机器学习API。它提供了一些基于分布式数据处理的机器学习算法,如线性回归、逻辑回归、决策树、随机森林、聚类等,以及各种数学工具和可视化工具。 首先我们需要了解一下Spark中机器学习的基本概念——管道。管道是一个机器学习工作流的逻辑组件,将数据流组装为一个完整的处理流程,并使得数据在流中顺序流动。Spark的管道API可以让机器学习工程师构建机器学习工作流的模型。同时,管道还具有容错性,可以在集群中处理海量数据,不容易出错。 首先我们来看一个管道的例子,该管道基于线性回归模型: 1.从数据源读入数据,如.csv、.parquet、.json文件或HDFS上的目录或数据源 2.对数据进行预处理,比如过滤、特征提取、缩放等 3.将预处理后的数据集拆分成训练、验证和测试三部分 4.使用管道API中提供的机器学习算法进行模型训练 5.使用验证集对模型进行验证 6.使用测试集对模型进行测试 7.对模型进行调优,提高其预测准确性 如果您对机器学习算法比较熟悉,那么通过Spark的ml库能够更加方便地构建机器学习管道。在这里,我们将介绍几个ml库中的常用算法。 首先是线性回归算法。线性回归是一种用于建立两种或两种以上变量之间的关系的统计学方法。尤其是当数据集显然是线性的时,它是一种常用的建模方法。在Spark的ml库中,线性回归可以通过LinearRegression类的方法进行训练和预测。例如: from pyspark.ml.regression import LinearRegression training = spark.read.format("libsvm").load("data/mllib/sample_linear_regression_data.txt") lr = LinearRegression(maxIter=10, regParam=0.3, elasticNetParam=0.6) # Fit the model lrModel = lr.fit(training) # Print the coefficients and intercept for linear regression print("Coefficients: %s" % str(lrModel.coefficients)) print("Intercept: %s" % str(lrModel.intercept)) 同样,逻辑回归是另一种常见的机器学习算法,其可用于二分类或多分类问题。在Spark的ml库中,逻辑回归的实现可以通过LogisticRegression类。例如: from pyspark.ml.classification import LogisticRegression training = spark.read.format("libsvm").load("data/mllib/sample_libsvm_data.txt") lr = LogisticRegression(maxIter=10, regParam=0.3, elasticNetParam=0.8) # Fit the model lrModel = lr.fit(training) # Print the coefficients and intercept for logistic regression print("Coefficients: %s" % str(lrModel.coefficients)) print("Intercept: %s" % str(lrModel.intercept)) 三、随机森林。随机森林是一个使用多个决策树进行分类或回归的集合算法。在Spark的ml库中,随机森林的实现可以通过RandomForestClassifier和RandomForestRegressor类。例如: from pyspark.ml.classification import RandomForestClassifier training = spark.read.format("libsvm").load("data/mllib/sample_libsvm_data.txt") rf = RandomForestClassifier(numTrees=10, maxDepth=5, seed=42) model = rf.fit(training) 输入数据通常都是高维的,管道工具也提供了gemetries变换的API,其中包括提取特征和转换特征向量。这些工具可以很方便地将数据转换为矩阵进行机器学习。使用特征转换器,我们可以创建一个用于管道的PipelineModel,用于数据预处理之后的机器学习模型预测。例如: from pyspark.ml.feature import PCA, VectorAssembler from pyspark.ml import Pipeline assembler = VectorAssembler(inputCols=["pca_features"], outputCol="features") pca = PCA(k=2, inputCol="features", outputCol="pca_features") pipeline = Pipeline(stages=[assembler, pca]) model = pipeline.fit(df) result = model.transform(df) print(result.select("features", "pca_features").show()) 总之,在Spark ml库中,提供了多种机器学习算法的实现工具,让我们只需要通过API即可完成机器学习流程。此外,Spark提高了算法的预测速度和准确性,并支持在分布式集群上进行机器学习,适用于处理大规模的数据集,并有效地处理各种任务。 ### 回答3: Spark是一个开源的基于内存计算的大数据处理框架,在数据挖掘领域也有着广泛的应用。MLlib是Spark的机器学习库,提供了大量可扩展的机器学习算法和工具。本次数据挖掘工具--Spark使用练习--ML(二)主要涉及如下内容: 1. 数据预处理 在机器学习任务中,数据预处理是非常重要的一步。Spark提供了一系列的数据处理API,例如读取数据、数据清洗、数据转换等。本次实践选择了UCI机器学习库中的Iris数据集,并使用Spark的API对数据进行了清洗和转换。 2. 特征提取 在机器学习建模过程中,特征提取是非常重要的一步。特征提取可以将原始数据转换成适合机器学习算法处理的形式。Spark提供了多种特征提取方法,例如TF-IDF、Word2Vec、PCA等。本次实践选择了PCA对数据进行了特征提取。 3. 模型训练和验证 Spark提供了多种机器学习算法,在本次实践中使用了K-Means聚类算法。K-Means是一种无监督学习算法,用于将数据分成K个不同的组。聚类算法的评估通常使用轮廓系数(Silhouette Coefficient)进行评估,在本次实践中也使用了该指标进行了模型的评估。 4. 模型应用 本次实践使用K-Means算法对Iris数据集进行了聚类分析,并将聚类结果进行了可视化展示。该实践展示了如何使用Spark的机器学习库进行数据挖掘和分析。 总之,通过本次实践学习,我们可以更深入地理解和掌握Spark数据挖掘领域的应用。在实践中需要注意的是,不同的机器学习算法适用于不同的数据集和问题,需要根据实际情况进行选择和应用。同时,也需要注意数据预处理和特征提取等环节对最终模型的影响。只有在充分理解和掌握这些基础知识的基础上,才能进行更加高效、准确和实用的数据挖掘工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值