在检查RandomForestClassifier是否已初始化时发生AttributeError

时间:2020-09-03 11:59:09

标签: python scikit-learn

我有一个将scikitlearn-RandomForestClassifier保留为成员变量的类。 在__init__方法中,它首先被初始化为None,

def __init__(self):
   self.classifier = None

和 稍后,一旦所有必需的参数都可用,就创建一个RandomForestClassifier并 分配给该成员变量:

def init_classifier(self):
    self.classifier = RandomForestClassifier(**params)

(在调试器中,我看到self.classifier已被初始化为有意义的东西。) 在应该使分类器适合数据的类方法中,首先检查是否 分类器已经初始化:

if not self.classifier:
    self.init_classifier()

这将导致AttributeError: 'RandomForestClassifier' object has no attribute 'estimators_'. 如果通过显式比较“无”进行检查,

if self.classifier is None:
    self.init_classifier()

它贯穿。有人可以告诉我这个AttributeError的来源吗?

1 个答案:

答案 0 :(得分:1)

要了解这种行为的原因,您需要查看对象的布尔比较如何在Python中工作。 (即当您致电if A时)。

  1. 首先,解释器将尝试查看对象是否实现了special method __bool__。这是一个特殊的方法,它将返回TrueFalse

  2. 如果未定义__bool__特殊方法,则解释器将尝试使用__len__函数。如果结果为0,则表达式在False处求值。 这是异常的来源

  3. 如果也未定义__len__函数,则该语句的计算结果为True

如果我们查看从其继承RandomForestClassifier的{​​{3}},我们可以看到它没有实现__bool__特殊方法,但确实实现了__len__特殊方法:

def __len__(self):
    """Return the number of estimators in the ensemble."""
    return len(self.estimators_)

因此,当您调用if not self.classifier:时,就是在调用该__len__函数。目前,在您的代码中,RandomForestClassifier尚未正确实例化(这是我的猜测),并且没有estimators_属性,因此是一个例外。

如果要检查对象是否未实例化,请始终显式调用与None的比较。在这种情况下,解释器将根据None检查对象。