sklearn批量调用回归器报无estimators_属性错误排查与修复
报错原因
这个报错和你有没有显式配置estimator参数没有关系,核心问题是创建回归器集合的代码写法错误:
- 你写的
regressor = *AdaBoostRegressor(),*RandomForestRegressor(),*LinearRegression(),*SGDRegressor()这行,用*对刚实例化、还未训练的回归器对象做解包操作,Python会自动尝试遍历(迭代)这些回归器对象的内部元素 - 未完成训练的sklearn集成模型(比如AdaBoost、随机森林)被迭代时,会默认查找训练后才会生成的
estimators_属性,用来遍历内部的基学习器。这个属性在调用fit()方法之前根本不存在,自然会抛出属性不存在的错误 - 你单独实例化调用时没有报错,是因为你直接把实例赋值给变量,没有对未训练的实例做迭代解包操作,不会触发这个内部查找逻辑,等调用完
fit()再执行predict()就不会出问题。这也解释了为什么你把哪个回归器放在解包序列的第一位,就会报对应回归器的属性错误——代码在创建regressor元组的阶段就已经触发报错,根本没走到后面循环训练的步骤。
修复方案
- 去掉错误的
*解包写法,直接把实例化的回归器放在列表/元组中即可 - 补全缺失的评价指标导入(原代码没有导入
mean_squared_error和r2_score,运行时也会触发名称错误) - 注意:sklearn内置的回归评价函数参数顺序固定为「真实标签在前,预测结果在后」,写反会得到错误的指标计算结果,你原代码里两个指标的参数顺序写反了,需要调整。
修复后的完整可运行代码如下:
from sklearn.metrics import mean_squared_error, r2_score def regressors(x_train, y_train, xtest, ytest): from sklearn.ensemble import RandomForestRegressor, AdaBoostRegressor from sklearn.linear_model import ARDRegression, LinearRegression, SGDRegressor # 直接将模型实例放入列表,不要对未训练的模型实例用*解包 regressor_list = [ AdaBoostRegressor(), RandomForestRegressor(), LinearRegression(), SGDRegressor() ] for model in regressor_list: model.fit(x_train, y_train) pred = model.predict(xtest) print(model.__class__.__name__) print(f"MSE: {mean_squared_error(ytest, pred)}") print(f"R2 Score: {r2_score(ytest, pred)}") print("-"*30) # 调用函数 regressors(x_train, y_train, xtest, ytest)
内容的提问来源于stack exchange,提问作者Ahmed Seif
相关产品推荐
相关产品推荐

