当我腌制一些腌制对象时,我正在使用xgboost版本0.6。 现在,我升级到了0.82版,当我尝试释放旧模型时,我得到了:
AttributeError:“ XGBClassifier”对象没有属性“ kwargs”
我真的很想在不重新训练它们的情况下使用这些模型,有什么方法可以打开这些泡菜吗?
答案 0 :(得分:1)
新的xgboost要求对象将具有“ kwargs”属性,而旧模型则没有。解决此问题的一种方法是降级到旧的xgboost版本,打开它们,将模型添加到每个模型中。kwargs= None,然后再次保存它们,它们现在应该可以工作了。
另一种解决方法是破解泡菜文件。您将泡菜作为字符串加载,添加所需的属性,然后加载泡菜:
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。 regex通过搜索模型中的已知属性“ colsample_bylevel”,找到对象属性的声明位置,然后在其前面添加另一个属性。
要查看pickle如何编码属性,可以创建具有某些属性的任何类,并将pkl.dumps应用于实例。如果这是一堂简短的课,那么它很容易阅读,这就是我得到的“ kwargs'\ np8 \ nNsS'”意思是“ kwargs = None”的原因。
为我工作!我确定这可以解决类似的腌菜向后兼容性问题,而不必使用此特定属性。