2016-03-21 83 views
2

我正在使用Pyspark的一些变形金刚,比如StringIndexer,StandardScaler等等。我首先将这些应用于训练集,然后再使用相同的变换对象(StringIndexerModel,StandardScalerModel的相同参数),以便将它们应用于测试集。因此,我正在寻找一种方法将这些转换函数保存为一个文件。但是,我找不到任何相关的方法,但只能使用诸如LogisticRegression之类的ml函数。你知道任何可能的方式来做到这一点吗?谢谢。Pyspark:保存变形金刚

+0

你能说清楚你是否使用MLlib或ML? – zero323

+0

哎呀,对不起。我正在与pyspark.ml合作。 –

回答

0

StringIndexer和StandardScaler的输出都是RDD,因此您可以将模型直接保存到文件中,或者更可能是您想要的,您可以保留结果以供以后计算。

要保存到实木复合地板文件调用(您可能还需要附加架构)sqlContext.createDataFrame(string_indexed_rdd).write.parquet("indexer.parquet")。然后,您需要编程加载这个结果,当你需要时从文件中加载回来。

坚持致电string_indexed_rdd.persist()。这会将中间结果保存在内存中供以后重用。如果内存有限,您也可以传递选项以保存到磁盘。


如果你只想坚持模型本身,你被困在了API(PR)现有错误/缺少能力。如果潜在问题已解决并且未提供新方法,则需要手动调用一些基础方法来获取和设置模型参数。查看模型代码,可以看到模型从一系列类中继承,其中一个类是Params。这个类有extractParamMap,它提取模型中使用的参数。然后,您可以用任何您希望保留python字典的方式保存它。然后,您需要创建一个空的模型对象,然后通过调用copy(saved_params)将持久参数传递给对象。

东西沿着这些路线应该工作:

def save_params(model, filename): 
    d = shelve.open(filename) 
    try: 
     return d.update(model.extractParamMap()) 
    finally: 
     d.close() 

def load_params(ModelClass, filename): 
    d = shelve.open(filename) 
    try: 
     return ModelClass().copy(dict(d)) 
    finally: 
     d.close() 
+0

我对保存转换的数据不感兴趣,但模型本身。例如,我想保存不是RDD的StandardScalerModel。 –

+0

啊,你的问题在这一点上还不清楚 - 我扫描了源代码,并添加了我认为会实现你想要的内容。 – Pyrce

+0

我会试试看,谢谢! –

3

我发现了一个简单的解决方案。

将索引器模型保存到文件(在HDFS上)。

writer = indexerModel._call_java("write") 
writer.save("indexerModel") 

从文件(保存在HDFS上)加载索引器模型。

indexer = StringIndexerModel._new_java_obj("org.apache.spark.ml.feature.StringIndexerModel.load", "indexerModel") 
indexerModel = StringIndexerModel(indexer)