2016-12-14 4 views
-1

私はUbuntuでpython3.5を使用しています。私は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'になります。これは明らかに 'False'です。 – Holloway

+0

各呼び出しの後に 'print a'と' print b'を出力して出力を表示できますか? –

答えて

1

sklearnがインストールされていない場合は、XGBoostModelの基底クラスがobjectと同じです:

XGBModelBase = object

そして、あなたはおそらくすでにobjectの2つのインスタンスが等しくないことを知っている:

>>> 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__はモデルクラスでオーバーライドされていないことに注意してください。

あなたがunpickle化モデルの辞書を比較してみてください、それはあなたのために働くかどうかを見ることがあります。a.__dict__ == b.__dict__

+0

あなたの答えをありがとう! @モーゼス、オブジェクトの2つのインスタンスが等しくないことを知らないのは残念です。私が本当に気にしているのは、モデルをpickleでロードして同じバリデーションセットを予測するたびに、私は異なる結果になるということです。しかし、モデルをロードした後、予測を何回実行しても、同じ結果が得られます。だから私は、モデルにunpicklable何かがあると思いますか? xgboostモデルは非常に複雑なパラメータの束であるため、読み込み不能なものが含まれている可能性があり、読み込みのたびに違いが生じます。何か方法はありますか? – Ben

0

最後に、私はピクルスとは何の関係もありませんこれは、問題を発見しました。それぞれのランニングで何らかのランダム化を引き起こす何かがあります。

ありがとうございました!おじゃまします!

ベン

関連する問題