对Scikit Learn和Tensorflow模型进行序列化和反序列化的方法

426 阅读9分钟

有各种方法可以将训练有素的机器学习模型投入到生产中,而检查所开发的机器学习模型是否准备好用于生产的一种方法就是序列化和反序列化。 这种技术使得开发的机器学习模型的某些参数可以在生产阶段进行相应的改变,并继续进行模型部署。因此,本文基本上简要介绍了序列化和反序列化机器学习和深度学习模型用于生产或传输的最佳方法。

目录

  1. 概述以及序列化和反序列化的必要性
  2. Scikit Learn模型的案例研究
    1. Pickle格式
    2. Joblib格式
  3. TensorFlow模型的案例研究
    1. HDF5(h5)格式
    2. JSON格式
  4. 摘要

让我们首先讨论一下为什么我们在部署模型时需要序列化和反序列化。

序列化和反序列化的概述和必要性

序列化是将整体数据结构或训练有素的模型转化为灵活的检索格式的过程,以方便以后将序列化的模型分解到生产中。在生产环境中分解训练好的模型的方法也可以称为反序列化

因此,序列化和反序列化的过程对于获得准备用于生产或最终部署的模型是必要的,也是为了获得在生产中交付的可靠模型。机器学习和深度学习模型有多种格式,可以分别进行序列化和反序列化。

机器学习模型的一些标准形式主要包括pickle、joblib和JSON(JavaScript对象符号),至于深度学习模型,有各种类型,如HDF5(h5)(分层数据格式)、YAML(Yet Another Markup Language)和Keras支持的JSON**。**

因此,根据计算要求以及访问和存储的便利性,选择了各自的数据格式,其中JSON和YAML格式被证明是更适合人类解释和灵活的。

scikit learn模型的案例研究

如前所述,机器学习模型的序列化和反序列化可以通过三种形式完成。它们是pickle格式、joblib格式和JSON格式。让我们分别探讨一下每一种类型。

Pickle序列化和反序列化的步骤

pickle模块的使用通常被称为pickling,其中训练好的模型参数将被转换为字节流,随后在生产端被反序列化。腌制机器学习模型的步骤如下所示。

将所需的模块导入工作环境中,如下图所示。

import pickle

如果该模块在工作环境中不可用,它可以很容易地在同一工作环境中使用pip命令安装,如下图所示,然后将相同的模块导入到工作环境中。

!pip install pickle
import pickle

之后,可以给pickle文件名一个随机的名字,并且可以提到一个打印语句来验证机器学习模型在工作环境中的成功序列化,如下图所示。

dtc_pkl_filename="DTC_Model.pkl"

print('Pickle model serialized to the working environment')

如果训练后的模型序列化成功,我们将得到以下输出。

内置的dump函数必须被用来打开序列化的pickle文件并执行所需的写操作,这里主要使用写二进制(wb) 来确保文件可以被访问,以二进制格式执行写操作,因为pickling过程也支持二进制格式存储。下面给出了同样的代码。

with open(dtc_pkl_filename, 'wb') as file: #wb stands for write binary and open is used to serialize the model
   pickle.dump(dtc_model, file) # dump is used to serialize the ML model

现在,pickle的加载模块被用来在相同的工作环境中反序列化倾倒的pickle文件,如下图所示,其中读取二进制(rb) 被用来反序列化训练过的模型,也用来评估模型的各种参数。解序列化的完整步骤和解序列化的模型在评估某些参数时的用法如下。

with open(dtc_pkl_filename, 'rb') as file: ## rb stands for read binary which is used to deserialize the ML model from the working environment
   des_dtc_model = pickle.load(file)  ## load is used to bring the ML model from the pickle format to the working environment

成功地将模型反序列化到工作环境中,可以使用如下所示的打印语句来完成。

print('Pickle model deserialized to the working environment')

上述打印语句产生了以下输出。

之后,使用反序列化的模型,可以计算出准确率,如下图所示。

acc_score=des_dtc_model.score(X_test,Y_test)

在本案例研究中,反序列化的模型产生了70.99%的准确率,如下图所示。

print('Accuracy score of Deserialized Model is',acc_score*100)

机器学习模型的酸洗比较容易,但有时由于人类无法更容易地解释,酸洗过程在生产中被谴责,而选择了其他格式。

joblib序列化和反序列化的步骤

Joblib是pickle模块的一个扩展,由于它在管道中的数据类型转换较轻,而且它对各种数据类型的处理速度较快,所以它被用来代替pickle。

joblib模块可以在工作环境中使用,如下图所示。

pip install joblib
import joblib

之后可以为joblib文件声明一个随机的名字,如下图所示。

dtc_joblib_file = "DTC_Model.pkl" 

现在,joblib文件的序列化过程可以通过使用类似pickle的内置函数dump 来完成,将文件格式序列化到工作环境中,joblib文件的成功序列化可以被评估,如下图所示。

joblib.dump(dtc_model, dtc_joblib_file)
print('Joblib model serialized to working environment')

现在,训练好的模型可以通过类似pickle的加载 模块被反序列化到工作环境中,如下图所示。反序列化的步骤如下所示。

DTC_joblib_model = joblib.load(dtc_joblib_file) ## load is used to deserialize the ML model to the working environment

成功的反序列化可以被验证,如下图所示,产生相应的输出。

print('Joblib model deserialized to working environment')
DTC_joblib_model

后来,反序列化的模型被用来评估准确度,以及生成的输出,如下图所示。

acc_score_joblib=DTC_joblib_model.score(X_test,Y_test)
print('Accuracy score of Deserialized Joblib Model is',acc_score_joblib*100)

然而,joblib模块是pickle的扩展,但由于它的计算和存储优势,它被选为pickle的扩展。在下一节中,让我们探讨一下以JSON格式序列化和反序列化ML模型的步骤。

Tensorflow模型的案例研究

与机器学习模型的序列化和反序列化过程不同,深度学习模型有其各自的序列化和反序列化的格式。对于深度学习模型,Keras为hdf5(h5)、YAML和JSON等格式提供了大量支持。下文简要讨论了相关的步骤。

HDF5(h5)格式的序列化和反序列化

首先,必要的模块必须从Keras导入,如下图所示。

from tensorflow.keras.models import load_model

现在,开发的深度学习模型可以被序列化到工作环境中,深度学习模型的序列化也可以被检查,如下所示。

model.save('serialized_dl_model.h5') ## Serializing the model
print('Model serialized to the disk')

现在,该模型可以被反序列化到工作环境中,如下图所示。

des_model=load_model('serialized_dl_model.h5')  ## Deserializing the model
print('Model deserialized to the disk')

现在,反序列化的深度学习模型可以被用于评估某些参数。评估模型测试损失和测试精度的步骤如下所示。

print('Testing loss {} \n Testing accuracy {}'.format(des_model.evaluate(X_test,Y_test)[0],des_model.evaluate(X_test,Y_test)[1]))

从实施的角度来看,基于hdf5(h5)格式的实施比较容易,但由于h5格式以分层格式存储复杂的数据,它有时会在最佳收敛性和快速处理方面有所顾虑。

JSON格式的序列化和反序列化

现在让我们来探讨一下JSON格式的深度学习模型的序列化和反序列化的步骤。与其他格式不同,必要的库必须从Keras模块中导入,如下图所示。

from tensorflow.keras.models import model_from_json

一旦导入必要的模块,深度学习模型就会使用to_json() 模块进行序列化,如下图所示。

json_model=model.to_json() ## Serializing the deep learning model to the disk

现在,模型必须被反序列化,首先以可读格式创建JSON文件,如下图所示。

json_file=open('json_model','r') ## r is used to read the json_file opened

现在,创建的JSON文件必须通过利用内置的read() 函数加载,并相应地关闭,如下图所示。

loaded_json_model=json_file.read()
json_file.close()

现在,使用Keras的model_from_json库将反序列化的模型加载到工作环境中,如下图所示。

des_json_model=model_from_json(loaded_json_model)

现在,反序列化的深度学习模型必须在同一个工作环境中再次进行相应的编译,然后继续评估需要的参数。在这里,评估反序列化模型的测试性能所涉及的步骤如下所示。

print('Testing loss {} \n Testing accuracy {}'.format(des_json_model.evaluate(X_test,Y_test)[0],des_json_model.evaluate(X_test,Y_test)[1]))

在上图中,我们可以看到,深度学习模型反序列化后,在测试阶段,模型的损失增加了,准确率下降了,这显示了模型不可靠的迹象,同时对变化的数据表现不佳,这就是序列化和反序列化的过程如何帮助我们交叉验证模型在生产中的表现。

总结

如前所述,机器学习和深度学习模型有各自的序列化和反序列化格式,以及一些相关的优点和缺点。下表给出了与各个类型相关的某些参数和关注点。

Scikit-learn模型关注点和参数Tensorflow模型的关注点和参数
pickle格式很容易实现,但它不是人类可以解释的,而且在生产中显示出较慢的收敛迹象。h5格式很容易实现。但由于其存储的层次性,它可能会显示出对复杂模型和巨大数据处理的关注。
joblib格式是pickle的扩展,由于它与各种数据类型的融合速度较快,所以被选择为pickle。由于安全问题,YAML格式的序列化似乎不再被Keras所支持。
JSON格式容易产生属性错误,而且很难对某些属性进行反序列化,它很容易被人类操作和解释。JSON格式很容易实现,但反序列化模型在测试中显示出较高的损失和较低的准确性,这在生产过程中会成为一个问题。

参考文献

The postMethods to Serialize and Deserialize Scikit Learn and Tensorflow models for productionappeared first onAnalytics India Magazine.