pickle保存的岭回归模型新数据评估及.score()方法疑问
你构建了用于预测商品X销量的岭回归(ridge regression)模型,最终模型共包含约180个特征,已通过pickle完成模型持久化保存。当前需要验证该模型在不同时间周期、特征维度完全对齐的新数据集上的泛化效果,计划将DataFrame格式的整个新数据集传入已保存的模型,计算R²等适用于回归任务的评估指标。
当前使用的代码如下:
# loading library import pickle with open('ridge_model', 'wb') as p: pickle.dump(ridge, p) y_test = df.pop('Target') x_test = df # load saved model with open('ridge_model' , 'rb') as p: new_reg = pickle.load(p) r_squared = new_reg.score(x_test,y_test) print(r-squared)
各变量说明:
ridge:训练完成的岭回归模型df:待执行预测的新数据集y_test:数据集对应的目标变量x_test:剔除目标变量后的特征集合
待解答的两个疑问:
- 是否可以直接将整个新数据集传入已持久化的现有模型完成预测,进而评估模型的性能表现?
- 代码中
r_squared = new_reg.score(x_test,y_test)行调用的.score()方法,计算的是否为与模型训练阶段一致的R²值,还是会返回其他类型的评估得分?
关于第一个问题
只要满足以下前提,直接传入整个新数据集完成评估是完全可行的:
- 新数据集的特征维度、列顺序、预处理逻辑和模型训练阶段完全对齐:你已经确认特征维度对齐,还需要保证特征列的顺序和训练时输入模型的顺序完全一致(scikit-learn模型不会识别DataFrame列名,会按传入数组的列位置匹配特征,列顺序错位会直接导致预测结果完全错误);同时新数据集必须经过和训练集完全一致的预处理(比如标准化、缺失值填充、类别特征编码等,预处理器必须用训练集拟合的版本,不能在新数据集上重新拟合)。
- 修正现有代码的逻辑错误:你贴的代码把模型保存逻辑和测试逻辑写在了一起,每次运行测试流程都会执行一次
pickle.dump覆盖已保存的模型,建议把训练保存、加载测试的代码拆分,避免误覆盖训练好的最优模型;另外最后一行print(r-squared)存在变量名书写错误,你定义的变量是r_squared,中间没有减号,需要改成print(r_squared)否则会触发运行错误。
pickle加载得到的模型对象和你训练完成时内存中的ridge对象完全一致,.score()方法本身就支持传入批量样本(整个DataFrame)计算结果,不需要逐行拆分预测。
关于第二个问题
如果你使用的是scikit-learn实现的岭回归模型sklearn.linear_model.Ridge,.score(x_test, y_test)返回的就是和训练阶段计算逻辑完全一致的R²决定系数,计算规则为:
$R^2 = 1 - \frac{\sum_{i=1}^{n}(y_i - \hat{y}_i)2}{\sum_{i=1}{n}(y_i - \bar{y})^2}$
其中$\hat{y}_i$是模型预测值,$\bar{y}$是真实值的均值。
scikit-learn中所有回归类模型的.score()方法默认都返回R²值,只有分类模型的.score()会返回准确率,不存在返回其他评估指标的情况。如果你需要额外计算MAE、MSE、RMSE等其他回归评估指标,需要从sklearn.metrics模块导入对应方法单独计算。
内容的提问来源于stack exchange,提问作者Python_help

