Python 机器学习核心入门与实战进阶 Day 6 - 模型保存与加载(joblib / pickle)

✅ 今日目标

  • 掌握如何将训练好的模型持久化保存到文件
  • 熟悉两种主流保存方式:joblibpickle
  • 加载模型并应用于新数据预测
  • 实现完整的"训练 → 保存 → 加载 → 预测"流程
  • 为后续部署做准备(如 Flask、FastAPI)

🧰 一、模型保存工具对比

工具 特点 推荐场景
pickle Python 原生序列化工具,支持任意对象 通用保存
joblib 专为 NumPy / sklearn 设计,速度快 大模型保存

🧪 二、基本用法示例

✅ 使用 joblib

python 复制代码
from joblib import dump, load

# 保存模型
dump(model, 'model.joblib')

# 加载模型
model = load('model.joblib')

✅ 使用 pickle

python 复制代码
import pickle

# 保存
with open('model.pkl', 'wb') as f:
    pickle.dump(model, f)

# 加载
with open('model.pkl', 'rb') as f:
    model = pickle.load(f)

🧠 三、完整流程练习建议

  1. 使用 SVC 训练一个模型(可复用之前数据)
  2. 使用 joblib 保存模型
  3. 清空变量,重新加载模型
  4. 对测试集进行预测,验证效果是否一致
  5. 可封装为 model_utils.py 工具模块

🧾 今日总结

学会了什么 用来干嘛
joblib.dump/load() 快速保存/加载模型
pickle.dump/load() 更通用但稍慢
模型持久化流程 为部署和复用做准备

📁 练习脚本:save_load_model_demo.py

python 复制代码
# SVM 模型保存与加载演示(使用 joblib)

import numpy as np
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from joblib import dump, load

# 构造数据
np.random.seed(42)
size = 100
scores = np.random.randint(40, 100, size)
genders = np.random.choice([0, 1], size=size)
labels = (scores >= 60).astype(int)

X = np.column_stack(((scores - scores.mean()) / scores.std(), genders))
y = labels

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 训练模型
model = SVC(kernel='rbf', C=1.0, gamma='scale')
model.fit(X_train, y_train)

# 保存模型
dump(model, 'svm_model.joblib')
print("模型已保存为 svm_model.joblib")

# 加载模型
loaded_model = load('svm_model.joblib')
print("模型已加载成功")

# 预测与评估
y_pred = loaded_model.predict(X_test)
print("测试集准确率:", accuracy_score(y_test, y_pred))

运行输出:

python 复制代码
模型已保存为 svm_model.joblib
模型已加载成功
测试集准确率: 1.0