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

请注意,本迁移指南描述了 MLlib 特有的项目。在将 MLlib 迁移到更高版本的基于 DataFrame 的 API 时,许多 SQL 迁移项目也适用。请参阅 迁移指南:SQL、Datasets 和 DataFrame

从 MLlib 3.5 升级到 4.0

重大变更

无重大变更。

弃用和行为变更

弃用

无弃用。

行为变更

从 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。现在,spark.ml 中的基于 DataFrame 的 API 依赖于 spark.ml.linalg 类,导致了一些重大变更,主要体现在各种模型类中(参见 SPARK-14810 了解完整列表)。

注意: spark.mllib 中基于 RDD 的 API 继续依赖于以前的包 spark.mllib.linalg

转换向量和矩阵

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

还提供了用于转换单个向量和矩阵实例的实用方法。使用 mllib.linalg.Vector / mllib.linalg.Matrix 上的 asML 方法进行转换为 ml.linalg 类型,并使用 mllib.linalg.Vectors.fromML / mllib.linalg.Matrices.fromML 进行转换为 mllib.linalg 类型。

from pyspark.mllib.util import MLUtils

# convert DataFrame columns
convertedVecDF = MLUtils.convertVectorColumnsToML(vecDF)
convertedMatrixDF = MLUtils.convertMatrixColumnsToML(matrixDF)
# convert a single vector or matrix
mlVec = mllibVec.asML()
mlMat = mllibMat.asML()

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

import org.apache.spark.mllib.util.MLUtils

// convert DataFrame columns
val convertedVecDF = MLUtils.convertVectorColumnsToML(vecDF)
val convertedMatrixDF = MLUtils.convertMatrixColumnsToML(matrixDF)
// convert a single vector or matrix
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;

// convert DataFrame columns
Dataset<Row> convertedVecDF = MLUtils.convertVectorColumnsToML(vecDF);
Dataset<Row> convertedMatrixDF = MLUtils.convertMatrixColumnsToML(matrixDF);
// convert a single vector or matrix
org.apache.spark.ml.linalg.Vector mlVec = mllibVec.asML();
org.apache.spark.ml.linalg.Matrix mlMat = mllibMat.asML();

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

已移除的弃用方法

spark.mllibspark.ml 包中移除了几个已弃用的方法

重大变更的完整列表可在 SPARK-14810 中找到。

弃用和行为变更

弃用

spark.mllibspark.ml 包中的弃用包括

行为变更

spark.mllibspark.ml 包中的行为变更包括

从 MLlib 1.5 升级到 1.6

spark.mllibspark.ml 包中没有重大 API 更改,但有弃用和行为变更。

弃用

行为变更

从 MLlib 1.4 升级到 1.5

spark.mllib 包中,没有重大 API 更改,但有一些行为更改

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

从 MLlib 1.3 升级到 1.4

spark.mllib 包中,有几项重大变更,但都发生在 DeveloperApiExperimental 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 参数可通过 StrategyDecisionTree 静态 trainClassifiertrainRegressor 方法指定。

  2. (重大变更)Node 的 API 已更改。这通常不应影响用户代码,除非用户手动构造决策树(而不是使用 trainClassifiertrainRegressor 方法)。树 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-learnrpart 中树的实现相匹配。在 MLlib v1.0 中,深度为 1 的树有 1 个叶节点,深度为 2 的树有 1 个根节点和 2 个叶节点。在 MLlib v1.1 中,深度为 0 的树有 1 个叶节点,深度为 1 的树有 1 个根节点和 2 个叶节点。此深度由 Strategy 中的 maxDepth 参数或通过 DecisionTree 静态 trainClassifiertrainRegressor 方法指定。

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

新推荐的 trainClassifiertrainRegressor 的示例在 决策树指南 中给出。

从 MLlib 0.9 升级到 1.0

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