前面跟大家扯了这么多废话,终于到具体的机器学习模型了。大部分机器学习的教程,总要从监督学习开始讲起,而监督学习的众多算法当中,又以分类算法最为基础,原因在于分类问题非常的单纯直接,几乎不需要引入一些其它概念,因此我们就先从分类器开始讲起。
        还记得第一节介绍的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. new操作符具体干了什么呢?

    考察对new关键的深刻认识,是否对前端知识有专研,如果没有专研的人,肯定说创建了一个对象,恭喜你面试官知道你是小菜鸟来的,这次面试基本上没有太大的希望了.一定要对new过程的4个步骤非常清楚,这样才能 ...

  2. 对JSP中的Session 简单理解

    我的理解: 简单来说,要使用服务器端的session对象,就是要有其对应的key,即sessionid,它只认识sessionid. 下面我说的cookie,url重写或者隐藏表单,都是为了将其对应的 ...

  3. eclipse使用的步骤

    eclipse使用的步骤: 第一步: 选择工作目录. 以后在Eclipse上面写的所有代码都是在工作目录上的. 第二步: 在Project Exploer 窗口上创建一个工程,以后我们写代码都是以工程 ...

  4. jqGrid 修改单元格值或者替换图片及其他

     var rowIds = jQuery("#list1").jqGrid('getDataIDs');                for (var k = 0; k < ...

  5. html页面动效

    找到了一个喜欢的黑客帝国动效"https://files.cnblogs.com/files/blogs/718959/codeMatrix-master.zip?t=1643081202& ...

  6. 任意文件上传漏洞syr

    任意文件上传漏洞 先来几个一句话木马看看 <%execute(request("value"))%> #asp木马 <?php eval($_POST[" ...

  7. 如何快速为团队打造自己的组件库(下)—— 基于 element-ui 为团队打造自己的组件库

    文章已收录到 github,欢迎 Watch 和 Star. 简介 在了解 Element 源码架构 的基础上,接下来我们基于 element-ui 为团队打造自己的组件库. 主题配置 基础组件库在 ...

  8. 我的新书——《PHP程序员面试笔试宝典》

    你好,是我琉忆. 一个文艺的PHP开发工程师. 很荣幸能够在这里带来我的第一本新书--<PHP程序员面试笔试宝典>. 一.创作过程 <PHP程序员面试笔试宝典>是我的第一本书, ...

  9. Redis 竟然能用 List 实现消息队列

    分布式系统中必备的一个中间件就是消息队列,通过消息队列我们能对服务间进行异步解耦.流量消峰.实现最终一致性. 目前市面上已经有 RabbitMQ.RochetMQ.ActiveMQ.Kafka等,有人 ...

  10. kali linux 静态地址和动态地址的设置

    在文件系统里找到/etc/network下的interfaces文件,打开后可以看到eth0为dhcp,将其修改为# This file describes the network interface ...