2016-03-21 17 views
2

Ich benutze einige Transformatoren von Pyspark wie StringIndexer, StandardScaler und mehr. Ich wende diese zuerst an den Trainingssatz an und später möchte ich dieselben Transformationsobjekte (dieselben Parameter von StringIndexerModel, StandardScalerModel) verwenden, um sie auf den Testsatz anzuwenden. Daher suche ich nach einer Möglichkeit, diese Transformationsfunktionen als Datei zu speichern. Ich kann jedoch keine verwandte Methode finden, sondern nur mit ml-Funktionen wie LogisticRegression. Kennen Sie einen möglichen Weg? Vielen Dank.Pyspark: Speichern Transformatoren

+0

Können Sie klären, ob Sie mit MLlib oder ML arbeiten? – zero323

+0

Hoppla, tut mir leid. Ich arbeite mit pyspark.ml. –

Antwort

0

Die Ausgabe von StringIndexer und StandardScaler sind beide RDDs, so dass Sie die Modelle entweder direkt in einer Datei speichern können oder, was wahrscheinlicher ist, können Sie die Ergebnisse für spätere Berechnungen beibehalten.

Um zu einem Parkett Datei Aufruf zu speichern (möglicherweise benötigen Sie auch ein Schema) sqlContext.createDataFrame(string_indexed_rdd).write.parquet("indexer.parquet"). Sie müssten dann das Laden dieses Ergebnisses aus einer Datei programmieren, wenn Sie es wollten.

Um fortzufahren Anruf string_indexed_rdd.persist(). Dies speichert die Zwischenergebnisse im Speicher zur späteren Wiederverwendung. Sie können Optionen übergeben, um auch auf die Festplatte zu speichern, wenn Sie speicherbegrenzt sind.


Wenn Sie möchten, bestehen bleiben nur das Modell selbst, sind Sie auf einer vorhandenen Fehler/fehlende Fähigkeit im api stecken (PR). Wenn das zugrunde liegende Problem gelöst wurde und keine neuen Methoden bereitgestellt wurden, müssen Sie einige zugrunde liegende Methoden manuell aufrufen, um die Modellparameter abzurufen und festzulegen. Beim Durchsehen des Modellcodes können Sie sehen, dass die Modelle von einer Kette von Klassen erben, von denen eine Params ist. Diese Klasse hat die , die die im Modell verwendeten Parameter herauszieht. Sie können dies auf beliebige Weise speichern, die Sie für persistente Python-Dicts wünschen. Dann müssen Sie ein leeres Modellobjekt erstellen und mit einem Aufruf an copy(saved_params) folgen, um die persistenten Parameter in das Objekt zu übergeben.

Etwas in dieser Richtung sollte funktionieren:

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

Ich bin nicht daran interessiert, die transformierten Daten zu speichern, sondern das Modell selbst. Zum Beispiel möchte ich das StandardScalerModel speichern, das keine RDD ist. –

+0

Ahh deine Frage war zu diesem Punkt nicht klar - ich habe den Quellcode gescannt und hinzugefügt, was ich denke, was du erreichen willst. – Pyrce

+0

Ich werde es versuchen, danke! –

3

Ich fand eine einfache Lösung.

Speichern Sie das Indexermodell in einer Datei (auf HDFS).

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

Laden Sie das Indexermodell aus einer Datei (gespeichert auf HDFS).

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