Apache spark 保存ML模型以备将来使用
我对一些数据应用了一些机器学习算法,如线性回归、逻辑回归和朴素贝叶斯,但我试图避免使用RDD,并开始使用数据帧,因为pyspark下的数据帧比数据帧多(参见图1) 我使用DataFrames的另一个原因是因为ml库有一个类对优化模型非常有用,这个类在拟合模型后返回一个模型,显然这个方法必须测试几个场景,然后返回一个(具有最佳参数组合) 我使用的集群不是那么大,数据也相当大,一些拟合需要几个小时,所以我想保存这些模型以便以后重用,但我还没有意识到,有什么我忽略了的吗 注:Apache spark 保存ML模型以备将来使用,apache-spark,pyspark,apache-spark-mllib,apache-spark-ml,Apache Spark,Pyspark,Apache Spark Mllib,Apache Spark Ml,我对一些数据应用了一些机器学习算法,如线性回归、逻辑回归和朴素贝叶斯,但我试图避免使用RDD,并开始使用数据帧,因为pyspark下的数据帧比数据帧多(参见图1) 我使用DataFrames的另一个原因是因为ml库有一个类对优化模型非常有用,这个类在拟合模型后返回一个模型,显然这个方法必须测试几个场景,然后返回一个(具有最佳参数组合) 我使用的集群不是那么大,数据也相当大,一些拟合需要几个小时,所以我想保存这些模型以便以后重用,但我还没有意识到,有什么我忽略了的吗 注: mllib的模型类有
- mllib的模型类有一个save方法(即),但mllib没有CrossValidator并使用RDD,因此我有意避免使用它
- 目前的版本是spark 1.5.1李>
变压器
和估计器
都通过以下接口实现:
def write:MLWriter
def保存(路径:字符串):单位
并具有以下接口
def read:MLReader[T]
def加载(路径:字符串):T
这意味着您可以使用save
方法将模型写入磁盘
import org.apache.spark.ml.PipelineModel
val模型:PipelineModel
model.save(“/path/to/model”)
请稍后阅读:
val重新加载模型:PipelineModel=PipelineModel.load(“/path/to/model”)
PySpark中也分别使用/和/实现了等效方法:
来自pyspark.ml导入管道,PipelineModel
模型=管道(…).fit(df)
model.save(“/path/to/model”)
重新加载的_model=PipelineModel.load(“/path/to/model”)
SparkR提供了/函数,但到目前为止,这些函数与其他受支持的语言不兼容-
请注意,装入器类必须与存储的类相匹配。例如,如果保存了LogisticRegressionModel
,则应使用LogisticRegressionModel.load
而不是LogisticRegression.load
如果使用Spark=1.6
自Spark 1.6以来,可以使用save
方法保存模型。因为几乎每个模型都实现了接口。例如,拥有它,因此可以使用它将模型保存到所需的路径
火花<1.6
我相信你在这里做出了错误的假设
与普通的rdd
相比,可以优化数据帧上的某些操作,从而提高性能DataFrames
提供高效缓存,SQLish API可以说比RDDAPI更容易理解
ML管道非常有用,交叉验证器或不同的验证器之类的工具在任何机器管道中都是必不可少的,即使上面的任何一项都不是特别难在低级MLlib API上实现,但最好有现成的、通用的、经过良好测试的解决方案
到目前为止还不错,但存在一些问题:
- 据我所知,对
DataFrames
的简单操作,如select
或withColumn
显示类似于其RDD等价物的性能,如map
- 在某些情况下,与经过良好调优的低级转换相比,增加典型管道中的列数实际上会降低性能。当然,您可以在纠正该问题的过程中添加下拉柱变压器
- 许多ML算法,包括围绕其
mllib
API的ML.classification.NaiveBayes
- PySpark ML/MLlib算法将实际处理委托给其对应的Scala
- 最后但并非最不重要的一点是,RDD仍然存在,即使它很好地隐藏在DataFrameAPI后面
我相信,最终使用ML over MLLib得到的是非常优雅的高级API。您可以做的一件事是将两者结合起来创建自定义多步骤管道:
- 使用ML加载、清理和转换数据
- 提取所需数据(参见示例方法)并传递给
MLLib
算法
- 添加自定义交叉验证/评估
- 使用您选择的方法保存
MLLib
模型(Spark模型或)
这不是一个最优的解决方案,但在给定当前API的情况下,这是我能想到的最好的解决方案。我希望在PySpark中,您可以做类似的事情,即pickle-也许,但这并不容易。由于PySpark ML主要是Scala API的包装器,因此必须同时确保Scala模型被正确序列化/反序列化。我可以使用Scala来完成这项工作,但我需要在python上完成这项工作:|+1是否有一种简单的方法(或任何方法)来持久化PySpark.ML模型?找不到关于它的任何文档+1个好问题。我正处在刚才从RDDs
切换到DataFrames
的位置。我使用的是1.6.1
,但我也遇到了同样的问题,因为OneVsRest