如何不重训重测从pickle保存的机器学习模型提取评估指标
核心结论
无法直接从你当前保存的裸SVM模型pkl文件中直接读取F1分数、混淆矩阵、召回率这类评估指标。
原因很简单:这类评估指标不是模型本身的固有属性,是训练好的模型在固定测试数据集上完成推理后,将预测结果和测试集真实标签对比计算得到的统计值。你当前用pickle存储的内容仅包含训练完成的模型结构、参数,没有存储对应评估结果,也没有存储测试集数据,因此光加载这个pkl文件拿不到现成的指标。
注意:获取这些指标不需要重新执行模型训练流程,仅需根据你之前保存文件的情况选择对应方案即可。
具体实现方案
- 如果你之前保存模型时,已经把评估指标和模型打包存储,加载后直接读取指标即可
推荐后续保存模型时使用这种方式,把模型、对应指标、甚至必要的测试集特征标签统一存在字典里序列化,示例代码如下:import pickle from sklearn.metrics import f1_score, confusion_matrix, recall_score # 模型训练完成、在测试集上得到预测结果后执行保存 y_pred = fitted_model.predict(X_test) save_bundle = { "fitted_model": fitted_model, "eval_metrics": { "f1_score": f1_score(y_test, y_pred, average="weighted"), # 根据你的分类任务选择合适的average取值 "confusion_matrix": confusion_matrix(y_test, y_pred), "recall": recall_score(y_test, y_pred, average="weighted") } } with open('SVM_Model_with_metrics.pkl', 'wb') as f: pickle.dump(save_bundle, f) # 加载时直接读取,不需要任何额外计算 with open('SVM_Model_with_metrics.pkl', 'rb') as f: loaded_bundle = pickle.load(f) loaded_model = loaded_bundle["fitted_model"] metrics = loaded_bundle["eval_metrics"] - 如果你之前只存储了裸模型文件,没有同步存指标,只要你留存了当时评估用的测试集(X_test、y_test),加载模型后仅需执行一次推理即可计算指标,完全不需要重新训练模型
对应实现代码:import pickle from sklearn.metrics import f1_score, confusion_matrix, recall_score # 加载已经训练好的模型 with open('SVM_Model.pkl', 'rb') as f: loaded_svm = pickle.load(f) # 用留存的原测试集做推理,不涉及训练 y_pred = loaded_svm.predict(X_test) # 计算需要的评估指标 f1 = f1_score(y_test, y_pred, average="weighted") cm = confusion_matrix(y_test, y_pred) recall = recall_score(y_test, y_pred, average="weighted")
提示:如果你找不到当时做评估对应的测试集,就无法复现和当时完全一致的评估指标,换用其他数据计算出的指标不具备和原结果对齐的参考价值。另外你当前加载模型后将变量命名为joblib_LR_model存在歧义,你存储的是SVM模型,建议命名和模型类型匹配,避免后续代码逻辑出错。
内容的提问来源于stack exchange,提问作者Lorain M
相关产品推荐
相关产品推荐

