Sklearn自定义转换器:使用FunctionTransformer与子类TransformerMixin的区别

2024-06-30 15:09:38 发布

您现在位置:Python中文网/ 问答频道 /正文

为了实现正确的CV,建议使用管道,以便可以对CV中的每个折叠应用相同的变换。我可以使用sklearn.preprocessing.FunctionTrasformersubclassing sklearn.base.TransformerMixin来定义自定义转换。建议采用哪种方法?为什么?


Tags: 方法base管道定义sklearncv建议preprocessing
1条回答
网友
1楼 · 发布于 2024-06-30 15:09:38

好吧,这完全取决于你,两者或多或少都会达到相同的结果,只是你写代码的方式不同。

例如,在使用sklearn.preprocessing.FunctionTransformer时,您可以简单地定义要使用的函数,并像这样直接调用它(code from official documentation

def all_but_first_column(X):
    return X[:, 1:]

def drop_first_component(X, y):
    """
    Create a pipeline with PCA and the column selector and use it to
    transform the dataset.
    """
    pipeline = make_pipeline(PCA(), FunctionTransformer(all_but_first_column),)

    X_train, X_test, y_train, y_test = train_test_split(X, y)
    pipeline.fit(X_train, y_train)
    return pipeline.transform(X_test), y_test

另一方面,在使用subclassing sklearn.base.TransformerMixin时,必须定义整个类以及类的fittransform函数。 所以您必须创建这样的类(示例代码取自this blog post

class FunctionFeaturizer(TransformerMixin):
    def __init__(self, *featurizers):
        self.featurizers = featurizers

    def fit(self, X, y=None):
        return self

   def transform(self, X):
        #Do transformations
        return transformed data

如您所见,TransformerMixin在转换函数方面比FunctionTransformer提供了更多的灵活性。您可以应用多个trasnformation或部分转换(取决于值等)。例如,对于您要记录的前50个值,而对于接下来的50个值,您希望采用逆日志,依此类推。您可以很容易地定义转换方法来有选择地处理数据。

如果你只想直接使用一个函数,就使用sklearn.preprocessing.FunctionTrasformer,否则如果你想做更多的修改或者说复杂的转换,我建议subclassing sklearn.base.TransformerMixin

这里,请看下面的链接以获得更好的主意

相关问题 更多 >