背景:需要做XGB模型增量训练,但是因为一些原因没有得到原来的XGB模型,只有dump文件。
XGB模型的dump文件是它的树结构存储为一个相对人类好理解的模型文件,但并不能被重新加载进XGB进行增量训练。
嗯,说是那么说,我寻思试一下,看看最新版的XGB有没有增加这个功能,只载入dump文件就可以进行XGB增量训练。
一跑起来没报错,我寻思可以呢。
一开始加载数据啥的都没问题,但是在训练的时候报错:terminate called after throwing an instance of 'std::bad_alloc' what():,还把环境整崩了。
搜了一下,都说这是内存炸了导致的报错,但是我看了一下监控,内存完全没占满。
到这我还一直以为可能是我训练数据太大,或者是后台起的训练进程太多才导致的,完全没想过是不是dump文件的问题。
是在解决不了了,去洗了个澡,突然间就想到了,可能是dump文件的问题。
实验了一下,果然是,XGB模型增量训练只能在save_model保存的模型文件上训练,不能在dump_model的dump文件上训练,它不报解析错误反而报了一个内存错误。
实验代码:
import pandas as pd import xgboost as xgb import matplotlib.pyplot as plt from xgboost import plot_tree from xgboost import XGBClassifier data = pd.read_csv("../input/default-of-credit-card-clients-dataset/UCI_Credit_Card.csv") X = data.iloc[:,1:6] y = data.iloc[:,24] data = xgb.DMatrix(X, y) xgb_params = {} model = xgb.train(xgb_params, data) print(model.get_dump()) model.save_model("model.pickle") model.dump_model("model.dump") xgb_params = {'process_type':'update', 'updater':'refresh', 'refresh_leaf':True} model_new = xgb.train(xgb_params, data, xgb_model="./model.pickle") xgb_params = {'process_type':'update', 'updater':'refresh', 'refresh_leaf':True} model_new = xgb.train(xgb_params, data, xgb_model="./model.dump") # 报错