迁移指南:MLlib(机器学习)
- 从 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
- 从 MLlib 1.5 升级到 1.6
- 从 MLlib 1.4 升级到 1.5
- 从 MLlib 1.3 升级到 1.4
- 从 MLlib 1.2 升级到 1.3
- 从 MLlib 1.1 升级到 1.2
- 从 MLlib 1.0 升级到 1.1
- 从 MLlib 0.9 升级到 1.0
请注意,本迁移指南介绍了 MLlib 特有的项目。将 MLlib 迁移到更高版本以使用基于 DataFrame 的 API 时,可以应用 SQL 迁移的许多项目。请参阅迁移指南:SQL、数据集和数据帧。
从 MLlib 2.4 升级到 3.0
重大更改
- 在 2.3 中已弃用的
OneHotEncoder
在 3.0 中已移除,OneHotEncoderEstimator
现在已重命名为OneHotEncoder
。 - 在 2.3 中已弃用的
org.apache.spark.ml.image.ImageSchema.readImages
在 3.0 中已移除,请改用spark.read.format('image')
。 - 在 2.1 中已弃用的带参数 Int
runs
的org.apache.spark.mllib.clustering.KMeans.train
在 3.0 中已移除。请改用不带runs
的train
方法。 - 在 2.0 中已弃用的
org.apache.spark.mllib.classification.LogisticRegressionWithSGD
在 3.0 中已移除,请改用org.apache.spark.ml.classification.LogisticRegression
或spark.mllib.classification.LogisticRegressionWithLBFGS
。 - 在 2.1 中已弃用的
org.apache.spark.mllib.feature.ChiSqSelectorModel.isSorted
在 3.0 中已移除,不适用于子类使用。 - 在 2.0 中已弃用的
org.apache.spark.mllib.regression.RidgeRegressionWithSGD
在 3.0 中已移除,请将org.apache.spark.ml.regression.LinearRegression
与elasticNetParam
= 0.0 一起使用。请注意,RidgeRegressionWithSGD
的默认regParam
为 0.01,而LinearRegression
的默认regParam
为 0.0。 - 在 2.0 中已弃用的
org.apache.spark.mllib.regression.LassoWithSGD
在 3.0 中已移除,请将org.apache.spark.ml.regression.LinearRegression
与elasticNetParam
= 1.0 一起使用。请注意,LassoWithSGD
的默认regParam
为 0.01,而LinearRegression
的默认regParam
为 0.0。 - 在 2.0 中已弃用的
org.apache.spark.mllib.regression.LinearRegressionWithSGD
在 3.0 中已移除,请改用org.apache.spark.ml.regression.LinearRegression
或LBFGS
。 - 在 2.1 中已弃用的
org.apache.spark.mllib.clustering.KMeans.getRuns
和setRuns
在 3.0 中已移除,自 Spark 2.0.0 起无效。 - 在 2.4 中已弃用的
org.apache.spark.ml.LinearSVCModel.setWeightCol
在 3.0 中已移除,不适用于用户使用。 - 从 3.0 开始,
org.apache.spark.ml.classification.MultilayerPerceptronClassificationModel
扩展了MultilayerPerceptronParams
以公开训练参数。因此,MultilayerPerceptronClassificationModel
中的layers
已从Array[Int]
更改为IntArrayParam
。用户应使用MultilayerPerceptronClassificationModel.getLayers
而不是MultilayerPerceptronClassificationModel.layers
来检索层的数量。 - 在 2.4.5 中已弃用的
org.apache.spark.ml.classification.GBTClassifier.numTrees
在 3.0 中已移除,请改用getNumTrees
。 - 在 2.4 中已弃用的
org.apache.spark.ml.clustering.KMeansModel.computeCost
在 3.0 中已移除,请改用ClusteringEvaluator
。 - 在 2.0 中已弃用的
org.apache.spark.mllib.evaluation.MulticlassMetrics
中的成员变量precision
在 3.0 中已移除。请改用accuracy
。 - 在 2.0 中已弃用的
org.apache.spark.mllib.evaluation.MulticlassMetrics
中的成员变量recall
在 3.0 中已移除。请改用accuracy
。 - 在 2.0 中已弃用的
org.apache.spark.mllib.evaluation.MulticlassMetrics
中的成员变量fMeasure
在 3.0 中已移除。请改用accuracy
。 - 在 2.0 中已弃用的
org.apache.spark.ml.util.GeneralMLWriter.context
在 3.0 中已移除,请改用session
。 - 在 2.0 中已弃用的
org.apache.spark.ml.util.MLWriter.context
在 3.0 中已移除,请改用session
。 - 在 2.0 中已弃用的
org.apache.spark.ml.util.MLReader.context
在 3.0 中已移除,请改用session
。 abstract class UnaryTransformer[IN, OUT, T <: UnaryTransformer[IN, OUT, T]]
在 3.0 中已更改为abstract class UnaryTransformer[IN: TypeTag, OUT: TypeTag, T <: UnaryTransformer[IN, OUT, T]]
。
弃用和行为更改
弃用
- SPARK-11215:
StringIndexerModel
中的labels
已弃用,并将在 3.1.0 中移除。请改用labelsArray
。 - SPARK-25758:
BisectingKMeansModel
中的computeCost
已弃用,并将在未来版本中移除。请改用ClusteringEvaluator
。
行为更改
- SPARK-11215:在 Spark 2.4 及更早版本中,当在
StringIndexer
中将frequencyDesc
或frequencyAsc
指定为stringOrderType
参数时,如果频率相同,则字符串的顺序未定义。从 Spark 3.0 开始,频率相同的字符串将按字母顺序进一步排序。并且从 Spark 3.0 开始,StringIndexer
支持对多列进行编码。 - SPARK-20604:在 3.0 之前的版本中,
Imputer
要求输入列为 Double 或 Float。在 3.0 中,此限制已解除,因此Imputer
可以处理所有数字类型。 - SPARK-23469:在 Spark 3.0 中,
HashingTF
转换器使用 murmur3 哈希函数的修正实现将元素哈希到向量中。Spark 3.0 中的HashingTF
会将元素映射到与 Spark 2 中不同的向量位置。但是,使用 Spark 2.x 创建并使用 Spark 3.0 加载的HashingTF
仍将使用以前的哈希函数,并且不会更改行为。 - SPARK-28969:为了与 Scala 实现保持一致,PySpark 的
OneVsRestModel
中的setClassifier
方法已在 3.0 中移除。调用方在创建模型后不需要在模型中设置分类器。 - SPARK-25790:PCA 在 Spark 3.0 中添加了对超过 65535 列矩阵的支持。
- SPARK-28927:在非确定性输入数据上拟合 ALS 模型时,以前如果发生重新运行,用户会看到由输入/输出用户/项目块不匹配导致的 ArrayIndexOutOfBoundsException。从 3.0 开始,将抛出带有更清晰消息的 SparkException,并包装原始的 ArrayIndexOutOfBoundsException。
- SPARK-29232:在 3.0 之前的版本中,
RandomForestRegressionModel
不会更新其下的 DecisionTreeRegressionModels 的参数映射。这在 3.0 中已修复。
从 MLlib 2.2 升级到 2.3
重大更改
- 逻辑回归模型摘要的类和特征层次结构已更改为更清晰,并更好地适应多类摘要的添加。对于将
LogisticRegressionTrainingSummary
强制转换为BinaryLogisticRegressionTrainingSummary
的用户代码来说,这是一个重大更改。用户应改用model.binarySummary
方法。有关更多详细信息,请参阅 SPARK-17139(*注意* 这是一个实验性
API)。这*不会*影响 Pythonsummary
方法,该方法在多项式和二项式情况下仍能正常工作。
弃用和行为更改
弃用
OneHotEncoder
已弃用,并将在3.0
中移除。它已被新的OneHotEncoderEstimator
替代(参见 SPARK-13030)。注意,OneHotEncoderEstimator
将在3.0
中重命名为OneHotEncoder
(但OneHotEncoderEstimator
将保留为别名)。
行为更改
- SPARK-21027:
OneVsRest
中使用的默认并行度现在设置为 1(即串行)。在2.2
及更早版本中,并行度级别设置为 Scala 中的默认线程池大小。 - SPARK-22156:当
numIterations
设置大于1
时,Word2Vec
的学习率更新不正确。这将导致2.3
及更早版本之间的训练结果不同。 - SPARK-21681:修复了多项逻辑回归中的一个边缘情况错误,该错误导致在某些特征方差为零时系数不正确。
- SPARK-16957:树算法现在使用中间点作为分割值。这可能会改变模型训练的结果。
- SPARK-14657:修复了
RFormula
生成的没有截距的特征与 R 中的输出不一致的问题。这可能会改变在这种情况下模型训练的结果。
从 MLlib 2.1 升级到 2.2
重大更改
没有重大更改。
弃用和行为更改
弃用
没有弃用。
行为更改
- SPARK-19787:
ALS.train
方法的regParam
默认值从1.0
更改为0.1
(标记为DeveloperApi
)。注意,这*不会影响*ALS
Estimator 或 Model,也不会影响 MLlib 的ALS
类。 - SPARK-14772:修复了
Param.copy
方法的 Python 和 Scala API 之间的不一致。 - SPARK-11569:
StringIndexer
现在以与处理未见值相同的方式处理NULL
值。以前,无论handleInvalid
参数的设置如何,总是会抛出异常。
从 MLlib 2.0 升级到 2.1
重大更改
已移除弃用的方法
feature.ChiSqSelectorModel
中的setLabelCol
classification.RandomForestClassificationModel
中的numTrees
(现在指的是名为numTrees
的 Param)regression.RandomForestRegressionModel
中的numTrees
(现在指的是名为numTrees
的 Param)regression.LinearRegressionSummary
中的model
PipelineStage
中的validateParams
Evaluator
中的validateParams
弃用和行为更改
弃用
- SPARK-18592:弃用
DecisionTreeClassificationModel
、GBTClassificationModel
、RandomForestClassificationModel
、DecisionTreeRegressionModel
、GBTRegressionModel
和RandomForestRegressionModel
的所有 Param setter 方法,但输入/输出列 Param 除外。
行为更改
- SPARK-17870:修复了
ChiSqSelector
的一个错误,该错误可能会改变其结果。现在,ChiSquareSelector
使用 pValue 而不是原始统计量来选择固定数量的顶部特征。 - SPARK-3261:在无法获得或未选择 k 个不同的质心的情况下,
KMeans
返回的聚类中心可能少于 k 个。 - SPARK-17389:对于 k-means|| 初始化模式,
KMeans
将默认步数从 5 步减少到 2 步。
从 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
类型。
已移除弃用的方法
spark.mllib
和 spark.ml
包中删除了一些已弃用的方法
ml.evaluation.BinaryClassificationEvaluator
中的setScoreCol
spark.ml
的LinearRegression
和LogisticRegression
中的weights
mllib.optimization.LBFGS
中的setMaxNumIterations
(标记为DeveloperApi
)mllib.rdd.RDDFunctions
中的treeReduce
和treeAggregate
(这些函数直接在RDD
上可用,并标记为DeveloperApi
)mllib.tree.configuration.Strategy
中的defaultStrategy
mllib.tree.Node
中的build
mllib.util.MLUtils
中用于多类的 libsvm 加载程序以及用于加载/保存 labeledData 的方法
有关重大更改的完整列表,请参见 SPARK-14810。
弃用和行为更改
弃用
spark.mllib
和 spark.ml
包中的弃用包括
- SPARK-14984:在
spark.ml.regression.LinearRegressionSummary
中,model
字段已弃用。 - SPARK-13784:在
spark.ml.regression.RandomForestRegressionModel
和spark.ml.classification.RandomForestClassificationModel
中,numTrees
参数已弃用,取而代之的是getNumTrees
方法。 - SPARK-13761:在
spark.ml.param.Params
中,validateParams
方法已弃用。我们将重写方法中的所有功能都移至相应的transformSchema
。 - SPARK-14829:在
spark.mllib
包中,LinearRegressionWithSGD
、LassoWithSGD
、RidgeRegressionWithSGD
和LogisticRegressionWithSGD
已弃用。我们鼓励用户使用spark.ml.regression.LinearRegression
和spark.ml.classification.LogisticRegression
。 - SPARK-14900:在
spark.mllib.evaluation.MulticlassMetrics
中,参数precision
、recall
和fMeasure
已弃用,取而代之的是accuracy
。 - SPARK-15644:在
spark.ml.util.MLReader
和spark.ml.util.MLWriter
中,context
方法已弃用,取而代之的是session
。 - 在
spark.ml.feature.ChiSqSelectorModel
中,setLabelCol
方法已弃用,因为它未被ChiSqSelectorModel
使用。
行为更改
spark.mllib
和 spark.ml
包中的行为更改包括
- SPARK-7780:
spark.mllib.classification.LogisticRegressionWithLBFGS
现在直接调用spark.ml.classification.LogisticRegression
进行二元分类。这将为spark.mllib.classification.LogisticRegressionWithLBFGS
引入以下行为更改- 使用 L1/L2 更新器训练二元分类模型时,不会对截距进行正则化。
- 如果用户设置为不进行正则化,则无论是否进行特征缩放,训练都将以相同的收敛速度返回相同的解。
- SPARK-13429:为了提供与
spark.ml.classification.LogisticRegression
更好且一致的结果,spark.mllib.classification.LogisticRegressionWithLBFGS
的默认值convergenceTol
已从 1E-4 更改为 1E-6。 - SPARK-12363:修复了
PowerIterationClustering
的一个错误,该错误可能会改变其结果。 - SPARK-13048:如果正在使用检查点,则使用
EM
优化器的LDA
默认情况下将保留最后一个检查点。 - SPARK-12153:
Word2Vec
现在会考虑句子边界。之前没有正确处理句子边界。 - SPARK-10574:
HashingTF
在spark.ml
和spark.mllib
中都使用MurmurHash3
作为默认哈希算法。 - SPARK-14768:移除了 PySpark
Param
的expectedType
参数。 - SPARK-14931:更改了一些默认的
Param
值,这些值在 Scala 和 Python 的管道中不匹配。 - SPARK-13600:
QuantileDiscretizer
现在使用spark.sql.DataFrameStatFunctions.approxQuantile
来查找分割点(之前使用自定义采样逻辑)。对于相同的输入数据和参数,输出桶会有所不同。
从 MLlib 1.5 升级到 1.6
spark.mllib
或 spark.ml
包中没有 API 方面的重大更改,但有一些弃用和行为更改。
弃用
- SPARK-11358:在
spark.mllib.clustering.KMeans
中,runs
参数已被弃用。 - SPARK-10592:在
spark.ml.classification.LogisticRegressionModel
和spark.ml.regression.LinearRegressionModel
中,weights
字段已被弃用,取而代之的是新名称coefficients
。这有助于消除与算法赋予实例(行)的“权重”的歧义。
行为更改
- SPARK-7770:
spark.mllib.tree.GradientBoostedTrees
:validationTol
在 1.6 中的语义已更改。以前,它是误差绝对变化的阈值。现在,它类似于GradientDescent
的convergenceTol
的行为:对于大误差,它使用相对误差(相对于之前的误差);对于小误差 (< 0.01
),它使用绝对误差。 - SPARK-11069:
spark.ml.feature.RegexTokenizer
:以前,它在分词之前不会将字符串转换为小写。现在,默认情况下它会转换为小写,并提供了一个不转换的选项。这与更简单的Tokenizer
转换器的行为相匹配。
从 MLlib 1.4 升级到 1.5
在 spark.mllib
包中,没有 API 方面的重大更改,但有一些行为更改
- SPARK-9005:
RegressionMetrics.explainedVariance
返回平均回归平方和。 - SPARK-8600:
NaiveBayesModel.labels
变为排序后的。 - SPARK-3382:
GradientDescent
的默认收敛容差为1e-3
,因此迭代次数可能比 1.4 中更早结束。
在 spark.ml
包中,有一个 API 方面的重大更改和一个行为更改
- SPARK-9268:由于 Scala 编译器错误,Java 的可变参数支持已从
Params.setDefault
中移除。 - SPARK-10097:添加了
Evaluator.isLargerBetter
来指示指标排序。像 RMSE 这样的指标不再像 1.4 中那样翻转符号。
从 MLlib 1.3 升级到 1.4
在 spark.mllib
包中,有一些重大更改,但都在 DeveloperApi
或 Experimental
API 中
- 梯度提升树
- *(重大更改)*
Loss.gradient
方法的签名已更改。这仅对为 GBT 编写了自己的损失函数的用户来说是一个问题。 - *(重大更改)* 由于对案例类字段的修改,案例类
BoostingStrategy
的apply
和copy
方法已更改。对于使用BoostingStrategy
设置 GBT 参数的用户来说,这可能是一个问题。
- *(重大更改)*
- *(重大更改)*
LDA.run
的返回值已更改。它现在返回一个抽象类LDAModel
,而不是具体的类DistributedLDAModel
。LDAModel
类型的对象仍然可以转换为适当的具体类型,具体类型取决于优化算法。
在 spark.ml
包中,发生了一些主要的 API 更改,包括
Param
和其他用于指定参数的 API- 管道组件的
uid
唯一 ID - 某些类的重组
由于 spark.ml
API 在 Spark 1.3 中是一个 alpha 组件,因此我们不会在此列出所有更改。但是,由于 1.4 spark.ml
不再是一个 alpha 组件,因此我们将提供有关未来版本中任何 API 更改的详细信息。
从 MLlib 1.2 升级到 1.3
在 spark.mllib
包中,有一些重大更改。第一个更改(在 ALS
中)是唯一一个不在标记为 Alpha 或 Experimental 的组件中的更改。
- *(重大更改)* 在
ALS
中,多余的方法solveLeastSquares
已被移除。DeveloperApi
方法analyzeBlocks
也被移除。 - *(重大更改)*
StandardScalerModel
仍然是一个 Alpha 组件。在其中,variance
方法已被std
方法取代。要计算原始variance
方法返回的列方差值,只需将std
返回的标准差值平方即可。 - *(重大更改)*
StreamingLinearRegressionWithSGD
仍然是一个 Experimental 组件。在其中,有两个变化- 删除了采用参数的构造函数,取而代之的是使用默认构造函数加上参数设置器方法的构建器模式。
- 变量
model
不再是公共的。
- *(重大更改)*
DecisionTree
仍然是一个 Experimental 组件。在它及其关联的类中,有一些变化- 在
DecisionTree
中,已弃用的类方法train
已被移除。(对象/静态train
方法仍然保留。) - 在
Strategy
中,checkpointDir
参数已被移除。仍然支持检查点,但必须在调用树和树集成训练之前设置检查点目录。
- 在
PythonMLlibAPI
(Scala/Java 和 Python 之间用于 MLlib 的接口)是一个公共 API,但现在是私有的,声明为private[python]
。这从来就不是为了外部使用而设计的。- 在线性回归(包括 Lasso 和岭回归)中,平方损失现在除以 2。因此,为了产生与 1.2 中相同的结果,正则化参数需要除以 2,步长需要乘以 2。
在 spark.ml
包中,主要的 API 更改来自 Spark SQL。我们在此列出最重要的更改
- 旧的 SchemaRDD 已被 DataFrame 取代,API 有所修改。
spark.ml
中所有曾经使用 SchemaRDD 的算法现在都使用 DataFrame。 - 在 Spark 1.2 中,我们通过调用
import sqlContext._
将LabeledPoint
的RDD
隐式转换为SchemaRDD
,其中sqlContext
是SQLContext
的一个实例。这些隐式转换已被移动,因此我们现在调用import sqlContext.implicits._
。 - SQL 的 Java API 也进行了相应的更改。有关详细信息,请参阅上面的示例和《Spark SQL 编程指南》。
其他更改在 LogisticRegression
中
scoreCol
输出列(默认值为“score”)已重命名为probabilityCol
(默认值为“probability”)。类型最初是Double
(表示类别 1.0 的概率),但现在是Vector
(表示每个类别的概率,以便将来支持多类别分类)。- 在 Spark 1.2 中,
LogisticRegressionModel
不包含截距。在 Spark 1.3 中,它包含一个截距;但是,它始终为 0.0,因为它使用 spark.mllib.LogisticRegressionWithLBFGS 的默认设置。将来会添加使用截距的选项。
从 MLlib 1.1 升级到 1.2
MLlib v1.2 中唯一的 API 更改是在 DecisionTree
中,它在 MLlib 1.2 中仍然是一个实验性 API
-
*(重大更改)* 用于分类的 Scala API 采用了一个指定类别数量的命名参数。在 MLlib v1.1 中,此参数在 Python 中称为
numClasses
,在 Scala 中称为numClassesForClassification
。在 MLlib v1.2 中,名称都设置为numClasses
。此numClasses
参数通过Strategy
或DecisionTree
静态trainClassifier
和trainRegressor
方法指定。 -
(重大变更)
Node
的 API 已更改。这通常不会影响用户代码,除非用户手动构建决策树(而不是使用trainClassifier
或trainRegressor
方法)。树Node
现在包含更多信息,包括预测标签的概率(用于分类)。 -
打印方法的输出已更改。
toString
(Scala/Java)和__repr__
(Python)方法过去用于打印完整模型;它们现在打印摘要。对于完整模型,请使用toDebugString
。
Spark 发行版中的示例和决策树指南中的示例已相应更新。
从 MLlib 1.0 升级到 1.1
MLlib v1.1 中唯一的 API 更改是在 DecisionTree
中,它在 MLlib 1.1 中仍然是一个实验性 API。
-
(重大变更) 为了匹配 scikit-learn 和 rpart 中树的实现,树深度的含义已更改 1。在 MLlib v1.0 中,深度为 1 的树有 1 个叶节点,深度为 2 的树有 1 个根节点和 2 个叶节点。在 MLlib v1.1 中,深度为 0 的树有 1 个叶节点,深度为 1 的树有 1 个根节点和 2 个叶节点。此深度由
Strategy
中的maxDepth
参数指定,或通过DecisionTree
静态trainClassifier
和trainRegressor
方法指定。 -
(非重大变更) 我们建议使用新添加的
trainClassifier
和trainRegressor
方法来构建DecisionTree
,而不是使用旧的参数类Strategy
。这些新的训练方法明确区分了分类和回归,并且它们用简单的String
类型替换了专门的参数类型。
新的推荐 trainClassifier
和 trainRegressor
的示例在决策树指南中给出。
从 MLlib 0.9 升级到 1.0
在 MLlib v1.0 中,我们以统一的方式支持密集和稀疏输入,这引入了一些重大更改。如果您的数据是稀疏的,请将其存储为稀疏格式而不是密集格式,以便在存储和计算中利用稀疏性。详细信息如下所述。