如何在scikit-learn Pipeline中复用支持inverse_transform的Transformer
解决方案
你可以通过实现一个通用的逆转换包装器来实现需求,不需要修改原有转换器逻辑,也不用重复拟合,同时可以随时获取原transform方法的输出:
from sklearn.pipeline import Pipeline from sklearn.decomposition import PCA from sklearn.preprocessing import FunctionTransformer import numpy as np import matplotlib.pyplot as plt # 通用逆转换包装器,接收已拟合的转换器,调用其inverse_transform作为transform逻辑 class InverseTransformer(FunctionTransformer): def __init__(self, estimator): super().__init__(func=estimator.inverse_transform) # 初始化PCA转换器,只需要实例化一次 pca = PCA(n_components=3) # 构建Pipeline pipe = Pipeline([ ("pca", pca), # 直接传入已拟合的pca实例,复用同一个转换器 ("pca_inv", InverseTransformer(pca)) ]) X = np.random.uniform(0,5,(100,10))+np.arange(10) # 拟合流水线 reconstructed_X = pipe.fit_transform(X) # 随时可以获取压缩后的特征 compressed_X = pipe.named_steps['pca'].transform(X) # 绘图 # 原始数据 plt.plot(X.T) plt.show() # 重建后数据 plt.plot(reconstructed_X.T) plt.show()
方案优势
- 不需要修改原转换器的实现逻辑,适配所有支持
inverse_transform方法的sklearn转换器 - 同一个转换器实例只拟合一次,没有冗余计算
- 可以随时通过
pipe.named_steps['步骤名']拿到对应转换器,调用其transform方法获取压缩后的输出 - 代码逻辑清晰,符合sklearn的API设计规范
效果图
- 原始数据:

- 转换逆转换后的数据:

内容的提问来源于stack exchange,提问作者Jeanot Zubler
相关产品推荐
相关产品推荐

