继承LabelBinarizer类,其中"最大递归深度超过"错误

时间:2017-11-02 06:23:45

标签: python inheritance recursion scikit-learn pipeline

我从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。

1 个答案:

答案 0 :(得分:0)

在更改为调用super()之前,调用所显示的任何一种方法都会导致无限递归。 fittransform是显而易见的,他们只是自称,如果他们被召唤,他们将永远不会返回,你将超过最大递归深度。

另一方面,

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

另一方面,修改后的版本通过调用fit将调用传递给transformsuper()的父类版本,因此他们不会将调用传递给super()。打电话给自己。事实上,有了这些电话,你甚至不需要从fit_transform拨打fit

但最好的解决方法是简单地删除派生类中transformsuper()的定义,并从fit_transform中移除对 frm.dataGridView2.Rows.Clear(); if (dataGridView1.Rows.Count > 0) { for (int i = 0; i < dataGridView1.Rows.Count; i++) { if (dataGridView1.Rows[i].Cells[0].Value != null) { frm.dataGridView2.Rows.Add(); frm.dataGridView2.Rows[i].Cells[0].Value = dataGridView1.Rows[i].Cells[0].Value.ToString(); frm.dataGridView2.Rows[i].Cells[1].Value = dataGridView1.Rows[i].Cells[1].Value.ToString(); frm.dataGridView2.Rows[i].Cells[2].Value = dataGridView1.Rows[i].Cells[2].Value.ToString(); frm.dataGridView2.Rows[i].Cells[3].Value = dataGridView1.Rows[i].Cells[3].Value.ToString(); frm.dataGridView2.Rows[i].Cells[4].Value = dataGridView1.Rows[i].Cells[4].Value.ToString(); frm.dataGridView2.Rows[i].Cells[5].Value = dataGridView1.Rows[i].Cells[5].Value.ToString(); } } } this 100% works i have used it 的调用,这不是&# 39; t需要。