【发布时间】:2018-04-14 14:20:30
【问题描述】:
我从 LabelBinarizer 创建了一个自定义编码器类。这是它的样子
class my_lb(LabelBinarizer):
def fit(self, X, y=None):
self.fit(X)
def transform(self, X, y=None):
return self.transform(X)
def fit_transform(self, X, y=None):
return self.fit(X).transform(X)
而且我有“超出最大递归深度”错误,该错误发生在 fit 方法中。按照网上的一些说明,我能够做到这一点:
class my_lb(LabelBinarizer):
def __init__(self):
super().__init__()
def fit(self, X, y=None):
super().fit(X)
def transform(self, X, y=None):
return super().transform(X)
def fit_transform(self, X, y=None):
return super().fit(X).transform(X)
但我的问题是,它如何解决我的问题?我可以理解此处其他帖子中的原因(我可以看到正在构建一个显式的无限循环),但我阅读了 LabelBinarizer 的代码,它对我来说看起来很正常。我找不到任何可能导致无限循环的东西。
def fit(self, y):
self.y_type_ = type_of_target(y)
if 'multioutput' in self.y_type_:
raise ValueError("Multioutput target data is not supported with "
"label binarization")
if _num_samples(y) == 0:
raise ValueError('y has 0 samples: %r' % y)
self.sparse_input_ = sp.issparse(y)
self.classes_ = unique_labels(y)
return self
谁能告诉我我在这里缺少什么?当我创建继承类时,它也将帮助我更好地了解何时需要 super。
【问题讨论】:
-
如果你继承了一个类,并且你想使用它的方法之一不变,只是不要在你的类中重写它。删除你的方法版本,父类的版本会自动被调用。您调用
super的版本似乎也不正确:您只是丢弃了y参数,而不是将其传递给父类的方法。 -
第二个块旨在解决管道类中的一个常见问题,即编码器不能很好地与管道方法一起工作。这就是为什么你看到我的 call 方法除了调用相应的父函数之外什么都不做。这里的 y 参数只是一个占位符,与管道中的其他功能保持一致。
标签: python inheritance recursion scikit-learn pipeline