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

    问题描述 近期修改一个学生信息管理的JavaWeb项目,其数据库连接池使用了C3P0.在实际测试时,发现在学生信息模块添加中文学生信息会在数据库(MySQL)出现中文乱码问题. 如图所示: 问题分析 ...

  2. C程序:年转化天

    突然想算算自己到底活了多少天了,e,就是纯属为了好玩,毕竟咱作为一名C初学者还是要多练练的- 为了好玩,加了个密码登陆的,密码是521,还有就是不太懂时间获取... 具体闰年的判断方法: 代码如下: ...

  3. 论文解读(IDEC)《Improved Deep Embedded Clustering with Local Structure Preservation》

    Paper Information Title:<Improved Deep Embedded Clustering with Local Structure Preservation>A ...

  4. Java中File类的方法详解

    File类也是Java中一个比较重要的类,通过他我们可以实现对文件的一系列操作,其内置了很多方法,下面我将按方法的功能分块,逐一讲解: 快速导航 构造方法 常用方法 创建目录 判断 `is...` t ...

  5. appium填坑

    首次使用appium web driver,不说搭建环境的麻烦,初次写完一个操作计算器的程序,但是运行一直报错:selenium.common.exceptions.WebDriverExceptio ...

  6. 备忘录——关于C#生成条形码

    目录 0. 背景说明 1. 使用ZXing.NET 2. 使用BarcodeLib 3. 使用字体 4. 参考 志铭-2022年2月15日 22:15:46 0. 背景说明 在.net程序中生成69码 ...

  7. pytest(10)-常用执行参数说明

    pytest单元测试框架中可以使用命令行及代码pytest.main()两种方式执行测试,且可以加入各种参数来组织执行测试.接下来我们来了解常用的执行参数的含义及其用法. pytest中的执行参数根据 ...

  8. macbook安装scala、hadoop、saprk环境

    一.scala安装 1. 安装jdk 有mac专用的jdk安装包,这里下载安装jdk1.8 2. 安装scala 2.1下载scala 2.2解压到指定目录 tar -zxvf /Users/lode ...

  9. Dubbo源码剖析一之整体架构设计

    Dubbo基础二之架构及处理流程概述 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中进行Dubbo职能上的简单介绍,下面就其内部进行详细探究: 1.Dubbo调用关系 这个图是不是很熟 ...

  10. VMware vSphere,ESXi和vCenter的关系和区别

    VMware Inc.是一家软件公司.它开发了很多产品,尤其是各种云解决方案 .他的云解决方案包括云产品,数据中心产品和桌面产品等. vSphere是在数据中心产品下的一套软件.vSphere类似微软 ...