2017-08-11 3 views
1

私はクラスタ化のためにsklearn.pipeline.Pipelineオブジェクトを使用しています。sklearn.pipeline.Pipelineからトランスフォーマーの結果を取得

pipe = sklearn.pipeline.Pipeline([('transformer1': transformer1), 
            ('transformer2': transformer2), 
            ('clusterer': clusterer)]) 

次に、シルエットスコアを使用して結果を評価しています。

sil = preprocessing.silhouette_score(X, y) 

私はそれだけでclusterer.fit_predict(X)を返すように私は、パイプラインからXまたは変換されたデータを取得することができますどのように思ったんだけど。

私はちょうど

pipe = sklearn.pipeline.Pipeline([('transformer1': transformer1), 
            ('transformer2': transformer2)]) 

X = pipe.fit_transform(data) 
res = clusterer.fit_predict(X) 
sil = preprocessing.silhouette_score(X, res) 

としてパイプラインを分割することにより、これを行うことができますが、私はちょうど1つのパイプラインでそれをすべてやりたいことを理解しています。

+0

はっきりしています、私は 'transformer1.fit_transform(df)'や 'transformer2.fit_transform(transformer1.fit_transform(df))'のような中間結果を得ることに興味があります。 – jbolilia

答えて

0

パイプラインの中間ステップでデータをフィットして変換したい場合、fit()を呼び出すと以前に学習されたすべてを忘れるため、指定したパイプラインを再利用して新しいパイプラインを使用することは意味がありませんデータ。

ただし、transform()のみを使用し、すでに適合しているパイプラインの中間データを表示する場合は、named_stepsパラメータにアクセスして可能です。

new_pipe = sklearn.pipeline.Pipeline([('transformer1': 
              old_pipe.named_steps['transformer1']), 
             ('transformer2': 
              old_pipe.named_steps['transformer2'])]) 

、または直接のように、内側varible stepsを使用して:

transformer_steps = old_pipe.steps 
new_pipe = sklearn.pipeline.Pipeline([('transformer1': transformer_steps[0]), 
            ('transformer2': transformer_steps[1])]) 

そしてnew_pipe.transform()を呼び出します。

更新: バージョン0.18以上を持っている場合は、あなたが同じパイプラインの結果を得るためにNoneへのパイプライン内の非必要な推定量を設定することができます。そのあなたのケースでは上記のためthis issue at scikit-learn github 使用法で議論:

pipe.set_params(clusterer=None) 
pipe.transform(df) 

しかし、おそらくそうすることをどこか別の場所にフィットclustererを格納するために注意して、他のあなたは、その機能を使用したいとき、再び全体のパイプラインにフィットする必要があります。

関連する問題