xgboost保存读取模型

模型实质

xgboost是专注于树模型的梯度提升库,因此xgboost内部有两个不同的部分:

  1. 由trees组成的模型
  2. 用来建立模型的超参数和配置

当我们调用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)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,548评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,497评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,990评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,618评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,618评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,246评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,819评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,725评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,268评论 1 320
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,356评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,488评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,181评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,862评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,331评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,445评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,897评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,500评论 2 359

推荐阅读更多精彩内容