pyspark分类算法之决策树分类器模型实践【decisionTreeClassifier】

       本文紧接上文的逻辑回归分类器模型,实践的同样是分类算法模型,决策树模型是机器学习领域中简单却又强悍,可解释程度很高的一种模型,之前较多使用的库是sklearn,这里面提供了绝大多数机器学习模型的实现和应用方法,很nice的,现在要基于spark来完成决策树模型的简单使用,同样是依托于官方提供的实例,在完整地理解透彻之后,才会进行自己的设计与改造,这是我一般的学习思路。

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

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

     Apache Spark是一个开源、强大的的分布式查询和处理引擎,最初由Matei Zaharia在UC Berkeley读博期间开发的[1]。最早的Spark版本于2012年发布,后来被捐赠给Apache SoftwareFoundation,成为Apache的旗舰项目之一(github链接:https://github.com/apache/spark)

      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的决策树分类模型实现如下:
 

#!usr/bin/env python
#encoding:utf-8
from __future__ import division


'''
__Author__:沂水寒城
功能: pyspark 机器学习实践之【决策树分类器模型】
'''



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 decisionTreeClassifier(data="mllib/sample_libsvm_data.txt"):
    '''
    决策树分类器
    '''
    #加载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])
    #模型训练
    dt = DecisionTreeClassifier(labelCol="indexedLabel", featuresCol="indexedFeatures")
    pipeline = Pipeline(stages=[labelIndexer, featureIndexer, dt])
    model = pipeline.fit(trainingData)
    predictions = model.transform(testData)  #预测
    predictions.select("prediction", "indexedLabel", "features").show(5)  #展示前5行数据
    #展示预测标签与真实标签,计算测试误差
    evaluator = MulticlassClassificationEvaluator(
        labelCol="indexedLabel", predictionCol="prediction", metricName="accuracy")
    accuracy = evaluator.evaluate(predictions)
    print("Test Error = %g " % (1.0 - accuracy))
    treeModel = model.stages[2]
    print('treeModelSummary: ',treeModel)  #模型摘要


if __name__=='__main__':
    decisionTreeClassifier(data="mllib/sample_libsvm_data.txt")

       结果输出如下:

       结果输出前两列分别是:预测标签和真实的标签,最后一列是当前样本的特征数据。

       学习了,接下来基于自己的数据集格式进行改造实验!

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Together_CZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值