2016-12-14 63 views
-1

我在Ubuntu上使用python3.5。我用xgboost sklearn wrapper训练了一个模型,并通过泡菜保存。蟒蛇酱不一致

这里是咸菜文件的链接: https://pan.baidu.com/s/1eSoPWxs

的问题是,我每次加载时间,其结果是不同的。

例如:

a = pickle.load(open('mymodel', 'rb')) 

b = pickle.load(open('mymodel', 'rb')) 

print(a == b) 

我得到的结果False,但我认为这应该是True

有人可以解释一下吗?有什么办法可以解决这个问题吗?

非常感谢!

+2

我不熟悉xgboost,但是'a'和'b'类是什么?它的'__eq__'方法有什么作用?如果没有定义'__eq__',它默认为'a是b',在你的情况下显然是'False'。 – Holloway

+0

你可以在每次调用后打印一个''和'打印b'并显示输出吗? –

回答

1

如果未安装sklearn,基类XGBoostModel的是一样的object

XGBModelBase = object

而且你可能已经知道,object两个实例不相等:

>>> import pickle 
>>> pickle.dump(object(), open('test.txt', 'wb')) 
>>> a = pickle.load(open('test.txt', 'rb')) 
>>> b = pickle.load(open('test.txt', 'rb')) 
>>> a == b 
False 

>>> object() == object() 
False 

我预计基类XGBModelBase__eq__的行为在安装sklearn的情况下是一致的。

另请注意,__eq__未在模型类中重写,因此您的行为与预期相同。

你可以试试比较拆封模型的字典,看看是否适合你:a.__dict__ == b.__dict__

+0

感谢您的回答! @Moses,抱歉不知道对象的两个实例是不相等的。我真正关心的是每次我通过pickle加载模型并预测相同的验证集时,我会得到不同的结果。但是,加载模型后,无论预测执行多少次,都会得到相同的结果。所以我猜如果模型中有些东西是不可取的?由于xgboost模型是一堆非常复杂的参数,它可能包含一些不可取的东西,这会导致每次加载时的差异。有什么办法吗? – Ben

0

最后我发现这个问题,这是无关的咸菜。还有其他的东西在每次运行中都会导致一些随机化。

感谢您的帮助!很抱歉打扰!