python - Sklearn 自定义转换器:使用 FunctionTransformer 和子类化 TransformerMixin 的区别
问题描述
为了进行正确的 CV,建议使用管道,以便可以将相同的转换应用于 CV 中的每个折叠。sklearn.preprocessing.FunctionTrasformer
我可以使用或 by定义自定义转换subclassing sklearn.base.TransformerMixin
。推荐的方法是哪一种?为什么?
解决方案
好吧,这完全取决于您,两者或多或少都会达到相同的结果,只是您编写代码的方式不同。
例如,在使用时,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
另一方面,在使用时,subclassing sklearn.base.TransformerMixin
您必须定义整个类以及该类的fit
和transform
函数。所以你必须创建一个这样的类(示例代码取自这篇博文)
class FunctionFeaturizer(TransformerMixin):
def __init__(self, *featurizers):
self.featurizers = featurizers
def fit(self, X, y=None):
return self
def transform(self, X):
#Do transformations and return
return transformed_data
如您所见,TransformerMixin
与 FunctionTransformer 在变换功能方面相比,它为您提供了更大的灵活性。您可以根据值应用多个转换或部分转换等。例如,对于您想要记录的前 50 个值,而对于接下来的 50 个值,您希望采用逆对数等。您可以轻松地定义转换方法以有选择地处理数据。
如果您只想直接使用函数,请使用sklearn.preprocessing.FunctionTrasformer
,否则如果您想进行更多修改或说复杂的转换,我建议subclassing sklearn.base.TransformerMixin
在这里,请查看以下链接以获得更好的想法
推荐阅读
- c# - 在 .NET Framework 应用程序中使用 WCF
- docker - AWS lambda 容器未选择系统依赖项
- awk - 过去 1 分钟的 PHP 日志
- flutter - 使用复选框 Flutter 更改另一个小部件
- python-3.x - 在 python 中使用 pandas 组合列表中的数据框以形成单个数据框
- javascript - Heroku 上的 ExpressJS 随机超时
- python - 从 flask_uploads 导入 UploadSet、configure_uploads、IMAGES 时出错
- powershell - Powershell命令查找替换没有给出任何错误,但没有替换
- c++ - C++ 虚拟继承和访问公共虚拟方法,该方法的实现在继承受保护的类中
- javascript - 为什么从地图获取比从对象获取慢?