【发布时间】:2019-06-25 13:43:14
【问题描述】:
当我腌制一些泡菜对象时,我使用的是 xgboost 0.6 版。 现在我升级到了 0.82 版本,当我试图解开旧模型时,我得到了:
AttributeError: 'XGBClassifier' 对象没有属性 'kwargs'
我真的很想使用这些模型而无需重新训练它们,有什么方法可以打开这些泡菜吗?
【问题讨论】:
标签: pickle xgboost backwards-compatibility
当我腌制一些泡菜对象时,我使用的是 xgboost 0.6 版。 现在我升级到了 0.82 版本,当我试图解开旧模型时,我得到了:
AttributeError: 'XGBClassifier' 对象没有属性 'kwargs'
我真的很想使用这些模型而无需重新训练它们,有什么方法可以打开这些泡菜吗?
【问题讨论】:
标签: pickle xgboost backwards-compatibility
新的 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”的原因。
为我工作!我确信这可以帮助解决与泡菜类似的向后兼容性问题,而不是使用此特定属性。
【讨论】: