如何在Scikit-learn中重新加载已训练完成的回归器?
如何在生产环境加载已训练好的Scikit-learn回归模型
你完全没必要手动复制私有属性——Scikit-learn官方提供了模型序列化的标准方案,这才是生产环境加载预训练模型的正确姿势,既安全又省心。下面我一步步给你讲怎么操作:
一、先保存已训练好的模型
在你训练完模型的环境中,用joblib(Scikit-learn官方推荐,比pickle更适合处理大型模型)或者pickle把模型保存到文件里。以你的RidgeCV为例:
import joblib from sklearn.linear_model import RidgeCV # 假设你已经拟合好reg_1 reg_1 = RidgeCV() reg_1.fit(X_train, y_train) # X_train是3特征输入,y_train是2特征输出 # 保存模型到文件 joblib.dump(reg_1, 'ridgecv_model.pkl')
对于你的另外两个模型KNeighborsRegressor和LinearRegression,保存方式完全一样,只需要替换模型实例即可:
from sklearn.neighbors import KNeighborsRegressor from sklearn.linear_model import LinearRegression # 假设knn_reg和linear_reg已经训练好 joblib.dump(knn_reg, 'knn_regressor.pkl') joblib.dump(linear_reg, 'linear_regressor.pkl')
二、在生产环境加载模型
到了生产代码里,只需要加载保存好的文件,就能直接使用模型做预测,完全不需要重新训练:
import joblib # 加载RidgeCV模型 loaded_reg_1 = joblib.load('ridgecv_model.pkl') # 验证加载后的模型参数是否和原模型一致 print('加载后的coef_:', loaded_reg_1.coef_) print('加载后的alpha_:', loaded_reg_1.alpha_) # 直接用加载后的模型做预测 y_pred = loaded_reg_1.predict(X_new)
同样的,加载另外两个模型也是一样的操作:
loaded_knn = joblib.load('knn_regressor.pkl') loaded_linear = joblib.load('linear_regressor.pkl')
为什么不推荐手动复制私有属性?
你担心直接操作私有属性不妥是对的,主要有这几个问题:
- 模型内部结构复杂:不同模型的私有属性差异很大,比如
RidgeCV除了coef_和alpha_,还有intercept_、cv_results_等关键属性,手动复制很容易遗漏,导致模型预测出错。 - 版本兼容性问题:Scikit-learn的版本更新可能会改变模型的内部属性结构,手动复制的代码在不同版本下可能失效,而官方的序列化工具会处理这些兼容问题。
- 维护成本高:如果后续更换模型,手动复制属性的代码需要重新调整,而序列化方案是通用的,所有Scikit-learn模型都支持。
注意事项
- 尽量保证保存模型和加载模型时的Scikit-learn版本一致,避免出现兼容性问题。如果版本差异较大,建议重新训练或测试加载后的模型是否正常工作。
- 如果你用
pickle保存,代码逻辑和joblib类似,但joblib在处理包含大量numpy数组的模型时效率更高,所以更推荐使用joblib。
内容的提问来源于stack exchange,提问作者cbuchart
相关产品推荐
相关产品推荐

