Sklearn自定义变换器:使用FunctionTransformer和子类化TransformerMixin之间的区别

art*_*mis 7 python machine-learning scikit-learn cross-validation

为了进行适当的CV,建议使用管道,以便可以对CV中的每个折叠应用相同的转换.我可以使用sklearn.preprocessing.FunctionTrasformer或通过使用或定义自定义转换subclassing sklearn.base.TransformerMixin.推荐的方法是哪一种?为什么?

Moh*_*hif 10

嗯,这完全取决于你,两者都会或多或少地达到相同的结果,只有你编写代码的方式不同.

例如,在使用时,sklearn.preprocessing.FunctionTransformer您只需定义要使用的功能并直接调用它(官方文档中的代码)

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
Run Code Online (Sandbox Code Playgroud)

在另一方面,在使用subclassing sklearn.base.TransformerMixin你将不得不与一起定义了整个类fittransform类的功能.所以你必须创建一个这样的类(示例代码来自这篇博文)

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
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,TransformerMixin与FunctionTransformer相比,在转换功能方面为您提供了更多的灵活性.您可以根据值等应用多个trasnformations或部分转换.例如,对于要记录的前50个值,对于接下来的50个值,您希望采用逆对数等等.您可以轻松定义转换方法以有选择地处理数据.

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

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


Seb*_*mas 10

FunctionTransformer和 的子类之间的主要区别在于TransformerMixin,对于后者,您可以通过应用该fit方法来学习自定义转换器。

例如,StandardScalerfit方法期间学习列的均值和标准差,并且在transform方法中这些属性用于转换。这不能通过简单的方式实现FunctionTransformer,至少不能以规范的方式实现,因为您必须以某种方式通过火车集。

这种学习的可能性实际上是使用自定义转换器和管道的原因 - 如果您只是通过使用 a 来应用普通函数,那么FunctionTransformer在交叉验证过程中将一无所获。无论是在交叉验证之前转换一次还是在交叉验证的每个步骤中进行转换都没有区别(除了后者需要更多时间)。

  • 恕我直言,这应该是一个可以接受的答案 (3认同)
  • 这应该是公认的答案。`FunctionTransformer` 仅适用于无状态转换。 (2认同)