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

时间:2017-08-11 04:03:38

标签: python-2.7 scikit-learn 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)

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

1 个答案:

答案 0 :(得分:2)

如果你想在管道的中间步骤上拟合和转换数据,那么重用相同的管道并且更好地使用你指定的新管道是没有意义的,因为调用fit()会忘记所有关于以前学过的数据。

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

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

或直接使用内部变量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存储在其他地方,否则在需要使用该功能时,您需要再次适合整个管道。