从 sklearn.pipeline.Pipeline 获取转换器结果
Posted
技术标签:
【中文标题】从 sklearn.pipeline.Pipeline 获取转换器结果【英文标题】:getting transformer results from sklearn.pipeline.Pipeline 【发布时间】:2018-01-19 11:23:06 【问题描述】:我正在使用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)
但我想在一个管道中完成所有操作。
【问题讨论】:
说清楚,我有兴趣得到中间结果,例如transformer1.fit_transform(df)
和 transformer2.fit_transform(transformer1.fit_transform(df))
【参考方案1】:
如果您想在管道的中间步骤上拟合和转换数据,那么重复使用相同的管道是没有意义的,最好使用您指定的新管道,因为调用 fit()
会忘记之前的所有信息学习数据。
但是,如果您只想 transform()
并查看已安装管道上的中间数据,则可以通过访问 named_steps
参数来实现。
new_pipe = sklearn.pipeline.Pipeline([('transformer1':
old_pipe.named_steps['transformer1']),
('transformer2':
old_pipe.named_steps['transformer2'])])
或者直接使用内部变量steps
like:
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
存储在其他地方以执行此操作,否则您需要在想要使用该功能时再次安装整个管道。
【讨论】:
以上是关于从 sklearn.pipeline.Pipeline 获取转换器结果的主要内容,如果未能解决你的问题,请参考以下文章