赞
踩
本文紧接上文的随机森林分类器模型,实践的同样是分类算法模型,随机森林模型和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分类模型实现如下:
- #!usr/bin/env python
- #encoding:utf-8
- from __future__ import division
-
-
- '''
- __Author__:沂水寒城
- 功能: pyspark 机器学习实践之【GBDT分类器模型】
- '''
-
-
-
- import findspark
- findspark.init()
- import pyspark
- from pyspark import SparkConf
- from pyspark.ml import Pipeline
- from pyspark.context import SparkContext
- from pyspark.sql.session import SparkSession
- from pyspark.ml.classification import DecisionTreeClassifier
- from pyspark.ml.evaluation import MulticlassClassificationEvaluator
- from pyspark.ml.feature import StringIndexer, VectorIndexer,IndexToString
-
-
-
- conf=SparkConf().setAppName('MLDemo')
- sc = SparkContext('local')
- spark = SparkSession(sc)
-
-
- def gradientBoostedTreeClassifier(data="mllib/sample_libsvm_data.txt"):
- '''
- GBDT分类器
- '''
- #加载LIBSVM格式的数据集
- data = spark.read.format("libsvm").load(data)
- labelIndexer = StringIndexer(inputCol="label", outputCol="indexedLabel").fit(data)
- #自动识别类别特征并构建索引,指定maxCategories,因此具有> 4个不同值的特征被视为连续的
- featureIndexer=VectorIndexer(inputCol="features", outputCol="indexedFeatures", maxCategories=4).fit(data)
- #训练集、测试集划分
- (trainingData, testData) = data.randomSplit([0.7, 0.3])
- gbt = GBTClassifier(labelCol="indexedLabel", featuresCol="indexedFeatures", maxIter=10)
- pipeline = Pipeline(stages=[labelIndexer, featureIndexer, gbt])
- model = pipeline.fit(trainingData)
- predictions = model.transform(testData)
- #展示前5行数据
- predictions.select("prediction", "indexedLabel", "features").show(5)
- #展示预测标签与真实标签,计算测试误差
- evaluator = MulticlassClassificationEvaluator(
- labelCol="indexedLabel", predictionCol="prediction", metricName="accuracy")
- accuracy = evaluator.evaluate(predictions)
- print("Test Error = %g" % (1.0 - accuracy))
- gbtModel = model.stages[2]
- print('gbtModelSummary: ',gbtModel) #模型摘要
-
-
- if __name__=='__main__':
- gradientBoostedTreeClassifier(data="mllib/sample_libsvm_data.txt")
结果输出如下:
从测试结果的错误率来看结果是非常好的,由于上文中的随机森林模型,在实际的工作使用中,经常的一个现象就是经过参数的优化处理后GBDT模型往往效果是由于随机森林的,这个可能也跟模型的构建策略有比较密切的关系。上面的GBDT模型中一共使用了10个基分类器模型效果就已经很好了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。