在Python中使用scikit-learn保存和加载机器学习模型
找到一个准确的机器学习模型并不是该项目的结束。
在这篇文章中,你将了解如何使用scikit-learn在Python中保存和加载你的机器学习模型。
这使你可以将模型保存到文件中,并在以后加载,以便进行预测。
我们开始吧。
用pickle完成你的模型
Pickle是在Python中序列化对象的标准方式。
你可以使用pickle操作来序列化机器学习算法,并将序列化的格式保存到文件中。
稍后,你可以加载此文件来反序列化你的模型,并使用它进行新的预测。
下面的例子展示了如何在Pima Indians onset of diabetes数据集上训练Logistic回归模型,将模型保存到文件并加载,以便对未见的测试集进行预测(从此处下载)。
# Save Model Using Pickle import pandas from sklearn import model_selection from sklearn.linear_model import LogisticRegression import pickle url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv" names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] dataframe = pandas.read_csv(url, names=names) array = dataframe.values X = array[:,0:8] Y = array[:,8] test_size = 0.33 seed = 7 X_train, X_test, Y_train, Y_test = model_selection.train_test_split(X, Y, test_size=test_size, random_state=seed) # Fit the model on training set model = LogisticRegression() model.fit(X_train, Y_train) # save the model to disk filename = 'finalized_model.sav' pickle.dump(model, open(filename, 'wb')) # some time later... # load the model from disk loaded_model = pickle.load(open(filename, 'rb')) result = loaded_model.score(X_test, Y_test) print(result)
运行示例将模型保存到本地工作目录中的finalized_model.sav。加载保存的模型,并对其进行评估,用未知数据评估模型的准确率。
0.755905511811
使用joblib完成你的模型
Joblib是SciPy生态系统的一部分,为管道化python的工作提供的工具。
它提供了存储和导入python对象的工具,可以对Numpy数据结构进行有效的利用。
这对于某些需要大量参数或存储整个数据集(比如K-Nearest Neighbors)的机器学习算法很有用。
下面的示例演示了如何在Pima Indians onset of diabetes数据集上训练Logistic回归模型,使用joblib将模型保存到文件中,并加载它以对未知的测试集进行预测。
# Save Model Using joblib import pandas from sklearn import model_selection from sklearn.linear_model import LogisticRegression import joblib url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv" names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] dataframe = pandas.read_csv(url, names=names) array = dataframe.values X = array[:,0:8] Y = array[:,8] test_size = 0.33 seed = 7 X_train, X_test, Y_train, Y_test = model_selection.train_test_split(X, Y, test_size=test_size, random_state=seed) # Fit the model on training set model = LogisticRegression() model.fit(X_train, Y_train) # save the model to disk filename = 'finalized_model.sav' joblib.dump(model, filename) # some time later... # load the model from disk loaded_model = joblib.load(filename) result = loaded_model.score(X_test, Y_test) print(result)
运行该示例将模型保存为finalized_model.sav文件,并为模型中的每个NumPy数组创建一个文件(另外四个文件)。加载模型后,将报告对未知数据的模型精度的评估。
0.755905511811
关于最终确定模型的提示
本节列出了最终确定机器学习模型时的一些重要注意事项。
- Python版本。请注意python版本。几乎可以肯定的是,当你稍后加载和反序列化模型时,需要的Python的主要(可能是次要)版本与用于序列化模型的版本相同。
- 库版本。在反序列化保存的模型时,几乎可以肯定的是,机器学习项目中使用的所有主要库的版本都需要相同。这并不局限于NumPy版本和SCRICKIT-LEARN版本。
- 手动序列化。你可能希望手动输出学习模型的参数,以便将来可以在SCRKIT-LEARN或其他平台中直接使用它们。通常,机器学习算法用来进行预测的算法比用来学习参数的算法简单得多,在你可以控制的自定义代码中可能很容易实现。
请注意版本,以便以后由于某种原因无法在另一台计算机或另一平台上重新加载模型时,可以重新创建环境。
摘要
在这篇文章中,你发现了如何用scikit-learn在Python中持久化你的机器学习算法。
你学习了两种可以使用的技术:
- 用于序列化标准Python对象的Pickle API。
- 用于使用NumPy数组高效序列化Python对象的joblib API。