【问题标题】:opening old xgboost pickles with the new xgboost version 'XGBClassifier' object has no attribute 'kwargs'使用新的 xgboost 版本“XGBClassifier”对象打开旧的 xgboost 泡菜没有属性“kwargs”
【发布时间】:2019-06-25 13:43:14
【问题描述】:

当我腌制一些泡菜对象时,我使用的是 xgboost 0.6 版。 现在我升级到了 0.82 版本,当我试图解开旧模型时,我得到了:

AttributeError: 'XGBClassifier' 对象没有属性 'kwargs'

我真的很想使用这些模型而无需重新训练它们,有什么方法可以打开这些泡菜吗?

【问题讨论】:

    标签: pickle xgboost backwards-compatibility


    【解决方案1】:

    新的 xgboost 要求对象具有“kwargs”属性,而旧模型没有。解决此问题的一种方法是降级到旧的 xgboost 版本,打开它们,将 model.kwargs=None 添加到每个模型,然后再次保存它们,它们现在应该可以工作了...

    另一种解决方法是破解 pickle 文件。您将把泡菜作为字符串加载,添加所需的属性,然后加载泡菜:

    import re
    xg_str = open('path_to_old_model.pkl').read()
    kwargs_value= "kwargs'\np8\nNsS'"
    new_xgboost = re.sub('colsample_bylevel', kwargs_value+"""colsample_bylevel""", xg_str)
    new_model = pkl.loads(new_xgboost)
    

    这会将“None”添加为模型的 self.kwargs。正则表达式通过在模型中搜索已知属性“colsample_bylevel”来查找声明对象属性的位置,然后在其前面添加另一个属性。

    要查看 pickle 如何对属性进行编码,您可以创建具有某些属性的任何类并将 pkl.dumps 应用于实例。如果这是一个简短的课程,它会很容易阅读,这就是我得到“kwargs'\np8\nNsS'”意味着“kwargs=None”的原因。

    为我工作!我确信这可以帮助解决与泡菜类似的向后兼容性问题,而不是使用此特定属性。

    【讨论】:

      猜你喜欢
      • 2019-06-15
      • 2021-07-23
      • 2016-07-04
      • 2016-04-13
      • 2023-03-22
      • 2019-03-20
      • 2019-11-06
      • 2022-10-18
      • 1970-01-01
      相关资源
      最近更新 更多