首页 > 解决方案 > XGBoost 对于 pickle/joblib 来说太大了

问题描述

我在使用 pickle 和 joblib 加载 XGBoost 回归时遇到了困难。

一个困难可能是我在 Windows 桌面上编写 pickle/joblib,但我试图在 Macbook Pro 上加载

我尝试使用之前发布的这个解决方案:Python 3 - Can pickle handle byte objects大于 4GB?

但是,它仍然不起作用。我会得到各种各样的错误,但通常是这样的:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 22] Invalid argument

还尝试在 pickle 和 joblib 转储中使用协议 = 4,并且在每种情况下,文件仍然无法加载。

根据 joblib/pickle 或使用之前发布的 bytes_in/os.path 解决方案,尝试加载的文件从 2gb 到 11gb 不等

有谁知道编写大型 XGBoost 回归的最佳方法的解决方案,和/或如何加载它们?

这是用于编写 XGBoost 的代码

dmatrix_train = xgb.DMatrix(
    X_train.values, y_train, feature_names=X_train.columns.values
)
dmatrix_validate = xgb.DMatrix(
    X_test.values, y_test, feature_names=X_train.columns.values
)
eval_set = [(dmatrix_train,"Train")]
eval_set.append((dmatrix_validate,"Validate"))

print("XGBoost #1")

params = {
    'silent': 1,

    'tree_method': 'auto',
    'max_depth': 10,
    'learning_rate': 0.001,
    'subsample': 0.1,
    'colsample_bytree': 0.3,
    # 'min_split_loss': 10,
    'min_child_weight': 10,
#     'lambda': 10,
#     'max_delta_step': 3
}

num_round = 500000

xgb_model = xgb.train(params=params, dtrain=dmatrix_train,evals=eval_set,
    num_boost_round=num_round, verbose_eval=100)

joblib.dump(xgb_model, 'file.sav', protocol=4)

最后一行也尝试了标准泡菜倾倒,有'wb'和没有'wb'。

标签: pythonpicklexgboostjoblib

解决方案


您似乎正在使用低级 XGBoost API(而不是高级 Scikit-Learn 包装器 API)。Booster.save_model(fname)在这个级别,您可以使用和Booster.load_model(fname)函数本地保存/加载 XGBoost 模型。

例如,请参阅此 SO 线程:如何保存和加载 xgboost 模型?

如果涉及到重要的“Python 包装器对象”,那么酸洗是有意义的。这里没有。


推荐阅读