2016-12-14 67 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

最後我發現這個問題,這是無關的鹹菜。還有其他的東西在每次運行中都會導致一些隨機化。

感謝您的幫助!很抱歉打擾!