含类别特征的已训练CatBoost模型为何需传入训练Pool?
CatBoost类别变量相关方法的设计疑问
在CatBoost的部分方法中,存在和类别变量相关的特殊要求:
- 当模型包含独热编码的类别变量时,
plot_tree(tree_idx, pool=None)的可选参数pool会变为必填项 save_model的参数说明提到:如果不传入Pool,模型可以保存为JSON格式,但后续无法正常使用
针对这些设计,存在以下疑问:
- 训练完成后,为什么必须携带庞大的原始训练数据?
- 仅绘制单棵分类树的场景下,为什么需要依赖全量训练数据?
- 通过实验发现,只需要构造一个包含所有类别变量唯一取值的"假数据集",就能让
plot_tree正常运行(实验代码如下)。那CatBoost为什么不把类别变量的唯一取值随模型一起保存,反而要求用户保留全量训练数据?
实验代码
onehotvalues = {'a':np.arange(154), 'b':[1,2,3]} allfeatures = ['winCount'] + Xfeatures maxlen = max([len(v) for v in onehotvalues.values()]) train = pd.DataFrame(np.zeros([maxlen, len(allfeatures)]), columns=allfeatures) for k, v in onehotvalues.items(): train.loc[:len(v)-1, k] = v train = train.astype({k:int for k in onehotvalues.keys()}) train_pool = cb.Pool(train[Xfeatures], label=train.winCount, cat_features=list(onehotvalues.keys())) model.plot_tree(20, train_pool)
内容的提问来源于stack exchange,提问作者Arif Zaman
相关产品推荐
相关产品推荐

