2016-12-14 5 views
-1

Я использую python3.5 на Ubuntu. Я подготовил модель с помощью обложки xgboost sklearn и сохранил ее на мариновании.python pickle не соответствует

Вот ссылка файла маринад: 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 is b', что, очевидно, является «ложным» в вашем случае. – Holloway

+0

Можете ли вы напечатать a 'и' print 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 

Я ожидаю, что поведение __eq__ в базовом классе XGBModelBase будет последовательным в случае, если установлен sklearn.

Также обратите внимание, что в классе модели не было переопределено __eq__, поэтому поведение у вас как ожидается.

Вы можете попробовать сравнение словарей unpickled моделей и посмотреть, если это работает для вас: a.__dict__ == b.__dict__

+0

Спасибо за ответы! @Moses, извините, не зная, что два экземпляра объекта не равны. Я действительно забочусь о том, что каждый раз, когда я загружаю модель путем разборки и прогнозирования на одном и том же наборе валидации, я получаю разные результаты. Однако после загрузки модели, независимо от того, сколько раз выполняется предсказание, получается тот же результат. Итак, я думаю, если в модели есть что-то непривычное? Поскольку xgboost-модель представляет собой набор параметров, что довольно сложно, оно может содержать что-то непригодное, что вызывает разницу между каждым временем его загрузки. Там в любом случае – Ben

0

Наконец я нашел проблему, которая не имеет ничего общего с рассолом. Есть что-то еще, что приводит к некоторой рандомизации в каждом запуске.

Спасибо за помощь! Извините за беспокойство!

Ben