ML Pipeline —— spark官网译文

来源:互联网 发布:知乎尚永丰 编辑:程序博客网 时间:2024/06/01 15:08

在本章,我们介绍ML Pipelines的概念。ML Pipeline提供一套统一的建立于DataFrames之上高级别API来帮助使用者创建和调优实用的机器学习流水线(pipeline)。

Pipeline中主要概念

MLib为机器学习算法标准化了API,使得很容易联合多个算法到一个单独的流水线(Pipeline)或工作流(workflow)。本章覆盖了Pipeline API引入的关键概念,这些流水线概念大部分受scikit-learn项目的灵感启发。
DataFrame:该ML API使用来自于Spark SQL的DataFrame作为ML数据集,这个集合能保存各种各样的数据类型。比如,一个DataFrame可以有不同的列保存文本(text)、特征向量(feature vector)、真标签(true labels)和预测(predictions)。
Transformer:一个Transformer是一个可以将一个DataFrame转变成另一个DataFrame的算法。比如,一个ML模型是一个能将带特征的DataFrame转化为带预测的DataFrame的Transformer。
Estimator:一个Estimator是一个配合一个DataFrame来产出一个Transformer的算法。比如,一个学习算法是一个在DataFrame上训练并产出一个模型的Estimator。
Pipeline:一个Pipeline将多个Transformer和Estimator串联一起来指定一个ML工作流。
Parameter:所有的Transformer和Estimator现在共享一个公共的API来设置参数。

DataFrame

机器学习可用于多种多样的数据类型,诸如向量、文本、图像和结构化数据。该API采用Spark SQL的DataFrame来支持各种数据类型。
DataFrame支持很多基础的和结构化的类型;通过Spark SQL datatype reference查看一系列支持的类型。除了在Spark SQL指导中列出的类型之外,DataFrame也可以使用ML Vector类型。
DataFrame可以通过一个合适的RDD隐式的或者显式的来创建。从下面的代码示例和 Spark SQL programming guide来看看示例。
DataFrame中的列是命名的。下面示例代码中使用的名字诸如“text”,“features”和“label”。

Pipeline组件

Transformer

一个Transformer是一个包含特征转化和学习模型的抽象。从技术上讲,一个Transformer实现一个transform方法,将一个DataFrame转换为另一个,一般是通过增加一个或多个列。比如:
一个特征Transformer可能会取一个DataFrame,读一列(比如text),映射到一个新列(比如,特征向量),并输出一个新的带追加映射的DataFrame上。
一个学习模型可能会取一个DataFrame,读包含特征向量的列,为每个特征向量预测标签(label),并输出一个带追加为一列的预测标签的新DataFrame。

Estimators

一个Estimator抽象一个在数据上安装或训练的学习算法或者任何算法。从技术上来说,一个Estimator实现一个fit方法,这个方法接受一个DataFrame兵产出一个Model(模型),就是一个Transformer。比如,一个诸如逻辑回归的学习算法就是一个Estimator,并调用fit方法训练一个LogisticRegressionModel,这是一个模型也就是Transformer。

pipeline组件的属性

Transformer.transform() 和Estimator.fit()都是无状态的。在将来,有状态算法可能会通过其他替代组件来支持。
Transformer和Estimator的每个实例都有一个唯一的ID,这在指定参数时候很有用(后面讨论)。

Pipeline

在机器学习,从数据上跑一系列算法来处理和学习是很常见的。比如,一个简单的文本文档处理工作流可能包含几个阶段:
把每个文档的文本分隔为单词
把每个文档的单词转换为一个数字特征向量。使用这些特征向量和标签来学习一个预测模型。MLlib把这样一个工作流表示成一个Pipeline,包含一系列PipelineStage(Transformer和Estimator)以指定顺序运行。我们在本章中将使用这个最简单的工作流作为一个运行示例。

工作原理

一个Pipeline被指定为一系列阶段,并且每个阶段要么是一个Transformer要么是一个Estimator。这些阶段按顺序执行,并且输入的DataFrame被转换就像它通过每个阶段。对于Transformer阶段,transform()方法在DataFrame上被调用,对于Estimator阶段,fit()方法被调用来产出一个Transformer(这会成为PipelineModel的一部分或固定的Pipeline),并且这个 Transformer的transform()方法会在DataFrame上被调用。
我们用简单的文本文档工作流来阐述这个。下面的图用于Pipeline的训练时段使用。
这里写图片描述
在上面,最上面一行代表一个有三个阶段的Pipeline。前两个(Tokenizer 和HashingTF)是Transformer(蓝色),第三个(LogisticRegression)是一个Estimator(红色)。下面一行代表数据流过流水线,圆柱体表示DataFrame。Pipeline.fit()方法在原始的DataFrame上被调用,这个DataFrame包含原始文本文档和标签。Tokenizer.transform()方法将原始文本文档分隔成单词,增加一个带这些单词的新列到DataFrame上。HashingTF.transform()方法将单词列转换为特征向量,把这些向量加入到DataFrame一个新列。现在,由于LogisticRegression是一个Estimator,Pipeline首先调用LogisticRegression.fit()来产出一个LogisticRegressionModel。如果该Pipeline还有更多阶段,将会在将DataFrame传递给下一个阶段前在DataFrame上调用LogisticRegressionModel的transform()方法。
Pipeline是一个Estimator,因此,当Pipeline的fit()方法运行后,它产出一个PipelineModel,就是一个Transformer。该PipelineModel用于测试时间;下图阐述了该用法。
这里写图片描述
在上图中,PipelineModel和原始的Pipeline有同样个数的阶段,但是所有原始Pipeline的Estimator都变成了Transformer。当PipelineModel的transform()方法在测试数据集上被调用时,数据按顺序被传给固定的Pipeline。每个阶段的transform()方法更新数据集并传递给下一个阶段。
Pipelines和PipelineModel帮助确保训练和测试数据通过完全相同的特征处理步骤。

细节

DAG Pipeline:一个Pipeline的阶段被指定为一个有序的数组。此处给出的例子都是线性Pipeline,比如Pipeline中每个阶段使用的数据都是由前一个阶段产出的。也有可能创建非线性Pipeline当数据流图构成一个有向循环图(DAG)。该图当前基于每个阶段输入和输出列名隐式来指定的(一般指定为参数)。如果Pipeline组成一个DAG,阶段必须被指定为拓顺序。
运行时检查(Runtime checking):由于Pipeline可以在DataFrame上操作各种类型,他们不能用编译阶段类型检查。Pipeline和PipelineModel相应在真正运行Pipeline前做运行时检查。检查是使用DataFrame schema来做的,schema就是DataFrame中列数据类型的描述。
唯一Pipeline阶段(Unique Pipeline stages):一个Pipeline的阶段必须是唯一的实例。比如,同样的实例myHashingTF不应该被插入Pipeline两次,因为Pipeline阶段必须有唯一的ID。然而,不同的实例myHashingTF1和myHashingTF2 (都是 HashingTF类型)可以放入相同的Pipeline因为不同的实例创建时有不同的ID。

参数(Parameters)

MLlib Estimator和Transformer使用统一的API来指定参数。
Param是一个带自包含文档的命名的参数。ParamMap是一系列(参数,值)对的集合。
有两种主要得方式来将参数传给一个算法:
为一个实例设置参数,比如,如果lr是一个LogisticRegression的实例,我们可以调用lr.setMaxIter(10)来让lr.fit()最多使用10次迭代。这种API和spark.mllib包中使用的方式相似。
将一个ParamMap传给fit()或者transform()。任何ParamMap中的参数都会重写之前通过setter方法指定的参数。
Parameter属于Estimator和Transformer的特定实例。比如,如果我们有两个LogisticRegression实例lr1和lr2,然后我们构建一个带两个特定maxIter参数的ParamMap:ParamMap(lr1.maxIter -> 10, lr2.maxIter -> 20)。这在一个Pipeline钟有两个带maxIter参数的算法中很有用。

保存和加载Pipeline

常常把一个模型或Pipeline保存至磁盘为后面使用是很值得的。在Spark 1.6,一个模型import/export功能被增加到Pipeline API。大部分基础的Transformer和一些更基础的ML模型一样被支持。请参考算法API文档来看看是否支持保存和加载。

代码示例

本章给出代码示例来阐述上述讨论的功能。想要了解更多信息,请参考API文档(Scala, Java, and Python)。

示例:Estimator,Transformer和Param

该示例覆盖了Estimator,Transformer和Param的概念。
代码略(见原文)
详细示例代码在Spark源码的
“examples/src/main/java/org/apache/spark/examples/ml/JavaEstimatorTransformerParamExample.java” 。

示例: Pipeline

该示例和上面的图中阐述的简单文本文档Pipeline一致。
代码略(见原文)
F详细示例代码在Spark源码的
“examples/src/main/java/org/apache/spark/examples/ml/JavaPipelineExample.java”。

模型选择(超参数训练)

使用ML Pipeline的最大好处是超参数优化。看看ML训练指导来查看更多关于自动模型选择。


官网原文地址:http://spark.apache.org/docs/latest/ml-pipeline.html

0 0
原创粉丝点击