1 MLlib概述
1.1 MLlib 介绍
◆ 是基于Spark core的机器学习库,具有Spark的优点
◆ 底层计算经过优化,比常规编码效率往往要高
◆ 实现了多种机器学习算法,可以进行模型训练及预测
1.2 Spark MLlib实现的算法
◆ 逻辑回归 朴素贝叶斯 线性回归 SVM 决策树 LDA 矩阵分解
1.3 Spark MLlib官方介绍
1.3.1 搜索官方文档
1.3.2 阅读文档 - 机器学习库(MLlib)指南
简介
MLlib是Spark的机器学习(ML)库。 其目标是使实用的机器学习可扩展且简单。 从较高的层面来说,它提供了以下工具:
- ML算法:常见的学习算法,如分类,回归,聚类和协同过滤
- 特征化:特征提取,转换,降维和选择
- 管道:用于构建,评估和调整ML管道的工具
- 持久性:保存和加载算法,模型和管道
- 实用程序:线性代数,统计,数据处理等。
公告:基于DataFrame的API是主要的API
基于MLlib RDD的API现在处于维护模式。
从Spark 2.0开始,spark.mllib
包中基于RDD的API已进入维护模式。 Spark的主要机器学习API现在是spark.ml
包中基于DataFrame的API
有什么影响?
- MLlib仍将支持
spark.mllib中
基于RDD的API以及错误修复 - MLlib不会为基于RDD的API添加新功能
- 在Spark 2.x版本中,MLlib将为基于DataFrames的API添加功能,以实现与基于RDD的API的功能奇偶校验。
- 在达到功能奇偶校验(粗略估计Spark 2.3)之后,将弃用基于RDD的API。
- 预计基于RDD的API将在Spark 3.0中删除。
为什么MLlib会切换到基于DataFrame的API?
- DataFrames提供比RDD更加用户友好的API。 DataFrame的许多好处包括Spark数据源,SQL / DataFrame查询,Tungsten和Catalyst优化以及跨语言的统一API。
- 基于DataFrame的MLlib API跨ML算法和多种语言提供统一的API。
- DataFrames有助于实用的ML管道,特别是功能转换。有关详细信息,请参阅管道指南
什么是“Spark ML”?
“Spark ML”不是官方名称,但偶尔用于指代基于MLlib DataFrame的API。这主要是由于基于DataFrame的API使用的org.apache.spark.ml Scala
包名称,以及我们最初用来强调管道概念的“Spark ML Pipelines”术语。
MLlib已被弃用吗?
不,MLlib包括基于RDD的API和基于DataFrame的API。基于RDD的API现在处于维护模式。但是,API都不被弃用,也不是MLlib
依赖关系
MLlib使用线性代数包Breeze,它依赖于netlib-java进行优化的数值处理。如果本机库1在运行时不可用,您将看到一条警告消息,而将使用纯JVM实现。
由于运行时专有二进制文件的许可问题,我们默认不包括netlib-java的本机代理。要配置netlib-java / Breeze以使用系统优化的二进制文件,请包含com.github.fommil.netlib:all:1.1.2(或使用-Pnetlib-lgpl构建Spark)作为项目的依赖项并阅读netlib-java文档为您的平台提供其他安装说明。
最受欢迎的原生BLAS,如英特尔MKL,OpenBLAS,可以在一次操作中使用多个线程,这可能与Spark的执行模型冲突。
配置这些BLAS实现以使用单个线程进行操作实际上可以提高性能(请参阅SPARK-21305)。通常最好将此与每个Spark任务配置使用的核心数相匹配,默认情况下为1,通常保留为1。
请参考以下资源,了解如何配置这些BLAS实现使用的线程数:Intel MKL和OpenBLAS。
要在Python中使用MLlib,您将需要NumPy 1.4或更高版本。
2.3中的亮点
下面的列表重点介绍了Spark 2.3版本中添加到MLlib的一些新功能和增强功能:
- 添加了内置支持将图像读入DataFrame(SPARK-21866)。
- 添加了OneHotEncoderEstimator,应该使用它来代替现有的OneHotEncoder转换器。 新的估算器支持转换多个列。
- QuantileDiscretizer和Bucketizer(SPARK-22397和SPARK-20542)也增加了多列支持
- 添加了一个新的FeatureHasher变换器(SPARK-13969)。
- 在使用TrainValidationSplit或CrossValidator(SPARK-19357)执行交叉验证时,添加了对并行评估多个模型的支持。
- 改进了对Python中自定义管道组件的支持(请参阅SPARK-21633和SPARK-21542)。
- DataFrame函数用于矢量列的描述性摘要统计(SPARK-19634)。
- Huber损失的稳健线性回归(SPARK-3181)。
打破变化
逻辑回归模型摘要的类和特征层次结构被更改为更清晰,更好地适应了多类摘要的添加。对于将LogisticRegressionTrainingSummary强制转换为BinaryLogisticRegressionTrainingSummary的用户代码,这是一个重大变化。用户应该使用model.binarySummary方法。有关更多详细信息,请参阅SPARK-17139(请注意,这是一个实验API)。这不会影响Python摘要方法,它对于多项和二进制情况仍然可以正常工作。
废弃和行为变化
弃用
OneHotEncoder已被弃用,将在3.0中删除。它已被新的OneHotEncoderEstimator所取代(参见SPARK-13030)。请注意,OneHotEncoderEstimator将在3.0中重命名为OneHotEncoder(但OneHotEncoderEstimator将保留为别名)。
行为的变化
- SPARK-21027:OneVsRest中使用的默认并行度现在设置为1(即串行)。在2.2及更早版本中,并行度级别设置为Scala中的默认线程池大小。
- SPARK-22156:当numIterations设置为大于1时,Word2Vec的学习速率更新不正确。这将导致2.3和早期版本之间的训练结果不同。
- SPARK-21681:修复了多项Logistic回归中的边缘案例错误,当某些特征的方差为零时,导致系数不正确。
- SPARK-16957:树算法现在使用中点来分割值。这可能会改变模型训练的结果。
- SPARK-14657:修复了RFormula在没有截距的情况下生成的特征与R中的输出不一致的问题。这可能会改变此场景中模型训练的结果。