继承 LabelBinarizer 的 Class,出现 "maximum recursion depth exceede" 错误
Inherit Class of LabelBinarizer with "maximum recursion depth exceede" error
我从 LabelBinarizer 创建了一个自定义编码器 class。这是它的样子
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)
而且我有 "maximum recursion depth exceeded" 错误,它发生在 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
谁能告诉我我在这里错过了什么?当我创建继承 class.
时,它还会帮助我更好地了解何时需要 super
在更改为调用 super()
之前,调用所示的任何一种方法都会导致无限递归。 fit
和 transform
很明显,它们只是调用自己,所以如果它们被调用,它们永远不会 return 并且你会超过最大递归深度。
另一方面,fit_transform
正在调用 self.fit(X).transform(X)
。所以它做的第一件事就是调用 self.fit(X)
,它一遍又一遍地调用自己,直到发生错误。
另一方面,修改后的版本通过对 super()
的调用将调用传递给 fit
和 transform
的父 class 版本,所以他们不称呼自己。事实上,有了这些调用,您甚至不需要从 fit_transform
.
调用 super()
但最好的解决方法是简单地删除派生的 class 中 fit
和 transform
的定义,并从 [=13] 中删除对 super()
的调用=],这是不需要的。
我从 LabelBinarizer 创建了一个自定义编码器 class。这是它的样子
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)
而且我有 "maximum recursion depth exceeded" 错误,它发生在 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
谁能告诉我我在这里错过了什么?当我创建继承 class.
时,它还会帮助我更好地了解何时需要 super在更改为调用 super()
之前,调用所示的任何一种方法都会导致无限递归。 fit
和 transform
很明显,它们只是调用自己,所以如果它们被调用,它们永远不会 return 并且你会超过最大递归深度。
fit_transform
正在调用 self.fit(X).transform(X)
。所以它做的第一件事就是调用 self.fit(X)
,它一遍又一遍地调用自己,直到发生错误。
另一方面,修改后的版本通过对 super()
的调用将调用传递给 fit
和 transform
的父 class 版本,所以他们不称呼自己。事实上,有了这些调用,您甚至不需要从 fit_transform
.
super()
但最好的解决方法是简单地删除派生的 class 中 fit
和 transform
的定义,并从 [=13] 中删除对 super()
的调用=],这是不需要的。