从booster对象获取分类器对象的XGBoost方法?

5
我通常使用特征重要性来进行分析。
regr = XGBClassifier()
regr.fit(X, y)
regr.feature_importances_

regr

的类型是什么?

然而,我有一个pickled mXGBoost模型,解压后返回一个类型为<xgboost.core.Booster>的对象。这与运行regr.get_booster()返回的对象相同。

我已经找到了一些从booster对象获取变量重要性的解决方案,但是否有办法从booster对象中获取分类器对象,以便我可以直接应用相同的feature_importances_命令?这似乎是最简单的解决方案,否则我就必须编写一个函数来模拟feature_importances_的输出,以使其适合我的记录的特征重要性...

因此,理想情况下,我希望有类似于以下代码:

xbg_booster = pickle.load(open("xgboost-model", "rb"))
assert str(type(xgb_booster)) == "<class 'xgboost.core.Booster'>", 'wrong class'
xgb_classifier = xgb_booster.get_classifier()
xgb_classifier.feature_importances_

“booster object”在寻找分类器方面是否有任何限制?我认为有一些保存/加载/转储的组合可以帮助我获得所需的结果,但现在我卡住了...此外,为了提供背景,这个被pickle的模型是来自AWS Sagemaker的输出,所以我只是解包它来进行进一步的评估。
2个回答

3

根据我尝试用SageMaker生成的booster对象重新创建分类器的经验,我得出了以下结论:

  1. 似乎无法从booster中重新创建分类器。 :(
  2. https://xgboost.readthedocs.io/en/latest/python/python_api.html#xgboost.Booster 详细介绍了booster类,因此您可以查看其功能。

然而,以下方法有一些奇特之处:

  1. 您可以创建分类器对象,然后重写其中的booster:

    xgb_classifier = xgb.XGBClassifier(**xgboost_params)

    [..]

    xgb_classifier._Boster = booster

除非适配,否则这几乎没有用处,因为它没有任何特征数据。(我没有完全验证过这种情况,以确定适配是否提供所需的特征数据才能实现功能。)

  1. 您可以从分类器中删除booster对象,然后直接使用xgboost对分类器进行pickle处理。然后稍后将SageMaker booster恢复到其中。这种方法更接近,似乎有效,但不是仅通过SageMaker输出重新获得分类器对象。

建议

如果您不一定要使用SageMaker培训解决方案,则可以直接使用XGBoost进行培训。此时,您可以访问需要转储/保存数据的所有内容,以在不同上下文中使用。

我知道您正在寻找特征重要性,因此希望这可以让您更接近目标,而我有一个不同的用例,最终能够利用booster得到所需的结果。


1
很奇怪,我能够通过xgb_classifier = xgb.XGBClassifier()获取特征重要性 --> xgb_classifier._Boster = booster --> xgb_classifier.feature_importances - L Xandor
@LXandor 小笔误:_Boster 应该是 _Booster - Carlos Martinez

0

我成功地通过以下步骤获得了几乎相同的xgboost.XGBClassifier模型和xgboost.Booster版本模型:

(1)使用以下代码从booster模型中提取所有调整参数: import json json.loads(your_booster_model.save_config())

(2)使用相同的调整参数并训练一个XGBClassifier模型,使用与训练Booster模型相同的训练数据集。

注意:我犯了一个错误,忘记在Booster和Classifier版本中明确分配相同的种子/random_state。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接