python - scikit-learn 管道 _transform() 采用“x”位置参数,但给出了“y”
问题描述
问题:
我正在使用 scikit-learn 的管道设计一个自定义转换器,但是位置参数不匹配。我定义的类是:
class DataSubsetGenerator(BaseEstimator, TransformerMixin):
def __init__(self, sub_percentage, random_state = 42):
self.sub_percentage = sub_percentage
self.random_state = random_state
def fit(self):
return self
def transform(self, X_train, X_test, y_train, y_test):
# Do data processing stuff here, removed to simplify example here...
return X_train_sub, X_test_sub, y_train_sub, y_test_sub
然后,我将其放入 1 步自定义管道中进行测试:
reduce_pipeline = Pipeline([
('Prototype dataset', DataSubsetGenerator(0.5, random_state = random_state))
])
X_train, X_test, y_train, y_test = reduce_pipeline.transform(X_train, X_test, y_train, y_test)
我收到错误:
TypeError Traceback (most recent call last)
<ipython-input-42-4b2a20eb8b63> in <module>()
3 ])
4
----> 5 X_train, X_test, y_train, y_test = reduce_pipeline.transform(X_train, X_test, y_train, y_test)
TypeError: _transform() takes 2 positional arguments but 5 were given
这是没有意义的,因为我已经定义了类的transform()
函数DataSubGenerator
来接受 4 个参数。
我的测试:
DataSubGenerator
我已经通过实例化和调用在不使用 sklearn 管道的情况下对此进行了测试transform()
,它根据设计运行:
dsg = DataSubsetGenerator(0.5, random_state = random_state)
X_train, X_test, y_train, y_test = dsg.transform(X_train, X_test, y_train, y_test)
我的问题是:为什么transform()
函数在 sklearn 管道中使用时不能识别这 4 个参数?
相关问答:
我试过研究,最接近的问答线程是这样的:_transform() 接受 2 个位置参数,但给出了 3 个。但是,我无法理解该解决方案以及它如何应用于我的场景。
解决方案
由于这条线而出现错误。在这里,期望只有X
当管道的最后一步有transform
方法时才会提供,这意味着它是从 regressorMixin 或 classifierMixin 继承的。
首先,我们需要了解 sklearn 的估算器遵循(X, y)
. 这也是管道 API 设计的原因。
因此,您在将数据输入管道之前进行数据拆分或采样。
推荐阅读
- java - 使用缓存但持续时间不同的 PostgreSQL 相同计划?
- node.js - 在 Ubuntu 上简单安装当前版本的 Wekan?
- c++ - 不能使用 ostream 打印,但可以使用 cout 打印?
- android - Recyclerview 在我退出并重新进入活动或按下返回按钮后加载
- c# - PVS Studio 抑制整个 C# 文件的单一警告
- bash - 如何在 docker 容器的入口点设置标志
- android - Nativescript - Android 中的 raddataform 日期选择器
- c# - c# 如何在VS2017 IDE中验证参数类似于string.Format
- java - Maven Cucumber 报告多个 JSON 文件
- excel - Excel VBA For Loop根据循环中的数字在单元格中写入公式