2016-03-21 118 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)