spark 与 scikit-learn 机器学习流程组件设计哲学比较

概述:估算器,变换器和管道 - spark.ml

该spark.ml软件包旨在提供基于DataFrame构建的一组统一的高级API ,帮助用户创建和调整实用的机器学习流程。有关子包的指南,请参阅下面的算法指南部分 spark.ml,包括Pipelines API特有的功能转换器,集合等。

管道中的主要概念
Spark ML标准化了用于机器学习算法的API,使得将多种算法组合到单个管道或工作流中变得更加容易。本节介绍Spark ML API引入的关键概念,其中管道概念主要受scikit-learn项目的启发。

DataFrame:Spark ML使用DataFrameSpark SQL作为ML数据集,它可以容纳各种数据类型。例如,a DataFrame可以具有存储文本,特征向量,真实标签和预测的不同列。

Transformer:A Transformer是一种可以将一种变换DataFrame为另一种的算法DataFrame。例如,ML模型是Transformer将DataFrame特征转换为DataFrame具有预测的特征。

Estimator:An Estimator是一种可以适合DataFrame生成a 的算法Transformer。例如,学习算法是Estimator在a上训练DataFrame并产生模型的算法。

Pipeline:将Pipeline多个Transformers和Estimators 链在一起以指定ML工作流。

Parameter:所有Transformers和Estimators现在共享一个用于指定参数的通用API。

数据帧
机器学习可以应用于各种数据类型,例如矢量,文本,图像和结构化数据。Spark ML采用DataFrameSpark SQL来支持各种数据类型。

DataFrame支持许多基本和结构化类型; 有关支持的类型列表,请参阅Spark SQL数据类型参考。除了Spark SQL指南中列出的类型之外,DataFrame还可以使用ML Vector类型。

一个DataFrame可以从常规创建或隐或显式RDD。有关示例,请参阅下面的代码示例和Spark SQL编程指南。

a DataFrame中的列被命名。下面的代码示例使用诸如“text”,“features”和“label”之类的名称。

管道组件
变形金刚
A Transformer是包含特征变换器和学习模型的抽象。从技术上讲,a Transformer实现了一种方法transform(),DataFrame通常通过附加一列或多列来将一个方法转换为另一个方法。例如:

特征变换器可以采用a DataFrame,读取列(例如,文本),将其映射到新列(例如,特征向量),并输出DataFrame附加了映射列的新列。
学习模型可能需要a DataFrame,读取包含特征向量的列,预测每个特征向量的标签,并输出DataFrame带有作为列附加的预测标签的新元素。
估计
一个Estimator抽象学习算法或适合或数据串的任何算法的概念。从技术上讲,一个Estimator实现一个方法fit(),它接受DataFrame并生成一个 Model,这是一个Transformer。例如,学习算法例如LogisticRegression是Estimator,并且呼叫 fit()训练a LogisticRegressionModel,其是a Model,因此是a Transformer。

管道组件的属性
Transformer.transform()s和Estimator.fit()s都是无国籍的。将来,可以通过替代概念支持有状态算法。

a的每个实例Transformer或Estimator具有唯一ID,这在指定参数(下面讨论)时很有用。

管道
在机器学习中,通常运行一系列算法来处理和学习数据。例如,简单的文本文档处理工作流程可能包括几个阶段:

将每个文档的文本拆分为单词。
将每个文档的单词转换为数字特征向量。
使用特征向量和标签学习预测模型。
Spark ML表示诸如a之类的工作流Pipeline,其由要按特定顺序运行的PipelineStages(Transformers和Estimators)序列组成 。我们将在本节中将此简单工作流用作运行示例。

这个怎么运作
A Pipeline被指定为阶段序列,每个阶段是a Transformer或a Estimator。这些阶段按顺序运行,输入DataFrame在通过每个阶段时进行转换。对于Transformer阶段,该transform()方法被调用DataFrame。对于Estimator阶段,fit()方法被调用,以产生Transformer(它成为的部分PipelineModel,或装配Pipeline),以及Transformer的transform()方法被称为上DataFrame。

我们为简单的文本文档工作流说明了这一点。下图是针对a的训练时间使用情况Pipeline。

Spark ML管道示例

上图中,顶行表示Pipeline三个阶段。前两个(Tokenizer和HashingTF)是Transformers(蓝色),第三个(LogisticRegression)是Estimator(红色)。底行表示流经管道的数据,其中柱面表示DataFrames。该Pipeline.fit()方法在原始DataFrame文件上调用,原始文本文档和标签。该Tokenizer.transform()方法将原始文本文档拆分为单词,添加带有单词的新列DataFrame。该HashingTF.transform()方法将单词列转换为特征向量,将具有这些向量的新列添加到DataFrame。现在,因为LogisticRegression是一个Estimator,第Pipeline一次调用LogisticRegression.fit()产生一个LogisticRegressionModel。如果Pipeline有更多的阶段,它会打电话给LogisticRegressionModel在传递到下一阶段之前的transform() 方法。DataFrameDataFrame

A Pipeline是一个Estimator。因此,之后Pipeline的fit()方法运行时,它产生一个PipelineModel,这是一个 Transformer。这PipelineModel是在测试时使用的 ; 下图说明了这种用法。

Spark ML PipelineModel示例

在上图中,它PipelineModel具有与原始相同的阶段数Pipeline,但原始中的所有Estimators Pipeline都变为Transformers。当PipelineModel的transform()方法被称为上的测试数据集,该数据是为了通过拟合管道传递。每个阶段的transform()方法都会更新数据集并将其传递到下一个阶段。

Pipelines和PipelineModels有助于确保培训和测试数据经过相同的功能处理步骤。

细节
DAG Pipeline小号:甲Pipeline的级被指定为一个有序阵列。这里给出的例子都是线性Pipelines,即Pipelines,其中每个阶段使用前一阶段产生的数据。Pipeline只要数据流图形成有向无环图(DAG),就可以创建非线性s。目前,此图基于每个阶段的输入和输出列名称(通常指定为参数)隐式指定。如果Pipeline形成DAG,则必须按拓扑顺序指定阶段。

运行时检查:由于Pipelines可以在DataFrame具有不同类型的s上运行,因此它们不能使用编译时类型检查。 Pipelines和PipelineModels代替在实际运行之前进行运行时检查Pipeline。这种类型检查是使用DataFrame 模式完成的,模式中的列的数据类型的描述DataFrame。

独特的管道阶段:A Pipeline的阶段应该是唯一的实例。例如,myHashingTF不应将同一实例 插入Pipeline两次,因为Pipeline阶段必须具有唯一ID。但是,不同的实例myHashingTF1和myHashingTF2(两种类型HashingTF)都可以放在同一个Pipeline实例中,因为将使用不同的ID创建不同的实例。

参数
Spark ML Estimator和Transformers使用统一的API来指定参数。

A Param是带有自包含文档的命名参数。A ParamMap是一组(参数,值)对。

将参数传递给算法有两种主要方法:

设置实例的参数。例如,如果lr是实例LogisticRegression,则可以调用lr.setMaxIter(10)以lr.fit()最多使用10次迭代。此API类似于spark.mllib包中使用的API 。
传递ParamMap到fit()或transform()。在任何参数ParamMap将覆盖以前通过setter方法指定的参数。
参数属于Estimators和Transformers的特定实例。例如,如果我们有两个LogisticRegression实例lr1和lr2,然后我们可以建立一个ParamMap与两个maxIter指定的参数:ParamMap(lr1.maxIter -> 10, lr2.maxIter -> 20)。如果有两个算法的maxIter参数在a中,这很有用Pipeline。

保存和加载管道
通常,将模型或管道保存到磁盘以供以后使用是值得的。在Spark 1.6中,模型导入/导出功能已添加到Pipeline API中。支持大多数基本变压器以及一些更基本的ML模型。请参阅算法的API文档,了解是否支持保存和加载。

代码示例
本节给出了说明上述功能的代码示例。有关详细信息,请参阅API文档(Scala, Java和Python)。一些Spark ML算法是算法的包装器spark.mllib, MLlib编程指南有关于特定算法的详细信息。

posted @ 2018-11-18 23:16  Lucas_Yu  阅读(683)  评论(1编辑  收藏  举报