gpt4 book ai didi

apache-spark - 保存 ML 模型以供将来使用

转载 作者:行者123 更新时间:2023-12-03 11:23:59 25 4
gpt4 key购买 nike

我对一些数据应用了一些机器学习算法,如线性回归、逻辑回归和朴素贝叶斯,但我试图避免使用 RDD 并开始使用 DataFrame,因为 RDDs are slower比pyspark下的Dataframes(见图1)。



我使用 DataFrames 的另一个原因是 ml 库有一个类对调整模型非常有用,它是 CrossValidator。这个类拟合后返回一个模型,显然这个方法要测试几个场景,然后返回一个fitted model (具有最佳参数组合)。

我使用的集群不是很大,数据也很大,有些拟合需要几个小时,所以我想保存这些模型以便以后重用它们,但我还没有意识到如何,有什么我忽略的吗?

笔记:

  • mllib 的模型类有一个保存方法(即 NaiveBayes ),但 mllib 没有 CrossValidator 并且使用 RDD,所以我有预谋地避免它。
  • 当前版本是 Spark 1.5.1。
  • 最佳答案

    Spark 2.0.0+

    乍一看全部TransformersEstimators实现 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 上的简单操作喜欢 selectwithColumn显示与其 RDD 等效项类似的性能,例如 map ,
  • 在某些情况下,与经过良好调整的低级转换相比,增加典型管道中的列数实际上会降低性能。您当然可以在纠正该问题的过程中添加 drop-column-transformers,
  • 许多 ML 算法,包括 ml.classification.NaiveBayes are simply wrappers围绕其mllib API,
  • PySpark ML/MLlib 算法将实际处理委托(delegate)给它的 Scala 算法,
  • 最后但并非最不重要的一点是,RDD 仍然存在,即使隐藏在 DataFrame API
  • 之后。

    我相信最终通过使用 ML 而不是 MLLib 得到的是非常优雅的高级 API。您可以做的一件事是将两者结合起来创建一个自定义的多步骤管道:
  • 使用 ML 加载、清理和转换数据,
  • 提取所需数据(参见示例 extractLabeledPoints 方法)并传递给 MLLib算法,
  • 添加自定义交叉验证/评估
  • 保存 MLLib使用您选择的方法进行建模(Spark 模型或 PMML)

  • 这不是最佳解决方案,但在给定当前 API 的情况下,它是我能想到的最佳解决方案。

    关于apache-spark - 保存 ML 模型以供将来使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33027767/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com