阅读更多
在每次版本更新中,除下新算法和性能升级,Databricks在MLlib的易用性上同样投入了大量精力。类似Spark Core,MLlib提供了3个编程语言的API:Python、Java和Scala。除此之外,MLlib同样提供了代码示例,以方便不同背景用户的学习和使用。在Spark 1.2中,通过与AMPLab(UC Berkeley)合作,一个 pipeline API被添加到MLlib,再次简化了MLlib的建立工作,并添加了针对ML pipelines的调优机制。

实际应用中,一个ML pipeline往往包括一系列的阶段,比如数据预处理、特征提取、模型拟合及可视化。举个例子,文本分类可能就会包含文本分割与清洗、特征提取,并通过交叉验证训练一个分类模型。虽然当下每个步骤都有许多库可以使用,但是将每个步骤连接起来却并不是件容易的事情,特别是在大规模场景下。当下,大部分的库都不支持分布式计算,或者他们并不支持一个原生的pipeline建立和优化。不幸的是,这个问题经常被学术界所忽视,而在工业界却又不得不重点讨论。

本篇博文将简述Databricks和AMPLab在ML pipeline(MLlib)所做的工作,其中有些设计由scikit-learn项目和一些前期MLI工作启发而来。

Dataset Abstraction

在新的pipeline设计时,数据集通常由Spark SQL的SchemaRDD以及ML pipeline的一系列数据集转换表现。每个转换都会摄入一个输入数据集,并输出一个已转换数据集,同时输出数据集将成为下一个步骤的输入数据集。之所以使用Spark SQL,主要考虑到以下几个因素:数据导入/输出、灵活的列类型和操作,以及执行计划优化。

数据的输入和输出是一个ML pipeline的起点和终点。MLlib当下已为数种类型提供了实用的输入和输出工具,其中包括用于分类和回归的LabeledPoint、用于协同过滤的Rating等。然而真实的数据集可能会包含多种类型,比如用户/物品 ID、时间戳,亦或是原始记录,而当下的工具并没有很好地支持所有这些类型。同时,它们还使用了从其他ML库中继承的无效率文本存储格式。

通常主流的ML pipeline都会包含特征转换阶段,你可以把特征转换看成在现有列上加上一个新列。举个例子,比如:文本分词将文档拆成大量词,而tf-idf则将这些词转换为一个特征向量。在这个过程中,标签会被加工用于模型拟合。同时,在实际过程中,更复杂的特征转换也经常会出现。因此,数据集需要支撑不同类型的列,包括密集/稀疏向量,以及为现有列建立新列的操作。



在上面这个例子中,id、text以及words在转换中都会被转入。在模型拟合中,它们是不需要的,但是在预测和模型校验时它们又会被用到。如果预测数据集只包含predicted labels,那么它们不会提供太多的信息。如果我们希望检验预测结果,比如检验false positives,那么结合predicted labels 、原始输入文本及tokenized words则是非常有必要的。这样一来,如果底层执行引擎经过优化,并且只加载所需列将是很必要的。

幸运的是,Spark SQL已经提供了大多数所期望的功能,机构不需要再重新开始。Spark支持从Parque读取SchemaRDDs,并支持将SchemaRDDs写入对应的Parque。Parque是一个非常有效的列存储格式,可以在RDDs和SchemaRDDs之间自由转换,它同时还支持Hive和Avro这样的外部数据源。使用Spark SQL,建立(说声明可能更为准确)新列将非常便捷和友好。SchemaRDD实体化使用了lazy模式,Spark SQL可以基于列的需求来优化执行计划,可以较好的满足用户需求。SchemaRDD支持标准的数据类型,为了让其可以更好地支持ML,技术团队为其添加了对向量类型的支持(用户定义类型),同时支持密集和稀疏特征向量。

下面是一段Scala代码,它实现了ML数据集导入/输出,以及一些简单的功能。在Spark知识库“examples/”目录下,你发现一些更加复杂的数据集示例(使用Scala和Python)。在这里,我们推荐用户阅读Spark SQL’s user guide以查看更多SchemaRDD详情,以及它所支撑的操作。
val sqlContext = SQLContext(sc)
import sqlContext._ // implicit conversions

// Load a LIBSVM file into an RDD[LabeledPoint].
val labeledPointRDD: RDD[LabeledPoint] =
  MLUtils.loadLibSVMFile("/path/to/libsvm")

// Save it as a Parquet file with implicit conversion
// from RDD[LabeledPoint] to SchemaRDD.
labeledPointRDD.saveAsParquetFile("/path/to/parquet")

// Load the parquet file back into a SchemaRDD.
val dataset = parquetFile("/path/to/parquet")

// Collect the feature vectors and print them.
dataset.select('features).collect().foreach(println)

Pipeline

新的Pipeline API位于名为“spark.ml”的包下。Pipeline由多个步骤组成, 这些步骤一般可分为两个类型: Transformer和Estimator。Transformer会摄入一个数据集,并输出一个新的数据集。比如,分词组件就是一个Transformer,它会将一个文本数据集转换成一个tokenized words数据集。Estimator首先必须满足输入数据集,并根据输入数据集产生一个模型。举个例子,逻辑归回就是一个Estimator,它会在一个拥有标签和特征的数据集上进行训练,并返回一个逻辑回归模型。

Pipeline建立起来比较简单:简单的声明它的步骤,配置参数,并将在一个pipeline object中进行封装。下面的代码演示了一个简单文本分类pipeline,由1个分词组件、1个哈希Term Frequency特征抽取组件,以及1个逻辑回归。
val tokenizer = new Tokenizer()
  .setInputCol("text")
  .setOutputCol("words")
val hashingTF = new HashingTF()
  .setNumFeatures(1000)
  .setInputCol(tokenizer.getOutputCol)
  .setOutputCol("features")
val lr = new LogisticRegression()
  .setMaxIter(10)
  .setRegParam(0.01)
val pipeline = new Pipeline()
  .setStages(Array(tokenizer, hashingTF, lr))

Pipeline的本身就是个Estimator,因此我们可以轻松的使用。
val model = pipeline.fit(trainingDataset)

拟合模型包括了分词组件、哈希TF特征抽取组件,以及拟合逻辑回归模型。下面的图表绘制了整个工作流,虚线部分只在pipeline fitting中发生。



在 ML算法上,有一个麻烦的事情就是它们有许多hyperparameters需要被调整。同时,这些hyperparameters与被MLlib优化的模型参数完全不同。当然,如果缺乏数据和算法上的专业知识,我们很难发现这些hyperparameters组合的最优组合。然而,即使有专业知识,随着pipeline和hyperparameters规模的增大,这个过程也将变得异常复杂。而在实践中,hyperparameters的调整却通常与最终结果戚戚相关。举个例子,在下面的pipeline中,我们有两个hyperparameters需要调优,我们分别赋予了3个不同的值。因此,最终可能会产生9个不同的组合,我们期望从中找到一个最优组合。



在这里,spark支持hyperparameter的交叉验证。交叉验证被作为一个元方法,通过用户指定参数组合让其适合底层Estimator。这里的Estimator可以是一个pipeline,它可以与 Evaluator组队并输出一个标量度量用于预测,比如精度。调优一个Pipeline是非常容易的:
// Build a parameter grid.
val paramGrid = new ParamGridBuilder()
  .addGrid(hashingTF.numFeatures, Array(10, 20, 40))
  .addGrid(lr.regParam, Array(0.01, 0.1, 1.0))
  .build()

// Set up cross-validation.
val cv = new CrossValidator()
  .setNumFolds(3)
  .setEstimator(pipeline)
  .setEstimatorParamMaps(paramGrid)
  .setEvaluator(new BinaryClassificationEvaluator)

// Fit a model with cross-validation.
val cvModel = cv.fit(trainingDataset)

当然,在一个ML pipeline中,用户可以嵌入自己的transformers或者estimators是非常重要的(建立在用户已经实现了pipeline接口的情况下)。这个API让MLlib外部代码的使用和共享变得容易,我们建议用户去阅读spark.ml user guide以获得关于pipeline API的更多信息。

结语

本篇博文介绍了Spark 1.2中引入的ML pipeline API,以及这个API的运行原理——需要由 SPARK-3530、SPARK-3569、 SPARK-3572、SPARK-4192和SPARK-4209多个JIRAs完成。我们建议用户阅读JIRA页面上公布的设计文档以获得更多消息和设计选择。需要提及的是,Pipeline API的开发并没有全部完成。同时,在Pipeline API之外,还有一些相关的工作需要完成,比如:SPARK-5097,需要添加一个data frame APIs到SchemaRDD;SPARK-4586,需要一个ML pipeline Python API;SPARK-3702,用于学习算法和模型的类层次结构。
原文链接:ML Pipelines: A New High-Level API for MLlib
  • 大小: 28.3 KB
  • 大小: 28.2 KB
  • 大小: 42.3 KB
0
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • spark(56) -- SparkMllib -- SparkMllib的功能和应用场景

    1. SparkMllib简介及功能介绍 2. SparkML版本变迁 3. SparkMllib架构详解 4. 基于RDD的API与基于DataFrame的API区别和应用 5. SparkMllib的环境搭建与IDEA环境配置 6. RDD、DataSet、Dataframe区别及转化过程

  • cookiecutter-fastapi:用于FastAPI项目的Cookiecutter模板,使用

    Cookiecutter是一个CLI工具(命令行界面),用于从模板创建应用程序样板。 它使用模板系统Jinja2来替换或自定义文件夹和文件名以及文件内容。 我该如何安装? pip install cookiecutter 如何生成FastAPI项目? ...

  • Spark MLlib/ML

    ML的API是面向Dataset的(Dataframe是Dataset的子集,也就是Dataset[Row])!!!DataFrame mllib是面对RDD的 Dataset和RDD有啥不一样呢?Dataset的底端是RDD。Dataset对RDD进行了更深一层的优化,比如说有sql语言类似...

  • mlr3pipelines:R中机器学习的数据流编程

    mlr3pipelines:R中机器学习的数据流编程

  • matlab除噪声代码-EEG-Pipelines:各种用于预处理EEG的自动化MATLAB管道

    该存储库包含多个管道,这些管道用于基准EEG预处理中的多少差异会影响下游结果,如以下论文中所述: 脑电图结果对预处理方法的敏感性:基准研究凯·罗宾斯(Kay A. Robbins),乔纳森·图扬(Jonathan Touryan),...

  • Spark入门梳理4-MLLIB机器学习-特征抽取与变换

    文章目录Spark编程基础-搭配JupyterSpark MLlib1.1 Spark MLlib简介1.2 机器学习工作流1.2.1 机器学习工作流(ML Pipelines)1.2.1.1 重要概念1.2.1.2 工作机制1.2.2 构建一个机器学习工作流1.2.2.1 传统流程1.2.2.2 ...

  • [Spark基础]-- spark ml和mllib库的说明

    一、Spark ML 1、定义 Spark机器学习 2、针对的对象:DataFrame (1)ml主要操作的是DataFrame。 (2)DataFrame和RDD什么关系?DataFrame是Dataset的子集,也就是Dataset[Row]。 (3)DataSet是对RDD的封装...

  • Spark ML Pipelines(ML管道)

    声明:代码主要以Scala为主,希望广大读者注意。... ML可以应用于各种各样的数据类型,比如向量、文本、图形和结构化数据、API采用Spark SQL的DataFrame就是为了支持各种各样的数据类型。 1、T...

  • Apach Spark - Validating Big Data & ML Pipelines

    This PDF document describe the design idea and sample codes how to validate big data in spark job.

  • Spark 中 ML 和 MLlib 的特点和区别

    大数据学习过程中一个重要的环节就是spark,但是在spark中有很多的知识点,很多人都傻傻分不清楚,其中,最易搞混的就是ml与mllib的区别,所以我们不妨来详细的了解一下二者的区别。 1. Spark ML 1)定义:ark...

  • spark:ML和MLlib的区别

    ML和MLlib的区别如下ML是升级版的MLlib,最新的Spark版本优先支持ML。ML支持DataFrame数据结构和Pipelines,而MLlib仅支持RDD数据结构。ML明确区分了分类模型和回归模型,而MLlib并未在顶层做此类区分。ML通过...

  • 基于Spark的机器学习实践 (二) - 初识MLlib

    1 MLlib概述 1.1 MLlib 介绍 ◆ 是基于Spark core的机器学习...1.2 Spark MLlib实现的算法 ◆ 逻辑回归 朴素贝叶斯 线性回归 SVM 决策树 LDA 矩阵分解 1.3 Spark MLlib官方介绍 1.3.1 搜索官方文档 1.3...

  • Apache Spark 3.0 机器学习库(MLlib)指南

    学习地址:https://spark.apache.org/docs/latest/ml-guide.html 学习目录 MLlib:主要指南 基本统计 数据源 流水线 提取,转换和选择特征 分类与回归 聚类 协同过滤 频繁模式挖掘 模型选择和调整 进阶...

  • 史上最简单的spark教程第二十二章-初识SparkMLlib机器学习库

    从Spark2.0开始,spark.mllib软件包中的基于RDD的API已进入维护模式,应该是只修复BUG和维护,不增加新的功能,Spark的主要学习API现在是spark.ml包中基于DataFrame的API SparkML和SparkMLlib的区别 首先简单...

  • SparkPipelineFramework:用于更简单的Spark Pipelines的框架

    (基于SparkML Pipeline类,但已增强为可用于ML和非ML转换) 无需编写任何代码即可运行SQL转换 启用转换的版本控制,以便不同的管道可以使用每个转换器的旧版本或新版本。 这使您可以自行选择升级每个管道 在创建...

  • SparkMLlib之01-Spark机器学习库介绍

    Spark机器学习库简介MLlib是Spark的机器学习库。旨在简化机器学习的工程实践工作,并方便扩展到更大规模。MLlib由一些通用的学习算法和工具组成,包括分类、回归、聚类、协同过滤、降维等,同时还包括底层的优化原语...

  • [转载]spark中ml与mllib 的区别

    1 关于Spark ML 1.1 定义 spark机器学习,对的对象:DataFrame。 1.2 对象 主要操作的是DataFrame。其中taFrame是Dataset的子集,也就是Dataset[Row]。DataSet是对RDD的封装,对SQL之类的操作做了很多优化。 2 关于...

  • spark ml pipelines

    spark ML Pipelines在spark2.0里mllib分为两个包,spark.mllib里是基于RDD的API,spark.ml里是基于 DataFrame的API。官方不会在基于RDD的mllib里添加新特性。所以建议使用ml包。在spark2.2时基于RDD的API会被废弃,...

  • Spark MLlib (1)

    sparkmllib学习笔记

Global site tag (gtag.js) - Google Analytics