为何使用`if regressor:`这类条件语句会触发报错?
问题
测试scikit-learn中的多种回归器时,仅以回归器对象作为if判断条件会触发报错,示例代码如下:
from sklearn.neural_network import MLPRegressor from sklearn.ensemble import GradientBoostingRegressor, HistGradientBoostingRegressor for j, model in enumerate([MLPRegressor(), HistGradientBoostingRegressor(), GradientBoostingRegressor()]): if model: print(f'{j}: True. You defined the model: %s'%type(model))
运行结果:
0: True. You defined the model: <class 'sklearn.neural_network._multilayer_perceptron.MLPRegressor'> 1: True. You defined the model: <class 'sklearn.ensemble._hist_gradient_boosting.gradient_boosting.HistGradientBoostingRegressor'> AttributeError: 'GradientBoostingRegressor' object has no attribute 'estimators_'
仅GradientBoostingRegressor触发AttributeError,但使用if model is not None:则不会报错,这是为什么?
原因解析
if model的本质是调用对象的内置判断方法:当直接用对象作为if判断条件时,Python会优先调用对象的__bool__方法确定真假;若未定义__bool__,则调用__len__方法,根据返回值是否为0判断。- scikit-learn模型的内置判断实现存在差异:
MLPRegressor和HistGradientBoostingRegressor的__bool__方法未依赖未初始化的属性,直接判断不会报错。GradientBoostingRegressor的__bool__实现中,会检查estimators_属性——该属性仅在模型拟合(fit)数据后才会被初始化。未拟合的模型执行这个判断时,就会触发AttributeError。
if model is not None:的逻辑完全独立:这个判断是直接比较对象身份是否为None,不会触发任何对象内部的方法调用。只要模型完成实例化(哪怕未拟合),model就不是None,因此不会报错。
内容的提问来源于stack exchange,提问作者YKC
相关产品推荐
相关产品推荐

