sklearn模型序列化

我们训练出来一个模型如果要应用于实际的项目/服务中,模型的保存和再现是必须要解决的问题,sklearn的模型官方推荐使用pickle或者joblib,个人的实践是可以使用dill来做序列化.

三种方法的利弊

三种方法都有一个缺陷就是依赖固定版本的python环境,sklearn并不支持将模型序列化为一些通用格式,sklearn是专为python设计的.

pickle

pickle最好的地方就是没有任何模块依赖,pickle是标准库,且它可以序列化为文件或者bytes.而且速度快,文件小.

但它的缺点也很大,它依赖代码依赖对象命名,你必须在已经定义好所有pickle依赖的同名函数,类等的情况下才可以正常的载入模型.

pickle比较合适的使用场景是训练,保存和使用的时候都固定使用某一段代码,而且要求服务尽量少依赖小开销的时候.

joblib

joblib相对来说比pickle在代码依赖上要好点,但它只能保存为文件,不能转化为bytes或者字符串,这样的话我们要将模块保存到数据库上就会麻烦很多.

它适合作为暂存保存模型的场景.

dill

dill是一个比较好用的序列化工具,本来设计了用来为分布式系统传递python对象的,上面俩的缺点它都没有,但这个库毕竟没有python官方或者sklearn官方做背书,而且序列化后文件很大.

序列化后的bytes处理

使用pickle或者dill序列化后.如果是序列化为bytes,这样其实要传递要保存也不方便,因为很多段会在保存或者传递过程中因为编码,特殊符号等问题产生错误,可以再其后再加一部base64序列化,这样就可以比较稳妥了