📜  Python保存机器学习模型

📅  最后修改于: 2020-04-23 10:53:30             🧑  作者: Mango

在机器学习中,与scikit学习库一起使用时,我们需要将经过训练的模型保存在文件中并进行还原,以便重用它以将模型与其他模型进行比较,以在新数据上测试模型。保存数据称为序列化,而恢复数据称为反序列化
此外,我们处理不同类型和大小的数据。一些数据集很容易训练,即它们花费的时间更少,但是即使是使用GPU,大数据集(大于1GB)的数据集也可能需要很长时间才能在本地计算机上训练。当我们在不同的项目中或以后需要相同的经过训练的数据时,为避免浪费训练时间,请存储经过训练的模型,以便将来可以在任何时候使用它。

我们可以通过两种方式将模型保存在scikit学习中:
1,Pickle:pickle模块实现了一个基本但功能强大的算法,用于对Python对象结构进行序列化和反序列化。

pickle模型提供以下函数:
pickle.dump要序列化对象层次结构,只需使用dump()。
pickle.load要反序列化数据流,请调用load()函数。

示例:让我们在虹膜数据集上应用K近邻算法,然后保存模型。

import numpy as np
# 加载数据集
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
y = iris.target
# 将数据集拆分为训练和测试
X_train, X_test, y_train, y_test = \
    train_test_split(X, y, test_size = 0.3,
                        random_state = 2018)
# 导入KNeighborsClassifier模型
from sklearn.neighbors import KNeighborsClassifier as KNN
knn = KNN(n_neighbors = 3)
# 训练模型
knn.fit(X_train, y_train)


使用泡菜将模型保存到字符串:

import pickle
# Save the trained model as a pickle string.
saved_model = pickle.dumps(knn)
# Load the pickled model
knn_from_pickle = pickle.loads(saved_model)
# Use the loaded pickled model to make predictions
knn_from_pickle.predict(X_test)

2,使用joblib将pickle的模型作为文件:Joblib是pickle的替代品,因为它对携带大型numpy数组的对象更有效。这些函数还接受类似文件的对象而不是文件名。

joblib.dump序列化对象层次结构
joblib.load以反序列化数据流

使用joblib保存pickle文件:

from sklearn.externals import joblib
# 将模型另存为pickle文件
joblib.dump(knn, 'filename.pkl')
# 从文件加载模型
knn_from_joblib = joblib.load('filename.pkl')
# 使用加载的模型进行预测
knn_from_joblib.predict(X_test)