我对一些数据应用了一些机器学习算法,如线性回归、逻辑回归和朴素贝叶斯,但我试图避免使用 RDD 并开始使用 DataFrame,因为 RDDs are slower比pyspark下的Dataframes(见图1)。
我使用 DataFrames 的另一个原因是 ml 库有一个类对调整模型非常有用,它是 CrossValidator。这个类拟合后返回一个模型,显然这个方法要测试几个场景,然后返回一个fitted model (具有最佳参数组合)。
我使用的集群不是很大,数据也很大,有些拟合需要几个小时,所以我想保存这些模型以便以后重用它们,但我还没有意识到如何,有什么我忽略的吗?
笔记:
请您参考如下方法:
Spark 2.0.0+
乍一看全部Transformers
和 Estimators
实现 MLWritable
使用以下界面:
def write: MLWriter
def save(path: String): Unit
和
MLReadable
具有以下界面
def read: MLReader[T]
def load(path: String): T
这意味着您可以使用
save
将模型写入磁盘的方法,例如
import org.apache.spark.ml.PipelineModel
val model: PipelineModel
model.save("/path/to/model")
稍后阅读:
val reloadedModel: PipelineModel = PipelineModel.load("/path/to/model")
等效方法也在 PySpark 中实现,
MLWritable
/
JavaMLWritable
和
MLReadable
/
JavaMLReadable
分别:
from pyspark.ml import Pipeline, PipelineModel
model = Pipeline(...).fit(df)
model.save("/path/to/model")
reloaded_model = PipelineModel.load("/path/to/model")
SparkR 提供
write.ml
/
read.ml
功能,但截至今天,这些与其他支持的语言不兼容 -
SPARK-15572 .
请注意,加载器类必须与存储的
PipelineStage
的类匹配。 .例如,如果您保存了
LogisticRegressionModel
你应该使用
LogisticRegressionModel.load
不是
LogisticRegression.load
.
如果您使用 Spark <= 1.6.0 并在保存模型时遇到一些问题,我建议您切换版本。
除了 Spark 特定方法之外,还有越来越多的库旨在使用 Spark 独立方法保存和加载 Spark ML 模型。参见示例 How to serve a Spark MLlib model? .
Spark >= 1.6
从 Spark 1.6 开始,可以使用
save
保存模型方法。因为几乎每个
model
实现
MLWritable界面。例如,
LinearRegressionModel拥有它,因此可以使用它将模型保存到所需的路径。
Spark < 1.6
我相信你在这里做出了不正确的假设。
对
DataFrames
的一些操作可以进行优化,与普通
RDDs
相比,它可以转化为更高的性能.
DataFrames
提供高效的缓存,SQLish API 可以说比 RDD API 更容易理解。
ML Pipelines 非常有用,并且像交叉验证器或不同的评估器这样的工具在任何机器管道中都是必不可少的,即使上述任何一个都不是特别难在低级 MLlib API 之上实现,最好准备好使用,通用和相对良好的测试解决方案。
到目前为止一切顺利,但有几个问题:
DataFrames
上的简单操作喜欢 select
或 withColumn
显示与其 RDD 等效项类似的性能,例如 map
, ml.classification.NaiveBayes
are simply wrappers围绕其mllib
API, 我相信最终通过使用 ML 而不是 MLLib 得到的是非常优雅的高级 API。您可以做的一件事是将两者结合起来创建一个自定义的多步骤管道:
MLLib
算法,MLLib
使用您选择的方法进行建模(Spark 模型或 PMML)这不是最佳解决方案,但在给定当前 API 的情况下,它是我能想到的最佳解决方案。