我有一个将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的来源吗?
答案 0 :(得分:1)
要了解这种行为的原因,您需要查看对象的布尔比较如何在Python中工作。 (即当您致电if A
时)。
首先,解释器将尝试查看对象是否实现了special method __bool__
。这是一个特殊的方法,它将返回True
或False
。
如果未定义__bool__
特殊方法,则解释器将尝试使用__len__
函数。如果结果为0,则表达式在False
处求值。 这是异常的来源。
如果也未定义__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
检查对象。