如何将ML Pipeline中的模型保存到S3或HDFS?

15

我正在尝试保存由ML Pipeline生成的数千个模型。如这里的答案所示,可以按以下方式保存模型:

import java.io._

def saveModel(name: String, model: PipelineModel) = {
  val oos = new ObjectOutputStream(new FileOutputStream(s"/some/path/$name"))
  oos.writeObject(model)
  oos.close
}

schools.zip(bySchoolArrayModels).foreach{
  case (name, model) => saveModel(name, Model)
}

我尝试使用 s3://some/path/$name/user/hadoop/some/path/$name ,因为我希望最终将模型保存到Amazon S3,但它们都失败了,并显示无法找到路径的消息。

如何将模型保存到Amazon S3?

3个回答

10

将模型保存到HDFS的一种方法如下:

// persist model to HDFS
sc.parallelize(Seq(model), 1).saveAsObjectFile("hdfs:///user/root/linReg.model")

保存的模型可以这样加载:

val linRegModel = sc.objectFile[LinearRegressionModel]("linReg.model").first()

更多详细信息请参见(ref


它可以工作,但是当从HDFS重新加载模型时,一些信息将会丢失,例如父级等... - whb_zju

4

自从 Apache-Spark 1.6 版本以及在 Scala API 中,你可以不需要任何技巧来保存你的模型。因为,所有来自于 ML 库的模型都带有一个 save 方法,你可以在LogisticRegressionModel中验证此方法的存在。顺便说一下,要加载模型,可以使用静态方法。

val logRegModel = LogisticRegressionModel.load("myModel.model")

嗨@Alberto,看了API,没有load方法?而且,像随机森林这样的其他算法也不提供.save。在ML中似乎没有直接保存模型的简单方法。 - other15
2
许多机器学习模型实现了这些方法,而其他一些没有。我认为 Spark 2.0 版本会解决这个问题。 - Alberto Bonsanto
希望这个实现花了这么长时间感觉有点奇怪。另外一个问题是,我发现一些模型(例如LogisticRegressionModel)有保存方法,但没有加载方法?你该如何加载已保存的模型呢? - other15

1
所以FileOutputStream保存到本地文件系统(不通过hadoop库),因此将其保存到本地目录是执行此操作的方法。话虽如此,该目录需要存在,因此请确保该目录首先存在。
话虽如此,根据您的模型,您可能希望查看https://spark.apache.org/docs/latest/mllib-pmml-model-export.html(pmml导出)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接