在深入理解 Spark ML 中的各类算法之前, 先理一下整个库的设计框架, 是非常有必要的, 优秀的框架是对复杂问题的抽象和解剖, 对这种抽象的学习本身, 就是加深框架所面对的问题的理解的一种有效途径纷繁复杂的机器学习问题, 经过优秀框架的解析, 变得简单清晰起来
基于面向对象语言的程序设计, 本质上类似于搭积木, 从一个最抽象最简单的内容开始, 一点一点的往上堆叠, 形成一个对象的框架比如 Java 中的 Object,Python 中的 PyObject 等等, 这也是面向对象语言教给我们的一种解决问题的思路: 剥洋葱, 把外层非本质的表皮一个一个剥去, 剩下的就是事物的本质与核心
那么, 机器学习问题的核心是什么呢? Spark ML 给出的答案是, 参数所有的机器学习模型算法, 说到底都是对参数的学习因此, 在 Spark ML 框架中, 最底层也是最抽象的类, 就是 Param, 一个对象只要是能包含参数的, 都可以叫做 Param
在 param 文件夹下, 包含了对参数类及其子类的代码参数类的子类, 主要分成两种, 第一种是数据类型类, 包括 IntParam,DoubleParam, 顾名思义, 这些参数包含了某种数据类型的数据, 第二种是参数集合 Params, 表示其中包含了许多参数, 这个类就很了不起了, 从它开始衍生出了很多实用的参数, 比如 HasRegParam, 表示其中包含了正则化的参数, 再比如 HasMaxIter, 表示其中包含了最大迭代次数的参数看, 机器学习模型的积木已经帮我们准备好了, 从参数的角度来抽象各类机器学习问题, 可以按照是否包含某个参数, 对机器学习模型和算法进行拆解, 一个算法需要什么参数, 就在定义时, 像搭积木一样, 把对应的参数包括进来就好了
参数仅是静态的内容, 如果要让这个对象有用, 就需要让它具有一定的功能最底层的具有功能性的类是 PipelineStage, 它实际上是一个 Params, 关于 Pipeline 的概念, 我们稍后介绍, 这里需要理解的是, 虽然 PipelineStage 与 Pipeline 的名称很相似, 但它们之间还隔了一层, 完全不是一个层面上的东西 PipelineStage 是一个抽象的阶段, 它本身不具备任何功能, 它的存在仅是为了给真正有功能的类一个公共的子类, 与 Param 的其它子类相区分
接下来就到了我们平时最常用的类, Transformer 一个类, 只要它拥有将一个数据集转化成另外一个数据集的功能, 它就是一个 Transformer 注意, 一个 Transformer 就是一个 PipelineStage
仅能完成数据转换, 还不够, 在机器学习中, 最重要的事情是对数据的拟合, 这里 Estimator 类正式登场, 只要具有数据拟合的功能, 即, 只要能从数据中学习, 就是 Estimator, 这个类里包含了我们最熟悉的一个函数, fit, 是它赋予了所有 Estimator 从数据中学习的能力
到这里, 我们在机器学习中最常见的模型的概念, 就已经呼之欲出了 Model 类本质上是一个 Transformer, 这个很好理解, 一个训练得到的模型, 本身的任务就是做预测, 做数据转化的 Model 的独特之处在于, 它是由 Estimator 的 fit 方法生成的, 一个 Estimator 在经过对数据的学习之后, 就产生了一个 Model, 而一个 Model 中除了一个指向生成自己的 Estimator 的指针之外, 真的什么都没有
这里我们再总结一下 Transformer(简称 T),Estimator(简称 E),Model(简称 M) 三者之间的关系 T 和 E 本质上都是 PipelineStage, 更本质的来说都是 Param, 而 M 本质上是一个 T, 但它是由 E 产生的, 因此 M 是连接 T 和 E 之间的桥梁
下面要介绍的就是 Pipeline, 我们知道很多机器学习的任务, 都不是一步能完成的, 比如做分类, 我们要先对数据进行预处理, 进行分类, 然后再对分类结果进行处理, 才能得到想要的结果于是 Spark ML 提供了一个非常棒的抽象, 流水线 (Pipeline), 它的引入能使得机器学习的各个任务能像流水线一样被顺序执行, 因此能提供非常简洁优雅的编程接口 Pipeline 本质上是一个 E, 它是由一个一个的 PipelineStage 组成的通过上文我们知道, T 和 E 都是 PipelineStage, 因此一个 Pipeline 中就包含了许多的 T 和 E 由于 Pipeline 本质上是一个 E, 因此它在调用 fit 函数之后, 会产生一个 PipelineModel, 这就是一个 Model 了还记得 Model 的本质是 Transformer 吗?
我们知道, 机器学习中的问题可以简单分为两类, 监督学习和非监督学习, 监督学习的一个特点就是, 能够对某个事情做出预测, 而非监督学习更多的是挖掘数据中的一些内在本质特点, 不能做出预测, 因此, 为了将监督学习的本质提炼出来, 设计了一个 Predictor 类
能做出预测的类, 需要有一些共同的参数, 还记得刚才我们对于 Param 的分析吗? 参数是区分各类机器学习算法的一种角度, PredictorParams 就是有预测能力的监督学习模型拥有参数的一种抽象, 而 Predictor 本质上是一个带有 PredictorParams 的 Estimator, 而每一个 Estimator 在调用 fit 函数之后都会产生一个 Model, 这里产生的就是一个 PredictorModel, 这是一个带有 PredictorParams 的 Model
好了, 今天就写到这里写作也是整理思路的一种很好的方式, 在刚才的写作中, 对 Spark ML 的设计思路又有了新的认识由于本人才疏学浅, 以上的理解不免会有纰漏, 还请大家不吝赐教下次将跟大家一起分析下具体算法的设计
来源: https://www.cnblogs.com/jicanghai/p/8570805.html