迁移指南:MLlib(机器学习)

请注意,此迁移指南描述了特定于 MLlib 的项目。 在将 MLlib 迁移到更高版本的 DataFrame 基于 API 时,可以应用许多 SQL 迁移项。 请参阅 迁移指南:SQL、数据集和 DataFrame

从 MLlib 2.4 升级到 3.0

重大变更

废弃和行为变化

弃用

行为的变化

从 MLlib 2.2 升级到 2.3

重大变更

弃用和行为变化

弃用

行为的变化

从 MLlib 2.1 升级到 2.2

破坏性变更

没有重大变更。

弃用和行为变化

弃用

没有弃用。

行为的变化

从 MLlib 2.0 升级到 2.1

重大变更

已移除弃用的方法

弃用及行为变化

弃用

行为的变化

从 MLlib 1.6 升级到 2.0

重大变更

在Spark 2.0中有几个重大变化,具体如下。

基于DataFrame的API的线性代数课程

Spark的线性代数依赖项已被移动到一个新项目, mllib-local (请参见 SPARK-13944 )。 作为此更改的一部分,线性代数类被复制到一个新包中, spark.ml.linalg 。 基于DataFrame的API在 spark.ml 中现在依赖于 spark.ml.linalg 类, 这导致了一些重大变更,主要在各种模型类中 (请参见 SPARK-14810 以获取完整列表)。

注意: 基于RDD的API在 spark.mllib 中仍然依赖于之前的包 spark.mllib.linalg

转换向量和矩阵

虽然大多数管道组件支持加载的向后兼容,但在 2.0 之前的 Spark 版本中,一些包含向量或矩阵列的现有 DataFrames 和管道可能需要迁移到新的 spark.ml 向量和矩阵类型。将 DataFrame 列从 spark.mllib.linalg 转换为 spark.ml.linalg 类型的工具(反之亦然)可以在 spark.mllib.util.MLUtils 中找到。

还有一些工具方法可以用于转换单个实例的向量和矩阵。使用 asML 方法在 mllib.linalg.Vector / mllib.linalg.Matrix 上进行转换为 ml.linalg 类型,并使用 mllib.linalg.Vectors.fromML / mllib.linalg.Matrices.fromML 进行转换为 mllib.linalg 类型。

from pyspark.mllib.util import MLUtils
# 转换 DataFrame 列
convertedVecDF = MLUtils.convertVectorColumnsToML(vecDF)
convertedMatrixDF = MLUtils.convertMatrixColumnsToML(matrixDF)
# 转换单个向量或矩阵
mlVec = mllibVec.asML()
mlMat = mllibMat.asML()

有关详细信息,请参阅 MLUtils Python 文档

import org.apache.spark.mllib.util.MLUtils
// 转换 DataFrame 列
val convertedVecDF = MLUtils.convertVectorColumnsToML(vecDF)
val convertedMatrixDF = MLUtils.convertMatrixColumnsToML(matrixDF)
// 转换单个向量或矩阵
val mlVec: org.apache.spark.ml.linalg.Vector = mllibVec.asML
val mlMat: org.apache.spark.ml.linalg.Matrix = mllibMat.asML

有关更多细节,请参考 MLUtils Scala 文档

import org.apache.spark.mllib.util.MLUtils;
import org.apache.spark.sql.Dataset;
// 转换 DataFrame 列
Dataset<Row> convertedVecDF = MLUtils.convertVectorColumnsToML(vecDF);
Dataset<Row> convertedMatrixDF = MLUtils.convertMatrixColumnsToML(matrixDF);
// 转换单个向量或矩阵
org.apache.spark.ml.linalg.Vector mlVec = mllibVec.asML();
org.apache.spark.ml.linalg.Matrix mlMat = mllibMat.asML();

有关更多详细信息,请参阅 MLUtils Java 文档

已移除弃用的方法

spark.mllib spark.ml 包中,删除了一些已弃用的方法:

有关所有重大更改的完整列表,请查看 SPARK-14810

弃用和行为变化

弃用

spark.mllib spark.ml 包中的弃用内容包括:

行为的变化

spark.mllib spark.ml 包中的行为变化包括:

从 MLlib 1.5 升级到 1.6

spark.mllib spark.ml 包中没有重大的 API 变化,但有一些弃用和行为变化。

弃用:

行为的变化:

从 MLlib 1.4 升级到 1.5

spark.mllib 包中,没有重大的API变化,但有几个行为上的变化:

spark.ml 包中,存在一个重大API更改和一个行为更改:

从 MLlib 1.3 升级到 1.4

spark.mllib 包中,有几个重大变化,但都是在 DeveloperApi Experimental API 中:

spark.ml 包中,发生了一些主要的API更改,包括:

由于 spark.ml API 在 Spark 1.3 中是一个 alpha 组件,我们不在这里列出所有的变更。 但是,从 1.4 开始 spark.ml 不再是一个 alpha 组件,我们将提供未来版本中任何 API 变更的详细信息。

从 MLlib 1.2 升级到 1.3

spark.mllib 包中,有几个重大变化。第一个变化(在 ALS 中)是唯一一个在未标记为 Alpha 或 Experimental 的组件中的变化。

spark.ml 包中,主要的 API 变化来自于 Spark SQL。我们在这里列出了最重要的变化:

其他更改在 LogisticRegression 中:

从 MLlib 1.1 升级到 1.2

在MLlib v1.2中唯一的API更改是在 DecisionTree , 它仍然是MLlib 1.2中的实验性API:

  1. (重要变更) Scala API用于分类时需要一个命名参数来指定类别的数量。在MLlib v1.1中,该参数在Python中被称为 numClasses ,在Scala中被称为 numClassesForClassification 。在MLlib v1.2中,这两个名称都设置为 numClasses 。这个 numClasses 参数可以通过 Strategy 或者通过 DecisionTree 的静态 trainClassifier trainRegressor 方法来指定。

  2. (重要变更) Node 的 API 已经更改。这通常不应该影响用户代码,除非用户手动构建决策树(而不是使用 trainClassifier trainRegressor 方法)。树的 Node 现在包含更多信息,包括预测标签的概率(用于分类)。

  3. 打印方法的输出已更改。 toString (Scala/Java)和 __repr__ (Python)方法用于打印完整模型;现在它们打印摘要。要获取完整模型,请使用 toDebugString

Spark发行版中的示例和 决策树指南 中的示例已相应更新。

从 MLlib 1.0 升级到 1.1

在MLlib v1.1中唯一的API更改在于 DecisionTree , 它继续作为MLlib 1.1中的实验性API:

  1. (重大变更) 树的深度含义已更改为 1,以匹配 scikit-learn rpart 中的实现。 在 MLlib v1.0 中,深度为 1 的树有 1 个叶子节点,深度为 2 的树有 1 个根节点和 2 个叶子节点。 在 MLlib v1.1 中,深度为 0 的树有 1 个叶子节点,深度为 1 的树有 1 个根节点和 2 个叶子节点。 这个深度由 maxDepth 参数指定,在 Strategy 或通过 DecisionTree 静态 trainClassifier trainRegressor 方法。

  2. (非重大变更) 我们建议使用新添加的 trainClassifier trainRegressor 方法来构建 DecisionTree , 而不是使用旧的参数类 Strategy 。这些新的训练方法明确区分了分类和回归,并用 简单的 String 类型替代了专用参数类型。

新的推荐的 trainClassifier trainRegressor 的示例请参见 决策树指南

从 MLlib 0.9 升级到 1.0

在 MLlib v1.0 中,我们以统一的方式支持密集输入和稀疏输入,这引入了一些重大更改。如果您的数据是稀疏的,请以稀疏格式存储它,而不是密集格式,以利用存储和计算中的稀疏性。详细信息如下所述。