从sklearn.pipeline.Pipeline获取变换器结果

jbo*_*lia 7 pipeline python-2.7 scikit-learn

我正在使用一个sklearn.pipeline.Pipeline对象来进行聚类.

pipe = sklearn.pipeline.Pipeline([('transformer1': transformer1),
                                  ('transformer2': transformer2),
                                  ('clusterer': clusterer)])
Run Code Online (Sandbox Code Playgroud)

然后我通过使用轮廓分数来评估结果.

sil = preprocessing.silhouette_score(X, y)
Run Code Online (Sandbox Code Playgroud)

我想知道如何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)
Run Code Online (Sandbox Code Playgroud)

但我想在一个管道中完成所有工作.

Viv*_*mar 3

如果您想在管道的中间步骤上拟合和转换数据,那么重用相同的管道是没有意义的,最好使用您指定的新管道,因为调用fit()会忘记所有先前学习的数据。

但是,如果您只想transform()查看已安装管道上的中间数据,则可以通过访问named_steps参数来实现。

new_pipe = sklearn.pipeline.Pipeline([('transformer1': 
                                           old_pipe.named_steps['transformer1']),
                                      ('transformer2': 
                                          old_pipe.named_steps['transformer2'])])
Run Code Online (Sandbox Code Playgroud)

或者直接使用内部变量,steps例如:

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

然后调用new_pipe.transform().

更新: 如果您有0.18或更高版本,那么您可以将管道内的非必需估计器设置为None在同一管道中获取结果。它在scikit-learn github 上的本期讨论中 在您的案例中使用上述内容:

pipe.set_params(clusterer=None)
pipe.transform(df)
Run Code Online (Sandbox Code Playgroud)

但请注意,可能会将安装的内容存储clusterer在其他地方来执行此操作,否则当您想要使用该功能时,您需要再次安装整个管道。