保存 ML 模型以供将来使用

2023-11-23

我正在将一些机器学习算法(如线性回归、逻辑回归和朴素贝叶斯)应用于一些数据,但我试图避免使用 RDD 并开始使用 DataFrame,因为RDD 速度较慢比 pyspark 下的数据帧(见图 1)。

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

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

Notes:

  • mllib 的模型类有一个 save 方法(即天真的贝耶斯),但 mllib 没有 CrossValidator 并使用 RDD,所以我有预谋地避免使用它。
  • 当前版本是spark 1.5.1。

火花2.0.0+

乍一看全部Transformers and Estimators实施MLWritable具有以下界面:

def write: MLWriter
def save(path: String): Unit 

and 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 and 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 not LogisticRegression.load.

如果您使用 Spark

除了 Spark 特定方法之外,还有越来越多的库设计用于使用 Spark 独立方法保存和加载 Spark ML 模型。参见示例如何服务 Spark MLlib 模型?.

火花 >= 1.6

从 Spark 1.6 开始,可以使用以下命令保存模型save方法。因为几乎每一个model实施ML可写界面。例如,线性回归模型拥有它,因此可以使用它将模型保存到所需的路径。

火花

我相信你在这里做出了错误的假设。

一些操作DataFrames可以进行优化,与普通的相比,它可以提高性能RDDs. DataFrames提供高效的缓存,并且 SQLish API 可以说比 RDD API 更容易理解。

ML 管道非常有用,像交叉验证器或不同评估器这样的工具是任何机器管道中都必须具备的,即使上述这些都不是特别难在低级 MLlib API 之上实现,但最好准备好使用、通用且经过相对良好测试的解决方案。

到目前为止一切顺利,但存在一些问题:

  • 据我所知,简单的操作DataFrames like select or withColumn显示与其 RDD 等效项相似的性能,例如map,
  • 在某些情况下,与精心调整的低级转换相比,增加典型管道中的列数实际上会降低性能。您当然可以添加 drop-column-transformers 来纠正这个问题,
  • 许多机器学习算法,包括ml.classification.NaiveBayes 只是简单的包装围绕其mllib API,
  • PySpark ML/MLlib 算法将实际处理委托给其 Scala 对应项,
  • 最后但并非最不重要的一点是,即使很好地隐藏在 DataFrame API 后面,RDD 仍然存在

我相信最终通过 MLLib 使用 ML 会得到相当优雅的高级 API。您可以做的一件事是将两者结合起来创建自定义的多步骤管道:

  • 使用机器学习来加载、清理和转换数据,
  • 提取所需数据(参见示例提取标记点方法)并传递给MLLib算法,
  • 添加自定义交叉验证/评估
  • save MLLib使用您选择的方法(Spark 模型或PMML)

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

保存 ML 模型以供将来使用 的相关文章

随机推荐

  • Delphi 2009,Indy 10,TIdTCPServer.OnExecute,如何抓取InputBuffer中的所有字节

    我正在摆弄 Delphi 2009 提供的 Indy 10 并且在 OnExecute 触发时无法从 IOHandler 获取所有数据 procedure TFormMain IdTCPServerExecute AContext TIdC
  • 如何专注于 Scala 中的类型投影?

    问题陈述 考虑一个类型T包含一个抽象类型成员A trait T type A 我想创建一个需要T0 lt T作为类型参数 但专门针对类型投影 T0 A 例如 下面的方法可以foo专业化 class Foo T0 lt T def foo a
  • 计算 Spark Dataframe 中分组数据的分位数

    我有以下 Spark 数据框 agent id payment amount a 1000 b 1100 a 1100 a 1200 b 1200 b 1250 a 10000 b 9000 我的愿望输出是这样的 agen id 95 qu
  • 操作栏菜单项 onclick?

    我有一个操作栏 它将所有内容都放在右上角的菜单中 用户单击该菜单就会打开菜单选项 我在使用它的每个活动中都会使用此功能来扩展操作栏菜单 Override public boolean onCreateOptionsMenu Menu men
  • 如何修改文本文件?

    我正在使用 Python 并且希望将字符串插入到文本文件中 而不删除或复制该文件 我怎样才能做到这一点 不幸的是 没有办法在不重写文件的情况下插入到文件的中间 正如之前的海报所示 您可以使用查找附加到文件或覆盖文件的一部分 但如果您想在开头
  • 如何在android中使用getSharedPreferences

    我有一个应用程序 我必须在其中实现 登录 活动 我有这些组件 编辑文本用户名 编辑文本密码 按钮登录 按钮取消 我希望我的应用程序在用户登录后记住用户的登录详细信息 直到用户按下 注销 按钮 我没有在 xml 中使用首选项 如何让 getS
  • SpringData MongoDB 使用投影

    我可以通过它们使用 mongodb 投影功能从文档中获取选定的字段吗 即使在互联网上搜索了一整天也找不到任何线索 这是相关部分有关存储库的文档 还有查询文档部分有一个简短的提及 使用时MongoOperations你可以使用Query实例将
  • ionic 3 中的“运行时错误区已加载”

    我正在 ionic 3 和 Firebase 版本 4 13 1 上的 Firebase 身份验证中开发我的项目 我安装了 Angularfire2 我创建了一个注册表单 并在使用 ionic lab 测试我的应用程序时成功将用户详细信息放
  • 使用 PowerShell v2 从大文本文件中获取行的子集

    我正在处理一个大文本文件 我的意思是超过 100 MB 大 我需要循环遍历特定数量的行 这是一种子集 所以我正在尝试使用这个 info Get Content Path TextFile Select Object Index from t
  • 哪些版本的 Android 支持哪些包签名算法?

    鉴于我想支持所有 Android 设备 例如 Froyo或者稍后 我可以使用的最安全的签名算法是什么 我不需要放置我的APK in 安卓市场 例如 我知道有些手机支持sha1withrsa但不是sha256withrsa Link 请参阅A
  • AngularJS 中的 ScrollTo 函数

    我正在尝试让快速导航正常工作 它漂浮在一边 当他们点击链接时 就会转到页面上的该 ID 我正在关注这个树屋指南 这就是我的滚动内容 quickNav a click function var quickNavId this attr hre
  • 找不到 CrystalImageHandler.aspx

    我在 MVC3 应用程序的普通 ASP NET aspx 页面上使用 Crystal 报表查看器 在控制器操作中 我只是重定向到 aspx 页面 报告显示正常 但问题在于动态图像 我找到了最简单的解决方案 将图像路径作为报告参数传递 并将该
  • 获取Spark RDD的一系列列

    现在我的 RDD 中有 300 多列 但我发现需要动态选择一系列列并将它们放入 LabledPoints 数据类型中 作为 Spark 的新手 我想知道是否有任何索引方式来选择 RDD 中的一系列列 就像是temp data data 10
  • 在 grails 中,如何获取所有当前会话的引用?

    我想列出 grails 管理控制器中的所有当前会话 获得参考的最简单方法是什么来自控制器的会话集合 这是一项功能 默认情况下禁用 但可以通过设置轻松启用grails plugins appinfo useContextListener tr
  • 简单的 goroutine 无法在 Windows 上运行

    我正在对 goroutine 进行一些测试 只是为了了解它们是如何工作的 但它们似乎根本没有运行 我做了一个非常简单的测试 package main import fmt func test fmt Println test func ma
  • 如何使用 firebase 并将读取和写入规则设置为 false

    我正在开发一个项目 并且遵循了一些教程来学习和构建该应用程序 但他们都将 Firebase 读写规则更改为 true 这是不安全的 例如他们改变了 rules read false write false to rules read tru
  • 如何使用PIL裁剪图像?

    我想通过从给定图像中删除前 30 行和后 30 行来裁剪图像 我已经搜索过但没有得到确切的解决方案 有人有一些建议吗 有一个crop method w h yourImage size yourImage crop 0 30 w h 30
  • 如何在Java中从客户端获取uuid或mac地址?

    我正在寻找一种基于 Java 的 Web 应用程序的解决方案来唯一标识客户端 服务器与客户端位于同一网络中 我认为使用 MAC 地址将是一个很好的解决方案 问题是我无法使用 cookie 因为它们可以在客户端删除 而且我无法使用 IP 因为
  • 如何针对不同屏幕动态设置textview的文本大小[重复]

    这个问题在这里已经有答案了 我正在创建一个文本视图并动态添加到布局中 我在用textView setTextSize 18 设置文本大小的方法 我在三星平板电脑上测试了它 发现字体大小对于这个屏幕来说太小 然后我将文本大小更改为25 但对于
  • 保存 ML 模型以供将来使用

    我正在将一些机器学习算法 如线性回归 逻辑回归和朴素贝叶斯 应用于一些数据 但我试图避免使用 RDD 并开始使用 DataFrame 因为RDD 速度较慢比 pyspark 下的数据帧 见图 1 我使用 DataFrames 的另一个原因是