如何将模型持久化保存
由qxiao创建,最终由qxiao 被浏览 1 用户
一、背景说明
在量化研究和机器学习建模过程中,模型训练往往成本较高,如果每次使用都重新训练,不仅效率低,还会带来结果不一致的问题。
因此,模型持久化(Model Persistence) 是一个非常重要的工程实践,核心目标是:
- 一次训练,多次复用
- 回测、实盘、推理阶段加载同一个模型
- 避免 Notebook / 容器 / 进程重启导致模型丢失
本文以 XGBoost(二分类)模型 为例,演示完整的:
训练 → 保存 → 加载 → 复用 流程
二、模型训练流程
1.数据准备
这里使用 sklearn 自带的乳腺癌数据集作为示例(实际可替换为自己的 CSV / 特征数据)。
from sklearn.datasets import load_breast_cancer
X, y = load_breast_cancer(return_X_y=True, as_frame=True)
2.划分训练集 / 验证集
from sklearn.model_selection import train_test_split
X_train, X_valid, y_train, y_valid = train_test_split(
X,
y,
test_size=0.2,
random_state=42,
stratify=y
)
3.构造 DMatrix(XGBoost 专用数据结构)
import xgboost as xgb
dtrain = xgb.DMatrix(X_train, label=y_train)
dvalid = xgb.DMatrix(X_valid, label=y_valid)
4.设置模型参数
params = {
'objective': 'binary:logistic',
'eval_metric': 'auc',
'max_depth': 6,
'eta': 0.1,
'subsample': 0.8,
'colsample_bytree': 0.8,
'seed': 42
}
.模型训练(含 Early Stopping)
evals = [(dtrain, 'train'), (dvalid, 'valid')]
bst = xgb.train(
params,
dtrain,
num_boost_round=200,
evals=evals,
early_stopping_rounds=20,
verbose_eval=50
)
训练日志中可以看到 train-auc 和 valid-auc,用于判断模型是否过拟合。
这个时候我们的xgboost模型就已经训练好了,接下来我们把这个已经训练好的模型保存到我们的AIStudio的线上本地
此时 bst 就是一个已训练好的模型对象,可直接用于:
- 回测预测
- 实盘打分
- 批量离线推理
三、模型持久化保存(核心部分)
1.封装一个安全的模型保存函数
def save_xgb_model(bst, save_path):
"""
安全保存 XGBoost 模型(原生 json 格式)。
若文件已存在则先删除,再写入新模型,并自动创建缺失目录。
"""
# 1. 自动创建缺失的目录
os.makedirs(os.path.dirname(save_path), exist_ok=True)
# 2. 若文件已存在,则删除旧文件
if os.path.isfile(save_path):
os.remove(save_path)
# 3. 保存新模型
bst.save_model(save_path)
print(f"[INFO] 模型已保存 -> {save_path}")
2.指定保存路径并执行保存
target_path = "/home/aiuser/work/第二周/xgb模型/models/xgb_model11.json" #把这里改成自己想要保存的路径
save_xgb_model(bst, target_path)
保存好后,就会发现本地出现了一个已经训练好的模型文件
如果我们想替换掉这个
xgb_model11.json的模型数据,我们只需要重新训练这个模型,然后在save_xgb_model(bst, target_path)时,target_path保持和旧模型数据文件路径和文件名一致就可以啦,运行之后就会更新掉旧的文件模型。
四、模型加载与复用
当模型已经通过 bst.save_model() 持久化保存为文件之后,它就不再依赖当前 Notebook、内存或 Python 进程了,而是以一个独立的模型文件存在于你的账号目录中。
无论是新开一个 Notebook,关闭后重新启动 Notebook,提交模拟交易,实盘运行脚本还是定时任务 / 后台进程只要模型文件路径存在,就可以直接加载使用。
在新的 Notebook / 脚本 / 实盘进程中,只需加载模型即可使用,无需重新训练。
import xgboost as xgb
bst = xgb.Booster()
bst.load_model('/home/aiuser/work/第二周/xgb模型/models/xgb_model11.json') #把这里改成自己之前保存模型的路径
print('XGBoost 模型加载完成')
此时的 bst:
- 状态与训练完成时完全一致
- 包含全部树结构、参数、最佳迭代轮数
- 可直接用于 predict
dtest = xgb.DMatrix(X_new)
y_pred = bst.predict(dtest)
此时加载模型 ≠ 重新训练,load_model 不会消耗训练时间,也不会引入随机性。
模型更新的正确方法如果后续:
- 加了新特征
- 调了参数
- 用了更多数据
- 重新训练了一个更优模型
完全不需要改加载逻辑。
save_xgb_model(bst, target_path)
#并且 target_path 与旧模型路径保持一致:/home/aiuser/work/第二周/xgb模型/models/xgb_model11.json
#你需要把这个target_ptah改成你自己的target_path
\