机器学习实战 | 第五章:模型保存(持久化)

时间:2022-05-03
本文章向大家介绍机器学习实战 | 第五章:模型保存(持久化),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一、工具

sklearn官方给出了两种保存模型的方式:3.4. Model persistence 其中一种是pickle的方式,还有一种就是joblib包的使用.这里仅仅介绍更加简单的方便的joblib方法.

载入joblib很简单,一句话就行了.

1.from sklearn.externals import joblib

接下来就给出常用的joblib几个常用的函数的详细介绍.更多的细节可以参考:Joblib: running Python functions as pipeline jobs

存储模型(joblib.dump)

joblib.dump(value, filename, compress=0, protocol=None, cache_size=None)

作用: 持久化任意的python对象为一个文件.并且返回一个字符串列表,表示这些数据分别存放的位置. 参数: value: 待存储的Python对象 filename: 字符串或者pathlib,表示待存储的完整路径(当然包括文件名),要是使用压缩的话,下面这些扩展名的压缩 (‘.z’, ‘.gz’, ‘.bz2’, ‘.xz’ or ‘.lzma’) 会自动调用压缩方法. compress: 整形0到9或者布尔型或者一个二元元组,可选.表示压缩级别. 0或者False表示不压缩,越高的值表示越高的压缩力度,同时意味着更加慢的读取和写入.通常3是一个比较好的压缩值. 要是你是用的是bool值得True,也就认为你使用压缩,并且默认压缩级别是3. 要是你使用的是一个二元元组,那么第一个元素必须是与相应压缩方式表示的字符串, (e.g ‘zlib’, ‘gzip’, ‘bz2’, ‘lzma’ ‘xz’), 第二个就是一个0到9的整形,表示压缩级别. protocol: 正整数,表示pickle协议.可以看pickle.dump的文档了解更多细节. cache_size: 正整形,可选,已经被弃用.以后可以不理会这个参数.

读取模型(joblib.lord)

joblib.load(filename, mmap_mode=None)

作用: 重建通过joblib.dump方法持久化的对象.(可以理解为把硬盘上的对象,还原到内存里面来了.) 并且放回这个对象. 参数: filename: str or pathlib.表示存放对象文件的完整路径. mmap_mode: {None, ‘r+’, ‘r’, ‘w+’, ‘c’}, 可选. If not None, the arrays are memory-mapped from the disk. This mode has no effect for compressed files. Note that in this case the reconstructed object might not longer match exactly the originally pickled object.

二、综合例子

这里用一个利用ridge回归预测波士顿房价的例子来做模型存和取的例子.首先先上代码吧:

1.import numpy as np2.from sklearn.linear_model import Ridge3.from sklearn.externals import joblib4.from sklearn.datasets import load_boston5.6.#load data7.boston=load_boston()8.#print(boston.data.shape)9.#print(boston.target.shape)10.11.#split testSet and trainSet12.trainSet=boston.data[:400]
13.trainLabels=boston.target[:400]14.#print(trainSet.shape)15.#print(trainLabels.shape)16.17.testSet=boston.data[400:]
18.testLabels=boston.target[400:]19.20.#use model21.ridge=Ridge()22.#train23.ridge.fit(X=trainSet,y=trainLabels)24.#ridge.fit(X=boston.data[,y=boston.target)25.26.#predict27.result=ridge.predict(X=testSet)
28.print("result:n",result)
29.print("nnn")
30.print("testLabels:n",testLabels)31.32.#save model to disk33.joblib.dump(value=ridge,filename="ridgeModel.gz",compress=True)
34.print("model has saved!!")35.36.#load model from disk37.model=joblib.load(filename="ridgeModel.gz")
38.print(type(model))
39.result2=model.predict(testSet)
40.print(result2)

结果:

代码并不是很难,毕竟只是一个作为模型存储的简单例子.

首先就是要载入必要的一些模块了,这些模块都是需要熟悉的.然后就把内置的boston房价的数据集分为两部分,训练集和测试集,为了方便之后观察结果.

后面就先把模型(ridge对象)训练一次,并且观测预测结果.

然后把这个对象存到硬盘中(持久化),我这里用了.gz压缩文件的方式来存储.然后把这个压缩文件中的对象又”恢复”到内存中并且观察了其预测值.

这就是这整个代码的过程,看完相信对于模型的保存肯定也有了一定的了解了.