MLlib 是 Apache Spark 的可扩展机器学习库,旨在简化机器学习的工程实践工作,并方便扩展到更大规模的数据集。

机器学习简介

在深入介绍 Spark MLlib 之前先了解机器学习,根据维基百科的介绍,机器学习有下面几种定义:机器学习是一门人工智能的科学,该领域的主要研究对象是人工智能,特别是如何在经验学习中改善具体算法的性能;

机器学习是对能通过经验自动改进的计算机算法的研究;

机器学习是用数据或以往的经验,以此优化计算机程序的性能标准;

一种经常引用的英文定义是「A computer program is said to learn from experienceE with respect to some class of tasks T and performance measure P, if its performance at tasks in T, as measured by P, improves with experience E.」。

其实在「美图数据技术团队」之前的科普文章

机器学习常用的算法可以分为以下种类:1.构造间隔理论分布:人工神经网络、决策树、感知器、支持向量机、集成学习 AdaBoost、降维与度量学习、聚类、贝叶斯分类器;

2.构造条件概率:高斯过程回归、线性判别分析、最近邻居法、径向基函数核;3.通过再生模型构造概率密度函数:最大期望算法、概率图模型(贝叶斯网和 Markov 随机场)、Generative Topographic Mapping;4.近似推断技术:马尔可夫链、蒙特卡罗方法、变分法;5.最优化算法。

Spark MLlib

在上文我们曾提到机器学习的重点之一是「经验」,而对于计算机而言经验往往需要经过多轮迭代计算才能得到,而 Spark 擅长迭代计算,正好符合机器学习这一特性。在 Spark 官网上展示了逻辑回归算法在 Spark 和 Hadoop 上运行性能比较,从下图可以看出 MLlib 比 MapReduce 快了 100 倍。

Spark MLlib 主要包括以下几方面的内容:学习算法:分类、回归、聚类和协同过滤;

特征处理:特征提取、变换、降维和选择;

管道(Pipeline):用于构建、评估和调整机器学习管道的工具;

持久性:保存和加载算法,模型和管道;

实用工具:线性代数,统计,最优化,调参等工具。

上表总结了 Spark MLlib 支持的功能结构,可以看出它所提供的算法丰富,但算法种类较少并且老旧,因此 Spark MLlib 在算法上支持与 kylin 项目有些脱节,它的主要功能更多是与特征相关的。

ML Pipelines

从 Spark 2.0 开始基于 RDD 的 API 进入维护模式,Spark 的主要机器学习 API 现在是基于 DataFrame 的 API spark.ml,借鉴 Scikit-Learn 的设计提供了 Pipeline 套件,以构建机器学习工作流。 ML Pipelines 提供了一套基于 DataFrame 构建的统一的高级 API ,可帮助用户创建和调整实用的机器学习流程。

*「Spark ML」不是官方名称,偶尔用于指代基于 MLlib DataFrame 的 API

首先了解 ML Pipelines 内几个重要组件。

DataFrame

DataFrame 让 Spark 具备了处理大规模结构化数据的能力。

RDD 是分布式 Java 对象的集合,对象的内部数据结构对于 RDD 而言不可知。DataFrame 是一种以 RDD 为基础的分布式数据集,RDD 中存储了 Row 对象,Row 对象提供了详细的结构信息,即模式(schema),使得 DataFrame 具备了结构化数据的能力。

Transforme

Transformer 通常是一个数据/特征变换的类,或一个训练好的模型。

每个 Transformer 都有 transform 函数,用于将一个 DataFrame 转换为另一个 DataFrame 。一般 transform 的过程是在输入的 DataFrame 上添加一列或者多列 ,Transformer.transform也是惰性执行,只会生成新的 DataFrame 变量,而不会去提交 job 计算 DataFrame 中的内容。

Estimator

Estimator 抽象了从输入数据学习模型的过程,每个 Estimator 都实现了 fit 方法,用于给定 DataFrame 和 Params 后,生成一个 Transformer(即训练好的模型),每当调用 Estimator.fit() 后,都会产生 job 去训练模型,得到模型参数。

Param

可以通过设置 Transformer 或 Estimator 实例的参数来设置模型参数,也可以通过传入 ParamMap 对象来设置模型参数。

Pipeline

Pipeline 定义了一组数据处理流程,可以在 Pipeline 中加入 Transformer、Estimator 或另一个 Pipeline。Pipeline 继承自 Estimator,调用 Pipeline.fit 方法后返回一个 Transformer——PipelineModel;PipelineModel 继承自 Transformer,用于将输入经过 Pipeline 的各个 Transformer 的变换后,得到最终输出。

Spark MLlib 典型流程如下:构造训练数据集

构建各个 Stage

Stage 组成 Pipeline

启动模型训练

评估模型效果

计算预测结果

通过一个 Pipeline 的文本分类示例来加深理解:

import org.apache.spark.ml.{Pipeline, PipelineModel}

import org.apache.spark.ml.classification.LogisticRegression

import org.apache.spark.ml.feature.{HashingTF, Tokenizer}

import org.apache.spark.ml.linalg.Vector

import org.apache.spark.sql.Row

// Prepare training documents from a list of (id, text, label) tuples.

val training = spark.createDataFrame(Seq(

(0L, "a b c d e spark", 1.0),

(1L, "b d", 0.0),

(2L, "spark f g h", 1.0),

(3L, "hadoop mapreduce", 0.0)

)).toDF("id", "text", "label")

// Configure an ML pipeline, which consists of three stages: tokenizer, hashingTF, and lr.

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.001)

val pipeline = new Pipeline()

.setStages(Array(tokenizer, hashingTF, lr))

// Fit the pipeline to training documents.

val model = pipeline.fit(training)

// Now we can optionally save the fitted pipeline to disk

model.write.overwrite().save("/tmp/spark-logistic-regression-model")

// We can also save this unfit pipeline to disk

pipeline.write.overwrite().save("/tmp/unfit-lr-model")

// And load it back in during production

val sameModel = PipelineModel.load("/tmp/spark-logistic-regression-model")

// Prepare test documents, which are unlabeled (id, text) tuples.

val test = spark.createDataFrame(Seq(

(4L, "spark i j k"),

(5L, "l m n"),

(6L, "spark hadoop spark"),

(7L, "apache hadoop")

)).toDF("id", "text")

// Make predictions on test documents.

model.transform(test)

.select("id", "text", "probability", "prediction")

.collect()

.foreach { case Row(id: Long, text: String, prob: Vector, prediction: Double) =>

println(s"($id, $text) --> prob=$prob, prediction=$prediction")

}复制代码

模型选择与调参

Spark MLlib 提供了 CrossValidator 和 TrainValidationSplit 两个模型选择和调参工具。模型选择与调参的三个基本组件分别是 Estimator、ParamGrid 和 Evaluator,其中 Estimator 包括算法或者 Pipeline;ParamGrid 即 ParamMap 集合,提供参数搜索空间;Evaluator 即评价指标。

CrossValidator

via https://github.com/JerryLead/blogs/blob/master/BigDataSystems/Spark/ML/Introduction%20to%20MLlib%20Pipeline.md

CrossValidator 将数据集按照交叉验证数切分成 n 份,每次用 n-1 份作为训练集,剩余的作为测试集,训练并评估模型,重复 n 次,得到 n 个评估结果,求 n 次的平均值作为这次交叉验证的结果。接着对每个候选 ParamMap 重复上面的过程,选择最优的 ParamMap 并重新训练模型,得到最优参数的模型输出。

mllib调参 spark_从Spark MLlib到美图机器学习框架实践相关推荐

  1. mllib调参 spark_《Spark 官方文档》机器学习库(MLlib)指南

    我们推荐您使用spark.ml,因为基于DataFrames的API更加的通用而且灵活.不过我们也会继续支持spark.mllib包.用户可以放心使用,spark.mllib还会持续地增加新的功能.不 ...

  2. 机器学习_机器不学习:从Spark MLlib到美图机器学习框架实践

    / 机器学习简介 / 在深入介绍 Spark MLlib 之前先了解机器学习,根据维基百科的介绍,机器学习有下面几种定义: 机器学习是一门人工智能的科学,该领域的主要研究对象是人工智能,特别是如何在经 ...

  3. 从Spark MLlib到美图机器学习框架实践

    MLlib 是 Apache Spark 的可扩展机器学习库,旨在简化机器学习的工程实践工作,并方便扩展到更大规模的数据集. 机器学习简介 在深入介绍 Spark MLlib 之前先了解机器学习,根据 ...

  4. mllib调参 spark_Spark入门:MLlib基本数据类型(1)

    [版权声明]博客内容由厦门大学数据库实验室拥有版权,未经允许,请勿转载! MLLib提供了一序列基本数据类型以支持底层的机器学习算法.主要的数据类型包括:本地向量.标注点(Labeled Point) ...

  5. mllib逻辑回归 spark_《Spark大数据分析实战》笔记

    写在前面:此书很棒,但需要一定的编程功底,此外强烈建议买书,因为很多架构图.算子列表,我也不会摘抄下来. 第一章 简介 1.Spark执行的特点 Hadoop中包含计算框架MapReduce和分布式文 ...

  6. mllib调参 spark_Spark MLlib协同过滤算法

    算法说明 协同过滤(Collaborative Filtering,简称CF,WIKI上的定义是:简单来说是利用某个兴趣相投.拥有共同经验之群体的喜好来推荐感兴趣的资讯给使用者,个人透过合作的机制给予 ...

  7. 学习笔记Spark(十)—— Spark MLlib应用(2)—— Spark MLlib应用

    三.Spark MLlib应用 3.1.Spark ML线性模型 数据准备 基于Spark ML的线性模型需要DataFrame类型的模型数据,DataFrame需要包含:一列标签列,一列由多个特征合 ...

  8. Spark MLlib学习笔记之二——Spark Mllib矩阵向量

    Spark Mllib底层的向量.矩阵运算使用了Breeze库,Breeze库提供了Vector/Matrix的实现以及相应计算的接口(Linalg).但是在MLlib里面同时也提供了Vector和L ...

  9. 自动化调参NNI学习(三):使用python启动NNI框架调整随机森林(RandomForest)模型

    首先按照NNI框架的要求写一个调参的代码文件my_rf.py: import nni from sklearn.model_selection import train_test_split impo ...

最新文章

  1. C语言的变量的内存分配
  2. 8.2 动力系统的贝叶斯推理
  3. 【题意+分析】1043 Is It a Binary Search Tree (25 分)
  4. 关于用Restful API下载网易云笔记时遇到的图片外链不能打开的问题
  5. 【47.92%】【hdu 5763】Another Meaning
  6. Oracle给表和字段添加注释
  7. python怎么连接数据库并且查看数据是否存在_如何使用python连接数据库,插入并查询数据...
  8. 一篇带你完全掌握线程的博客
  9. python读取文件大小、时间_Python从netCDF文件读取数据,时间为测量开始后的“秒数”...
  10. Zuul使用Ribbon配置自动重试
  11. 嵌入式linux学习笔记(2)
  12. 3DMax 卡死、白屏、渲染死机问题总结
  13. 计算机一级ps教程自学网,ps教程自学网
  14. 变更DirectX SDK版本-DirectX8升级DirectX9
  15. 银行笔试题目汇总——综合能力测试
  16. 华为安装gsm框架_华为mate30怎么安装谷歌服务?华为mate30系列安装GMS框架图文教程...
  17. canvas绘制火柴人
  18. 创建型设计模模式---原型模式
  19. 腾讯地图JS API制作专题图
  20. MCS-51单片机C语言程序注释,精通MCS-51单片机C语言编程

热门文章

  1. Chroot vsftpd with non-system users (ftp)
  2. 2008年CCNA第三学期第一单元中文题目(2008-12-21 18:30:01
  3. oracle 数据库备份恢复
  4. 【转】Android BroadcastReceiver介绍
  5. 正则表达式中的小括号用法
  6. [转]卓越科技回应所谓的最牛,最受歧视的招聘
  7. java 取得日期_java-如何从某个日期获取日期列表?
  8. win10停止更新_新电脑到手第一件事,win10系统刷成win7,为何不直接预装win7?
  9. 【学习笔记】6、标准数据类型—数字类型
  10. SAP SD:SAP信贷出口