继承标签二叙述器的类,但"maximum recursion depth exceede"错误



我从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()之前,调用所示的任何一种方法都会导致无限递归。 fittransform很明显,他们只是称呼自己,所以如果他们被召唤,他们永远不会回来,你会超过最大递归深度。

另一方面,fit_transform正在打电话给self.fit(X).transform(X). 所以它做的第一件事就是调用self.fit(X),它只是一遍又一遍地调用自己,直到发生错误。

另一方面,修改后的版本通过对super()的调用将调用传递给fittransform的父类版本,因此它们不会调用自己。 实际上,有了这些呼叫,您甚至不需要从fit_transform呼叫super()

但最好的解决方法是简单地删除派生类中 fittransform 的定义,并从 fit_transform 中删除对 super() 的调用,这是不需要的。

相关内容

  • 没有找到相关文章

最新更新