仅缓存 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
不幸的是代码有点多,但它是可腌制的。
我想在我的 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
不幸的是代码有点多,但它是可腌制的。