pyspark分类算法之逻辑回归模型实践【binomialLogisticRegression+multinomialLogisticRegression】

本文介绍了使用Pyspark进行逻辑回归分类模型的实践,包括二项逻辑回归和多项逻辑回归,展示了如何加载数据、训练模型及评估模型性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      最近在使用pyspark来进行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.context import SparkContext
from pyspark.sql.session import SparkSession
from pyspark.ml.classification import LogisticRegression
from pyspark.ml import Pipeline
from pyspark.ml.classification import GBTClassifier
from pyspark.ml.classification import DecisionTreeClassifier
from pyspark.ml.feature import StringIndexer, VectorIndexer,IndexToString
from pyspark.ml.evaluation import MulticlassClassificationEvaluator
from pyspark.ml.classification import RandomForestClassifier
from pyspark.ml.classification import MultilayerPerceptronClassifier
from pyspark.ml.classification import LinearSVC
from pyspark.ml.classification import OneVsRest
from pyspark.ml.classification import NaiveBayes



conf=SparkConf().setAppName('MLDemo')
conf=conf.setMaster("local")
sc = SparkContext('local')
spark = SparkSession(sc)



def binomialLogisticRegression(data="mllib/sample_libsvm_data.txt"):
    '''
    逻辑回归是预测分类响应的常用方法。广义线性模型的一个特例是预测结果的概率。在spark.ml中,逻辑回归可以用于通过二项逻辑回归来预测二元结果,或者它可以用于通过使用多项逻辑回归来预测多类结果。使用family参数在这两个算法之间进行选择,或者保持不设置,Spark将推断出正确的参数
    二项逻辑回归
    '''
    #加载LIBSVM格式的数据集
    training=spark.read.format("libsvm").load(data)
    lr=LogisticRegression(maxIter=10,regParam=0.3,elasticNetParam=0.8)
    lrModel = lr.fit(training)  #模型拟合
    print("Coefficients: " + str(lrModel.coefficients))  #系数
    print("Intercept: " + str(lrModel.intercept))  #截距
    #使用多项逻辑回归
    mlr = LogisticRegression(maxIter=10, regParam=0.3, elasticNetParam=0.8, family="multinomial")
    mlrModel = mlr.fit(training)  #模型拟合
    print("Multinomial coefficients: " + str(mlrModel.coefficientMatrix))  #系数矩阵
    print("Multinomial intercepts: " + str(mlrModel.interceptVector))  #截距向量
    #模型摘要
    trainingSummary = lrModel.summary
    #在每次迭代中获取对象
    objectiveHistory = trainingSummary.objectiveHistory
    print("objectiveHistory:")
    for objective in objectiveHistory:
        print(objective)
    trainingSummary.roc.show()
    print("areaUnderROC: " + str(trainingSummary.areaUnderROC))
    #设定阈值来最大化F1值
    fMeasure = trainingSummary.fMeasureByThreshold
    maxFMeasure = fMeasure.groupBy().max('F-Measure').select('max(F-Measure)').head()
    bestThreshold = fMeasure.where(fMeasure['F-Measure'] == maxFMeasure['max(F-Measure)']) \
        .select('threshold').head()['threshold']
    lr.setThreshold(bestThreshold)
    print('bestThreshold: ',bestThreshold)


def multinomialLogisticRegression(data="mllib/sample_multiclass_classification_data.txt"):
    '''
    逻辑回归是预测分类响应的常用方法。广义线性模型的一个特例是预测结果的概率。在spark.ml中,逻辑回归可以用于通过二项逻辑回归来预测二元结果,或者它可以用于通过使用多项逻辑回归来预测多类结果。使用family参数在这两个算法之间进行选择,或者保持不设置,Spark将推断出正确的参数
    多项逻辑回归
    '''
    #加载LIBSVM格式的数据集
    training=spark.read.format("libsvm").load(data)
    lr = LogisticRegression(maxIter=10, regParam=0.3, elasticNetParam=0.8)
    lrModel = lr.fit(training)  #模型拟合
    print("Coefficients: \n" + str(lrModel.coefficientMatrix))  #系数
    print("Intercept: " + str(lrModel.interceptVector))  #截距
    trainingSummary = lrModel.summary
    print('trainingSummary: ',trainingSummary)
    print('precision: ',trainingSummary.precisionByLabel)
    print('recall: ',trainingSummary.recallByLabel)
    print('F-measure: ',trainingSummary.fMeasureByLabel)
    objectiveHistory = trainingSummary.objectiveHistory
    print("objectiveHistory:")
    for objective in objectiveHistory:
        print(objective)
    #对于多类,我们可以在每个类别上检查偏差
    print("False positive rate by label:")
    for i, rate in enumerate(trainingSummary.falsePositiveRateByLabel):
        print("label %d: %s" % (i, rate))
    print("True positive rate by label:")
    for i, rate in enumerate(trainingSummary.truePositiveRateByLabel):
        print("label %d: %s" % (i, rate))
    print("Precision by label:")
    for i, prec in enumerate(trainingSummary.precisionByLabel):
        print("label %d: %s" % (i, prec))
    print("Recall by label:")
    for i, rec in enumerate(trainingSummary.recallByLabel):
        print("label %d: %s" % (i, rec))
    print("F-measure by label:")
    for i, f in enumerate(trainingSummary.fMeasureByLabel()):
        print("label %d: %s" % (i, f))
    accuracy = trainingSummary.accuracy
    falsePositiveRate = trainingSummary.weightedFalsePositiveRate
    truePositiveRate = trainingSummary.weightedTruePositiveRate
    fMeasure = trainingSummary.weightedFMeasure()
    precision = trainingSummary.weightedPrecision
    recall = trainingSummary.weightedRecall
    print("Accuracy: %s\nFPR: %s\nTPR: %s\nF-measure: %s\nPrecision: %s\nRecall: %s"
          % (accuracy, falsePositiveRate, truePositiveRate, fMeasure, precision, recall))



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

    multinomialLogisticRegression(data="mllib/sample_multiclass_classification_data.txt")

       其中,代码首部加上下面的语句:

import findspark
findspark.init()

       是为了避免报错,相应的文章在我之前的博客里面,感兴趣的话可以去看看。

       接下来,我们分别执行两类模型,二项逻辑回归分类器结果输出如下:
 

        接下来执行多项逻辑回归分类器,结果输出如下所示:

       可以看到,pyspark提供的功能还是很强大,本文中使用的数据集是pyspark官方提供的mllib包中提供的数据集,都是以LIBSVM格式进行数据集加载和使用的,和sklearn的使用有比较大的区别,之后需要研究下数据集格式转化的相关问题,记录学习了。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Together_CZ

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

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

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

打赏作者

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

抵扣说明:

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

余额充值