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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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