机器学习库 (MLlib) 指南
MLlib 是 Spark 的机器学习 (ML) 库。 它的目标是使实用的机器学习可扩展且简单。 从高层次来看,它提供了以下工具:
- 机器学习算法:常见的学习算法,如分类、回归、聚类和协同过滤
- 特征化:特征提取、转换、降维和选择
- 管道:构建、评估和调整机器学习管道的工具
- 持久性:保存和加载算法、模型和管道
- 实用程序:线性代数、统计、数据处理等
公告:基于DataFrame的API是主要API
MLlib基于RDD的API现在处于维护模式。
自 Spark 2.0 起,
RDD
驱动的 API 在
spark.mllib
包中已经进入维护模式。Spark 的主要机器学习 API 现在是
DataFrame
驱动的 API,在
spark.ml
包中。
这有什么影响?
-
MLlib 仍将支持基于 RDD 的 API
spark.mllib,并进行错误修复。 - MLlib 不会向基于 RDD 的 API 添加新功能。
- 在 Spark 2.x 版本中,MLlib 将向基于 DataFrames 的 API 添加功能,以达到与基于 RDD 的 API 的功能对等。
为什么MLlib要切换到基于DataFrame的API?
- 数据框提供比RDD更友好的API。数据框的众多优点包括Spark数据源、SQL/DataFrame查询、Tungsten和Catalyst优化,以及跨语言的统一API。
- 基于DataFrame的MLlib API在ML算法和多种语言之间提供统一的API。
- 数据框促进了实用的ML管道,特别是特征转换。有关详细信息,请参见 管道指南 。
什么是“Spark ML”?
-
“Spark ML” 不是一个官方名称,但偶尔用来指代基于 DataFrame 的 MLlib API。这主要是因为基于 DataFrame 的 API 使用的
org.apache.spark.mlScala 包名称,以及我们最初使用的 “Spark ML Pipelines” 一词来强调管道概念。
MLlib 被弃用了吗?
- 不。MLlib 包括基于 RDD 的 API 和基于 DataFrame 的 API。 基于 RDD 的 API 现在处于维护模式。 但这两个 API 都没有被弃用,MLlib 整体也没有。
依赖项
MLlib使用线性代数包 Breeze 和 dev.ludovic.netlib 进行优化的数值处理 1 。这些软件包可以调用本地加速库,如 Intel MKL 或 OpenBLAS ,前提是它们作为系统库或在运行时库路径中可用。
然而,原生加速库无法与Spark一起分发。请参见 MLlib线性代数加速指南 了解如何启用加速的线性代数处理。如果未启用加速的原生库,您将看到如下警告信息,并将使用纯JVM实现:
警告:无法从:dev.ludovic.netlib.blas.JNIBLAS 加载实现
要在Python中使用MLlib,您需要 NumPy 版本1.4或更高版本。
3.0 的亮点
下面的列表强调了一些在 Spark 的
3.0
版本中添加到 MLlib 的新功能和增强特性:
-
对
Binarizer( SPARK-23578 ),StringIndexer( SPARK-11215 ),StopWordsRemover( SPARK-29808 ) 和 PySparkQuantileDiscretizer( SPARK-22796 ) 添加了对多列的支持。 - 添加了基于树的特征转换 ( SPARK-13677 ).
-
添加了两个新的评估器
MultilabelClassificationEvaluator( SPARK-16692 ) 和RankingEvaluator( SPARK-28045 )。 -
在
DecisionTreeClassifier/Regressor( SPARK-19591 ),RandomForestClassifier/Regressor( SPARK-9478 ),GBTClassifier/Regressor( SPARK-9612 ),MulticlassClassificationEvaluator( SPARK-24101 ),RegressionEvaluator( SPARK-24102 ),BinaryClassificationEvaluator( SPARK-24103 ),BisectingKMeans( SPARK-30351 ),KMeans( SPARK-29967 ) 和GaussianMixture( SPARK-30102 ) 中添加了样本权重支持。 -
为
PowerIterationClustering添加了 R API ( SPARK-19827 ). - 添加了 Spark ML 监听器以跟踪 ML管道状态 ( SPARK-23674 ).
- 在 Python 中对梯度提升树添加了带有验证集的适配 ( SPARK-24333 ).
-
RobustScaler变换器被添加 ( SPARK-28399 ). -
Factorization Machines分类器和回归器被添加 ( SPARK-29224 ). - 添加了高斯朴素贝叶斯分类器 ( SPARK-16872 ) 和补充朴素贝叶斯分类器 ( SPARK-29942 )。
- Scala 和 Python 之间的 ML 函数一致性 ( SPARK-28958 ).
-
predictRaw在所有分类模型中公开。predictProbability在所有分类模型中公开,但LinearSVCModel除外 ( SPARK-30358 ).
迁移指南
迁移指南现在已被存档 在此页面 。
-
要了解系统优化本地的好处和背景,您可能希望观看Sam Halliday关于 Scala中的高性能线性代数 的ScalaX演讲。 ↩