迁移指南: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.linalgspark.ml 中基于 DataFrame 的 API 现在依赖于 spark.ml.linalg 类,这导致了一些重大更改,主要是在各种模型类中 (参见 SPARK-14810 以获取完整列表)。

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

转换向量和矩阵

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

还有一些可用于转换向量和矩阵的单个实例的实用方法。 在 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 参数通过 Strategy 或通过 DecisionTree 静态 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. (重大变更) 为了与 scikit-learnrpart 中的树的实现方式保持一致,树的深度含义已更改了 1。在 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 中,我们以统一的方式支持密集和稀疏输入,这引入了一些重大变更。如果您的数据是稀疏的,请将其存储为稀疏格式而不是密集格式,以便在存储和计算中利用稀疏性。详细信息如下所述。