当前位置:   article > 正文

pyspark分类算法之梯度提升决策树分类器模型GBDT实践【gradientBoostedTreeClassifier】_梯度提升分类器

梯度提升分类器

        本文紧接上文的随机森林分类器模型,实践的同样是分类算法模型,随机森林模型和GBDT模型是机器学习领域里面非常重要的两种集成学习模型,两种模型虽然均采用了集成策略来进一步提升基分类器模型的性能,但是本质上是有区别的,前者采用并行的训练方式,后者采用的是串行的训练方式。

      同样,下面贴一下自己学习pyspark以来的记录笔记,具体如下:

       pyspark顾名思义就是由python和spark组合使用的。Spark提供了一个Python_Shell,即pyspark,从而可以以交互的方式使用Python编写Spark程序。有关Spark的基本架构以及pyspark环境配置相关的内容本篇博客就不再多加阐述了,网络上也有很多不错的讲解。

      pyspark里最核心的模块是SparkContext(简称sc),最重要的数据载体是RDD。RDD就像一个NumPy array或者一个Pandas Series,可以视作一个有序的item集合。只不过这些item并不存在driver端的内存里,而是被分割成很多个partitions,每个partition的数据存在集群的executor的内存中。parkSession是Spark 2.0引入的新概念。SparkSession为用户提供了统一的切入点,来让用户学习spark的各项功能。 在spark的早期版本中,SparkContext是spark的主要切入点,由于RDD是主要的API,我们通过sparkcontext来创建和操作RDD。对于每个其他的API,我们需要使用不同的context。例如,对于Streming,我们需要使用StreamingContext;对于sql,使用sqlContext;对于hive,使用hiveContext。但是随着DataSet和DataFrame的API逐渐成为标准的API,就需要为他们建立接入点。所以在spark2.0中,引入SparkSession作为DataSet和DataFrame API的切入点。SparkSession实质上是SQLContext和HiveContext的组合(未来可能还会加上StreamingContext),所以在SQLContext和HiveContext上可用的API在SparkSession上同样是可以使用的。SparkSession内部封装了SparkContext,所以计算实际上是由SparkContext完成的。
        任何Spark应用程序都会分离主节点上的单个驱动进程(包含若干个作业 ),然后将执行进程(包含若干个任务)分配给多个工作节点。驱动进程会确定任务进程的数量和组成,然后任务进程根据DAG(有向无环图)调度器的依赖关系将任务分配给执行节点。RDD(弹性分布式数据集,Resilient Distributed Datasets)是Spark中的抽象数据结构类型,任何数据在Spark中都被表示为RDD。RDD提供了一种高度受限的共享内存模型,即RDD是只读的记录分区的集合,只能通过在其他RDD执行确定的转换操作(如map、join和group by)而创建,其本质是不可变Java虚拟机(JVM)对象的分布式集合。在PySpark中,Python数据就是存储在这些JVM对象中的。

       接下来回归正题,基于pyspark的GBDT分类模型实现如下:

  1. #!usr/bin/env python
  2. #encoding:utf-8
  3. from __future__ import division
  4. '''
  5. __Author__:沂水寒城
  6. 功能: pyspark 机器学习实践之【GBDT分类器模型】
  7. '''
  8. import findspark
  9. findspark.init()
  10. import pyspark
  11. from pyspark import SparkConf
  12. from pyspark.ml import Pipeline
  13. from pyspark.context import SparkContext
  14. from pyspark.sql.session import SparkSession
  15. from pyspark.ml.classification import DecisionTreeClassifier
  16. from pyspark.ml.evaluation import MulticlassClassificationEvaluator
  17. from pyspark.ml.feature import StringIndexer, VectorIndexer,IndexToString
  18. conf=SparkConf().setAppName('MLDemo')
  19. sc = SparkContext('local')
  20. spark = SparkSession(sc)
  21. def gradientBoostedTreeClassifier(data="mllib/sample_libsvm_data.txt"):
  22. '''
  23. GBDT分类器
  24. '''
  25. #加载LIBSVM格式的数据集
  26. data = spark.read.format("libsvm").load(data)
  27. labelIndexer = StringIndexer(inputCol="label", outputCol="indexedLabel").fit(data)
  28. #自动识别类别特征并构建索引,指定maxCategories,因此具有> 4个不同值的特征被视为连续的
  29. featureIndexer=VectorIndexer(inputCol="features", outputCol="indexedFeatures", maxCategories=4).fit(data)
  30. #训练集、测试集划分
  31. (trainingData, testData) = data.randomSplit([0.7, 0.3])
  32. gbt = GBTClassifier(labelCol="indexedLabel", featuresCol="indexedFeatures", maxIter=10)
  33. pipeline = Pipeline(stages=[labelIndexer, featureIndexer, gbt])
  34. model = pipeline.fit(trainingData)
  35. predictions = model.transform(testData)
  36. #展示前5行数据
  37. predictions.select("prediction", "indexedLabel", "features").show(5)
  38. #展示预测标签与真实标签,计算测试误差
  39. evaluator = MulticlassClassificationEvaluator(
  40. labelCol="indexedLabel", predictionCol="prediction", metricName="accuracy")
  41. accuracy = evaluator.evaluate(predictions)
  42. print("Test Error = %g" % (1.0 - accuracy))
  43. gbtModel = model.stages[2]
  44. print('gbtModelSummary: ',gbtModel) #模型摘要
  45. if __name__=='__main__':
  46. gradientBoostedTreeClassifier(data="mllib/sample_libsvm_data.txt")

         结果输出如下:

     从测试结果的错误率来看结果是非常好的,由于上文中的随机森林模型,在实际的工作使用中,经常的一个现象就是经过参数的优化处理后GBDT模型往往效果是由于随机森林的,这个可能也跟模型的构建策略有比较密切的关系。上面的GBDT模型中一共使用了10个基分类器模型效果就已经很好了。

 


 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/547233
推荐阅读
相关标签
  

闽ICP备14008679号