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

为了进行正确的交叉验证(CV),建议使用管道(pipelines),这样可以对CV中的每个折叠应用相同的变换。我可以通过使用sklearn.preprocessing.FunctionTrasformer子类化sklearn.base.TransformerMixin来定义自定义变换。哪一种方法是推荐的?为什么?


回答:

这完全取决于你,两者大体上能达到同样的结果,只是代码编写方式不同。

例如,使用sklearn.preprocessing.FunctionTransformer时,你可以简单地定义你想要使用的函数并直接调用它,就像这样(官方文档中的代码

def all_but_first_column(X):    return X[:, 1:]def drop_first_component(X, y):    """    创建一个包含PCA和列选择器的管道,并使用它来转换数据集。    """    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

另一方面,使用子类化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):        #执行变换并返回        return transformed_data

如你所见,相对于FunctionTransformer,TransformerMixin在变换函数方面提供了更多的灵活性。你可以应用多个变换,或根据值进行部分变换等。例如,对于前50个值你想取对数,而对于接下来的50个值你想取反对数,依此类推。你可以轻松地定义你的变换方法来选择性地处理数据。

如果你只是想直接使用一个函数,就使用sklearn.preprocessing.FunctionTrasformer;否则,如果你想进行更多修改或说复杂的变换,我建议子类化sklearn.base.TransformerMixin

在这里,看看以下链接可以获得更好的理解

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注