2017-08-11 46 views
1

我正在使用sklearn.pipeline.Pipeline對象進行聚類。從sklearn.pipeline.Pipeline獲取變壓器結果

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

然後我通過使用側影評分來評估結果。

sil = preprocessing.silhouette_score(X, y) 

我想知道怎樣才能從管道得到了X或轉換數據,它只返回clusterer.fit_predict(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) 

做到這一點,但我想只是做這一切在一個流水線。

+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別的地方這樣做,否則你需要重新適應整個流水線想要使用該功能時。