2016-03-21 10 views
2

私はStringIndexer、StandardScalerなどのPysparkの変圧器を使用しています。最初にそれらをトレーニングセットに適用し、その後、同じ変換オブジェクト(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)での既存のバグ/欠けている機能に立ち往生しています。根本的な問題が解決され、新しいメソッドを提供しなかった場合、モデルパラメータを取得および設定するために、いくつかの基本メソッドを手動で呼び出す必要があります。モデルコードを見てみると、モデルは一連のクラスから継承されており、そのうちの1つはParamsです。このクラスには、モデルで使用されるパラメータを引き出すextractParamMapがあります。これは、Pythonのdictsを永続化するために望む方法でこれを保存することができます。次に、空のモデルオブジェクトを作成し、それに続いて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に保存された)ファイルからインデクサーモデルをロードします。

関連する問題