关于python:继承LabelBinarizer的类,其中“最大递归深度超出”错误

Inherit Class of LabelBinarizer with “maximum recursion depth exceede” error

我从LabelBinarizer创建了一个定制的编码器类。这是它的样子

1
2
3
4
5
6
7
8
9
10
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方法中。我在网上做了一些笔记:

1
2
3
4
5
6
7
8
9
10
11
12
13
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的代码,这对我来说很正常。我找不到任何可能导致无限循环的东西。

1
2
3
4
5
6
7
8
9
10
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_transformself.fit(X).transform(X)。所以,它做的第一件事就是调用self.fit(X),它一遍又一遍地调用自己,直到错误发生。

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

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