仅缓存 sklearn 流水线中的一个步骤

Cache only a single step in sklearn's Pipeline

我想在我的 sklearn 管道中使用 UMAP,我想缓存该步骤以加快速度。但是,由于我有自定义 Transformer,the suggested method 不起作用。

示例代码:

from sklearn.preprocessing import FunctionTransformer
from tempfile import mkdtemp
from sklearn.pipeline import Pipeline
from umap import UMAP
from hdbscan import HDBSCAN
import seaborn as sns

iris = sns.load_dataset("iris")
X = iris.drop(columns='species')
y = iris.species

@FunctionTransformer
def transform_something(iris):
    iris = iris.copy()
    iris['sepal_sum'] = iris.sepal_length + iris.sepal_width
    return iris

cachedir = mkdtemp()
pipe = Pipeline([
                 ('transformer', transform_something),
                 ('umap', UMAP()),
                 ('hdb', HDBSCAN()),
                ],
                memory=cachedir
            )

pipe.fit_predict(X)

如果你运行这个,你会得到一个PicklingError,说它不能腌制自定义转换器。但我只需要缓存 UMAP 步骤。有什么建议可以让它发挥作用吗?

不是最干净的,但您可以嵌套管道吗?

pipe = Pipeline(
    [
        ('transformer', transform_something),
        ('the_rest', Pipeline([
            ('umap', UMAP()),
            ('hdb', HDBSCAN()),
        ], memory=cachedir))
    ]
)

同样有效的是,不使用 FunctionTransformer,而是像这样从头开始编写您的自定义转换函数:

from sklearn.base import BaseEstimator, TransformerMixin

class transform_something(BaseEstimator, TransformerMixin):
    def __init__(self):
        pass
        
    def fit(self, X):
        return self

    def transform(self, X):
        X = X.copy()
        X['sepal_sum'] = X.sepal_length + X.sepal_width
        return X

不幸的是代码有点多,但它是可腌制的。