如何保存机器学习模型

2025年06月20日 | 阅读 5 分钟

在使用 scikit learn 机器学习库时,有必要保存和恢复模型以便再次使用,与其他模型进行比较或使用新数据测试模型。保存数据的过程称为 序列化,而恢复数据的过程称为 反序列化。我们还需要处理不同类型和大小的数据。虽然有些数据集可以快速训练(例如,花费的时间较少),但大型数据集(大于 1GB)可能需要很长时间才能训练,即使在具有 GPU 的本地计算机上也是如此。为避免浪费时间和避免损失,请保存训练好的模型以便将来项目使用。

从 scikit-learn 保存模型的两种方法

1. Pickle 字符串

pickle 模块实现了一个高效而基础的算法,用于序列化或反序列化 Python 对象结构。

pickle 模型提供以下功能

  • dump: 对于 序列化 对象层次结构,我们可以使用 dump() 函数。
  • load: 对于 反序列化 数据流,我们可以使用 loads() 函数。

示例: 让我们将 K 近邻 应用于 iris 数据集,然后保存模型。

代码

输出

[1 2 0 2 1 1 2 1 0 0 0 2 1 1 0 1 1 0 0 1 2 0 1 0 2 1 1 2 1 0 2 2 0 0 2 0 2 2 2 1 2 2 1 0 0 1 0 0 1 0 0 1 2 1 2 2 1 0 2 1 0 0 1 0 2 2 0 1 2 1 0 1 2 0 1 0 1 1 1 0 1 2 2 2 1 1 1 2 1 0 0 1 1 2 0 0 0 1 0 2 1 0 0 1 2 0 0 2 2 2 1 2 1 2 0 2 2 0 2 1 0 0 2 0 2 2 1 1 2 1 1 2 0 1 2 2 0 2 2 1 1 2 0 1 0 1 1 0 2 0 1 1 2 1 2 2 0 2 2 1 2 1 1 2 1 2 0 2 0 1 0 2 2 1 1 2 2 2 0 2 0 0 0 0 0 0 0 2 0 2 2 0 1 1 1 0 0 0 1 2 2 2 1 2 2 0 1 0 1 0 2 1 2 0 1 2 2 0 0 1 1 0 1 1 0 0 1 0 1 2 0 2 0 0 1 2 2 1 0 2 1]
``

说明

在所示程序中,首先加载 iris 数据集,然后将其划分为训练集和测试集。然后导入 KNeighborsClassifier 系统并使用数据的训练集进行训练。我们使用 pickle.dumps() 方法将训练好的模型存储为 pickle 字符串。随后,使用 pickle.loads(),我们可以加载 pickle 好的模型,并使用该加载的模型进行预测。

2. 使用 joblib 将模型 pickle 为文件

Joblib 取代了 pickle,因为它在处理具有大型 numpy 数组的对象时速度更快。这些函数只接受类文件对象而不是文件名。

使用 joblib 将 pickle 模型作为文件提供以下功能

dump: 用于序列化对象层次结构。

load: 用于反序列化数据流。

示例: 使用 joblib 保存到 pickle 文件

代码

输出

[1 2 0 2 1 1 2 1 0 0 0 2 1 1 0 1 1 0 0 1 2 0 1 0 2 1 1 2 1 0 2 2 0 0 2 0 2 2 2 1 2 2 1 0 0 1 0 0 1 0 0 1 2 1 2 2 1 0 2 1 0 0 1 0 2 2 0 1 2 1 0 1 2 0 1 0 1 1 1 0 1 2 2 2 1 1 1 2 1 0 0 1 1 2 0 0 0 1 0 2 1 0 0 1 2 0 0 2 2 2 1 2 1 2 0 2 2 0 2 1 0 0 2 0 2 2 1 1 2 1 1 2 0 1 2 2 0 2 2 1 1 2 0 1 0 1 1 0 2 0 1 1 2 1 2 2 0 2 2 1 2 1 1 2 1 2 0 2 0 1 0 2 2 1 1 2 2 2 0 2 0 0 0 0 0 0 0 2 0 2 2 0 1 1 1 0 0 0 1 2 2 2 1 2 2 0 1 0 1 0 2 1 2 0 1 2 2 0 0 1 1 0 1 1 0 0 1 0 1 2 0 2 0 0 1 2 2 1 0 2 1]

说明

在这种情况下,我们的操作与之前相同,不是简单地使用 Pickle 来存储和加载模型,而是使用 joblib。我们使用 joblib.dump() 函数来存储模型,该函数会创建一个 pickle 文件。接下来,我们可以使用 joblib.load() 从文件中加载模型,并使用获得的模型预测结果。

结论

通过使用 Pickle 或 joblib,您可以保存机器学习模型以供将来使用并节省时间,而无需重新训练它们。在序列化对象方面,Pickle 是一个灵活的选择,而 joblib 在处理大型 numpy 数组时表现出色。