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

    感谢原文作者:小思思smile 原文链接:https://blog.csdn.net/u014049880/article/details/52329333/ 更多请查阅Java API文档! 在创建 ...

  2. 自定义CALayer

    1.如何自定义Layer.     自定义CALayer的方式创建UIView的方式非常相似.      CALayer *layer = [CALayer layer];      layer.fr ...

  3. Redis源码简要分析

    转载请注明来源:https://www.cnblogs.com/hookjc/ 把所有服务端文件列出来,并且标示出其作用:adlist.c //双向链表ae.c //事件驱动ae_epoll.c // ...

  4. CSS样式表的书写位置

    行内式(内联样式) 是通过标签的style属性来设置元素的样式,其基本语法格式如下: <标签名 style="属性1:属性值1; 属性2:属性值2; 属性3:属性值3;"&g ...

  5. 7.2.*PHP编译安装时常见错误解决办法,php编译常见错误

    configure: error: Cannot find ldap.h   检查下面是不是已经安装,如果没有安装之:检查:yum list openldapyum list openldap-dev ...

  6. SpringMVC5中,@ModelAttribute注解详解

    看这个注解的前提最好熟悉一下SpringMVC的model组件,该注解可以有五种使用方式: ①②③为 @ModelAttribute 跟@RequestMapping 分开修饰方法,被@ModelAt ...

  7. mocha_JavaScript单元测试框架

    mocha mocha是JavaScript的一种单元测试框架,既可以在浏览器环境下运行,也可以在Node.js环境下运行. 使用mocha,我们就只需要专注于编写单元测试本身,然后,让mocha去自 ...

  8. Spring MVC拦截器(Interceptor)使用

    第一篇Spring MVC的小作文就是关于Interceptor的,而不是很多基础的东西呢,很无奈.因为实践的项目中用到了,用地不太好,导致重复跳转页面浏览器cookie溢出了. 这个过程中呢就将与I ...

  9. ACM对抗赛有感

    2022.2.22 一个有"爱"的日子,注定不会平凡(对于24oier来说),原因是gg让我们参加与大连理工大学的对抗赛. 为此队友都准备好各种板子,上了比赛才发现根本没有 可怜了 ...

  10. OpenLDAP测试搭建

    目录 ldap介绍 测试环境 安装LDAP服务端 设置LDAP的root密码 配置LDAP服务端 创建LDAP证书 设置LDAP数据库 创建LDAP用户 添加防火墙规则 开启LDAP日志 配置LDAP ...