我从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()
之前,调用所示的任何一个方法都会导致无限递归。fit
和transform
是显而易见的,它们只是调用自己,因此如果调用它们,它们将永远不会返回,并且您将超过最大递归深度。你知道吗另一方面,
fit_transform
正在调用self.fit(X).transform(X)
。所以它做的第一件事就是调用self.fit(X)
,它一遍又一遍地调用自己,直到错误发生。你知道吗另一方面,修改后的版本通过对
super()
的调用将调用传递给fit
和transform
的父类版本,因此它们不调用自己。事实上,有了这些调用,您甚至不需要从fit_transform
调用super()
。你知道吗但最好的解决方法是简单地删除派生类中
fit
和transform
的定义,并从fit_transform
中删除对super()
的调用,这是不需要的。你知道吗相关问题 更多 >
编程相关推荐