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

时间:2018-06-21 09:24:49

标签: python machine-learning scikit-learn cross-validation

为了执行适当的CV,建议使用流水线,以便可以对CV中的每个折叠应用相同的转换。我可以使用tools:replace="android:appComponentFactory" android:appComponentFactory="whateverString" <application android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" tools:replace="android:appComponentFactory" android:appComponentFactory="@string/action_settings"> 定义自定义转换。推荐哪种方法?为什么?

2 个答案:

答案 0 :(得分:7)

完全取决于您,两者都会或多或少地达到相同的结果,只是编写代码的方式有所不同。

例如,在使用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

因此,如您所见,与FunctionTransformer相比,TransformerMixin在转换功能方面给您更大的灵活性。您可以根据值应用多个转换或部分转换,等等。例如,对于您要记录的前50个值,而对于接下来的50个希望进行逆记录的值,依此类推。您可以轻松定义转换方法以选择性地处理数据。

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

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

答案 1 :(得分:3)

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

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

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