前面跟大家扯了这么多废话,终于到具体的机器学习模型了。大部分机器学习的教程,总要从监督学习开始讲起,而监督学习的众多算法当中,又以分类算法最为基础,原因在于分类问题非常的单纯直接,几乎不需要引入一些其它概念,因此我们就先从分类器开始讲起。
        还记得第一节介绍的Spark ML架构吗?从Param起始,Spark ML通过PipelineStage引入了三个基本概念,Transformer,Estimator,Model,其中T和E本质上都是PipelineState,E能够产生M,而M本质上又是一个T,因此M是连接T和E的桥梁。又由于监督学习问题本质上都是为了做出“预测”,因此给出了一个监督学习的模板,Predictor,Predictor家族有三个成员,第一是PredictorParam,包含了这个预测器必须包含的参数,第二是Predictor本身,它是一个混入了PredictorParam的Estimator,第三是PredictorModel,它是一个混入了PredictorParam的Model。因此,通过预测器模板Predictor,我们了解到,一个具体的预测器一定要包含三个部分:Param,Predictor,Model。其中Param用以规定,这个预测器需要包含的特殊参数,Predictor是一个Estimator,用于实际执行算法,PredictorModel是一个数据结构,用于保存算法结果。我们看到,Predictor和PredictorModel都包含了PredictorParam这个结构,说明它们都包含了同样的预测器的参数。
        这样我们在介绍分类器的时候,就有一个整体框架了。分类器本身也是一个预测器,它同样包含了三要素,参数、学习器、模型,在我们深入学习分类器的代码时会发现,几乎所有的分类器都明确定义了自己的三个要素。
        在classification文件夹下面,包含了两类分类器,第一类是虚拟分类器。虚拟分类器并不执行任何具体的分类任务,它们是为不同的分类器准备模板。这其中最基本的一个模板就是Classifier,它是所有分类器的模板,它直接继承自Predictor,同时也包含了Predictor三要素。我们知道,分类器按照是否能输出分类概率,又可以分为概率性分类器和非概率分类器,概率性的分类器除了能输出分类结果之外,还能输出选择该分类的概率,比如逻辑回归、朴素贝叶斯等,另外一类是非概率分类器,比如线性支持向量机。对于概率类的分类器,这里专门给出了一个抽象,就是ProbabilisticClassifier,提供了输出分类选择概率的功能。另外,针对多分类问题,给出了OneVsRest分类器,它其实相当于一种分类器的策略,并不能算是一个单独的分类器。
        第二类就是具体分类器,刚才提到了,这里的具体分类器中,除了LinearSVC线性支持向量机分类器之外,其它都是概率性的分类器。因此这里我们先介绍LinearSVC的实现。
        说起支持向量机,很多人会想到SMO算法,但实际上针对线性可分问题,在用线性支持向量机解决时,根本用不着对偶化,因为线性支持向量机,本身就可以被看做是一个有Hinge损失的线性分类问题,因此这里直接使用了optim模块的HingeAggregator。
        剩下的就是概率性的分类器,首先要介绍的是决策树分类器,它需要用到另外一个tree模块(多说一句,Spark ML对于决策树的核心算法都包含在tree模块中,其使用的分布式计算思路与广义线性模型非常不同,我们将在后面的随笔中介绍),需要注意的是,Spark ML包中决策树分类器其实就是随机森林分类器的一个特例,当森林中树的数量为1时,就是决策树分类器。因此同随机森林分类器一样,我们在介绍tree模块的时候再详细讨论它们的实现。另外,由于GBTClassifier也需要用到tree模块中的树的实现,因此也放在后面讲。
        接下来就是LogisticRegressionClassifier,它包含了二类分类和多类分类两种实现。前面我们在介绍机器学习算法从单机到分布式的转换时,提到了关键是treeAggregator这个函数,而在逻辑回归中,就用到了在optim模块中实现的LogisticAggregator。具体的学习算法,都是使用的breeze库中的优化算法,比如,当正则是L2时,选择LBFGS,当正则是L1是,选择OWLQN,当正则是L2且w参数受限(设置了最大值或/和最小值)时,使用LBFGSB。
        接下来是感知机分类器,MultilayerPerceptronClassifier,它的实现需要依赖ann库中的神经网络实现,这里我们也不作探讨。最后是朴素贝叶斯分类器,NaiveBayes,这个分类器本质上是基于统计的,不需要优化计算。
        以上就是对分类器模块的介绍,重在理清框架,说的不对的地方,还请各位批评指正。

Spark ML源码分析之三 分类器的更多相关文章

  1. Spark ML源码分析之二 从单机到分布式

            前一节从宏观角度给大家介绍了Spark ML的设计框架(链接:http://www.cnblogs.com/jicanghai/p/8570805.html),本节我们将介绍,Spar ...

  2. Spark ML源码分析之一 设计框架解读

    本博客为作者原创,如需转载请注明参考           在深入理解Spark ML中的各类算法之前,先理一下整个库的设计框架,是非常有必要的,优秀的框架是对复杂问题的抽象和解剖,对这种抽象的学习本身 ...

  3. Spark ML源码分析之四 树

            之前我们讲过,在Spark ML中所有的机器学习模型都是以参数作为划分的,树相关的参数定义在treeParams.scala这个文件中,这里构建一个关于树的体系结构.首先,以Decis ...

  4. 第十一篇:Spark SQL 源码分析之 External DataSource外部数据源

    上周Spark1.2刚发布,周末在家没事,把这个特性给了解一下,顺便分析下源码,看一看这个特性是如何设计及实现的. /** Spark SQL源码分析系列文章*/ (Ps: External Data ...

  5. 第十篇:Spark SQL 源码分析之 In-Memory Columnar Storage源码分析之 query

    /** Spark SQL源码分析系列文章*/ 前面讲到了Spark SQL In-Memory Columnar Storage的存储结构是基于列存储的. 那么基于以上存储结构,我们查询cache在 ...

  6. 第九篇:Spark SQL 源码分析之 In-Memory Columnar Storage源码分析之 cache table

    /** Spark SQL源码分析系列文章*/ Spark SQL 可以将数据缓存到内存中,我们可以见到的通过调用cache table tableName即可将一张表缓存到内存中,来极大的提高查询效 ...

  7. 第七篇:Spark SQL 源码分析之Physical Plan 到 RDD的具体实现

    /** Spark SQL源码分析系列文章*/ 接上一篇文章Spark SQL Catalyst源码分析之Physical Plan,本文将介绍Physical Plan的toRDD的具体实现细节: ...

  8. 第一篇:Spark SQL源码分析之核心流程

    /** Spark SQL源码分析系列文章*/ 自从去年Spark Submit 2013 Michael Armbrust分享了他的Catalyst,到至今1年多了,Spark SQL的贡献者从几人 ...

  9. 【Spark SQL 源码分析系列文章】

    从决定写Spark SQL源码分析的文章,到现在一个月的时间里,陆陆续续差不多快完成了,这里也做一个整合和索引,方便大家阅读,这里给出阅读顺序 :) 第一篇 Spark SQL源码分析之核心流程 第二 ...

随机推荐

  1. Centos下安装配置WordPress与nginx教程

    感谢大佬:https://www.howtoing.com/how-to-install-wordpress-with-nginx-on-centos-6-2 WordPress是一个免费和开源网站和 ...

  2. Java反射使用方法

    //简单的例子public class ReflextionMain { public static void main(String[] args) throws ClassNotFoundExce ...

  3. shell脚本命令(sotr/unip/tr/cut/eval)与正则表达式

    shell脚本命令(sotr/unip/tr/cut/eval)与正则表达式 1.sort命令 概述: Linux sort命令用于将文本文件内容加以排序. sort命令可针对文本文件的内容,以行为单 ...

  4. 简述redis特点及其应用场景

    1. Redis八大特点 1.1. 速度快 说到Redis的速度快,大家的第一反应一定是内存读取,那是肯定的,但如果面试的时候仅仅说到这点,那还是远远不够的,至少还有以下三点要补充: Redis是用C ...

  5. [源码解析] 模型并行分布式训练Megatron (5) --Pipedream Flush

    [源码解析] 模型并行分布式训练Megatron (5) --Pipedream Flush 目录 [源码解析] 模型并行分布式训练Megatron (5) --Pipedream Flush 0x0 ...

  6. LAMP环境下部署项目管理软件--禅道

    禅道与Jira的对比 禅道最大的特色是创造性的将产品.项目.测试这三者的概念明确分开,互相配合,又互相制约.通过需求.任务.bug来进行交相互动,最终通过项目拿到合格的产品. Jira设计以项目为主线 ...

  7. centos7.+系统,mysql主从部署

    两台服务器或者两个虚拟机 主库:master    IP:192.168.85.152 从库:slave      IP:192.168.85.153 关闭主库防火墙或者放行mysql的3306端口, ...

  8. 使用.rmp文件在redhat7.9安装oracle19c

    19c开始,oracle提供了rmp安装包.感觉安装更方便一些了.记录一次测试环境安装. 1,创建交换空间 2,下载oracle 19c必要文件(oracle官网下载需要注册帐号,可以用迅雷下载后再上 ...

  9. ORACLE-创建用户和表空间

    /*分为四步 *//*第1步:创建临时表空间 */create temporary tablespace user_temp tempfile 'D:\oracle\oradata\Oracle9i\ ...

  10. flask框架安装使用

    开篇 个人工作中需要用到flask,所以特地搭建了用一下,熟悉操作 一.centos云服务器环境下 falsk作为一个python的轻量级的web框架,基本上相当于一个内核,各种功能都需要扩展第三方来 ...