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

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

从 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 向量和矩阵类型。用于将 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 参数通过 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. (重大变更) 为了匹配 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 中,我们以统一的方式支持密集和稀疏输入,这引入了一些重大更改。如果您的数据是稀疏的,请将其存储为稀疏格式而不是密集格式,以便在存储和计算中利用稀疏性。详细信息如下所述。