模型实质
xgboost是专注于树模型的梯度提升库,因此xgboost内部有两个不同的部分:
- 由trees组成的模型
- 用来建立模型的超参数和配置
当我们调用booster.save_mode的时候,XGBoost实际上保存了三类信息:trees、一些模型参数(训练好的树中输入的列数)、目标函数(objective function)。这三类信息共同组成了XGBoost中的“模型”的概念。
目标函数也要保存的原因是,目前函数控制了global bias的转换。我们可以通过调用在XGBoost中调用base_score查看)。这样,我们就可以把模型分享给其他人,用来predict、evaluate或者用不同的超参数继续训练。
有些时候,我们除了保存模型以外,还需要保存其他的信息。
例如,在分布式训练中,XGBoost执行checkpoint操作。或者是出于某些原因,我们选用的分布式计算框架决策把模型从一个worker复制到另一个worker,并在那里继续训练。
此时,我们需要让序列化的输出包含足够多的信息,使得我们在不用再次提供任何参数的情况下,继续之前的训练。我们把这种场景称为memory snapshot(或者是memory based serialisation method),并且把它和常规的模型输入输出(IO)操作区分开来。
对于Python环境俩说,memory snapshot主要用在:当内置的pickle模块pickle Booster对象时。
注意:
以前的二进制模型保存格式并不区分模型和raw memory serialisation forma,它是各种东西的混合。这也是为什么我们想要用一个更robust序列化方法来替代二进制模型保存方法。JVM 包具有其自己的基于内存的序列化方法。
XGBoost如何保存和读取模型文件?
(一)保存模型
如果使用的是二进制文件保存的模型,那么Python Booster对象的辅助特性(feature_names)不会被导入。
如果要将模型保存成JSON格式,我们要将模型文件的后缀设置成.json。此时只保存trees和目标函数。例如:
bst.save_model('model_file_name.json')
参数:
fname(字符串或os.PathLike)–输出的文件名
从XGBoost1.3开始,对于memory snapshot,JSON文件是默认的保存格式。
(二)读取模型
读取模型使用load_model(fname)。
这一功能可以从一个文件或者bytearray读取模型。文件的地址可以是本地路径,也可以是一个URI。如果使用的是二进制文件保存的模型,那么Python Booster对象的辅助特性(feature_names)不会被导入。
# 法一
model_xgb_2 = xgb.Booster()
model_xgb_2.load_model("model.json")
# 法二:
clf = XGBClassifier()
booster = Booster()
booster.load_model('./model.xgb')
clf._Booster = booster
clf.predict(...)
参数:
fname(字符串,os.PathLike或内存缓冲区):输入的文件名或内存缓冲区(另请参见save_raw)
(三)保存内存缓冲区表示(memory buffer representation)
我们也可以把模型保存到一个内存缓冲区表示(memory buffer representation),而不是保存成一个文件。
save_raw()
这个方法会返回内存缓冲区表示形式返回模型。
(四)保存DMatrix
save_binary(fname, silent=True)
作用:
将DMatrix保存到XGBoost缓冲区。我们可以把二进制文件的路径输入到xgboost.DMatrix()中,作为模型的输入。
models和memory snapshots的向下兼容性如何?
XGBoost官方保证models可以向下兼容。但是对于memory snapshots并不保证。
Models(也就是trees和目标函数)使用稳定的表示方法,因此用老版本的XGBoost模型保存的models可以被新版本的XGBoost读取。如果我们想要长期储存我们的模型,建议使用save_model方法。
另一方面,memory snapshot(serialisation)捕获了XGBoost内部的许多内容,它的格式并不稳定,有频繁调整的倾向。因此,memory snapshot只适用于checkpointing,在这里我们可以保留训练配置的完整快照,以便可以从可能的故障中可靠地恢复并恢复训练过程。
用新版本额XGBoost去读取由老版本的XGBoost保存的Loading memory snapshot可能会导致错误或者是未知的情况。
如果模型是由pickle.dump保存的,那么模型有可能没法被新版本的XGBoost读取。
XGBoost如何保存和读取模型? - 知乎 (zhihu.com)