【问题标题】:python pickle not consistentpython泡菜不一致
【发布时间】:2016-12-14 13:56:41
【问题描述】:

我在 Ubuntu 上使用 python3.5。我通过 xgboost sklearn wrapper 训练了一个模型,并通过 pickle 保存它。

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

问题是每次加载,结果都不一样。

例如:

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

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

print(a == b)

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

谁能解释一下?有没有办法解决这个问题?

非常感谢!

【问题讨论】:

  • 我不熟悉xgboost,但是ab的类是什么?它的__eq__ 方法有什么作用?如果没有定义__eq__,则默认为a is b,在您的情况下显然是False
  • 你能在每次通话后print aprint b 显示输出吗?

标签: python python-2.7 python-3.x pickle xgboost


【解决方案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

我希望在安装 sklearn 的情况下,基类 XGBModelBase 上的 __eq__ 的行为是一致的。

另请注意,__eq__ 并未在模型类中被覆盖,因此您的行为符合预期。

您可以尝试比较未腌制模型的字典,看看是否适合您:a.__dict__ == b.__dict__

【讨论】:

  • 感谢您的回答! @Moses,很抱歉不知道一个对象的两个实例不相等。我真正关心的是,每次我通过 pickle 加载模型并在同一个验证集上进行预测时,我都会得到不同的结果。但是,加载模型后,无论运行多少次预测,都会得到相同的结果。所以我猜模型中是否有一些不可取的东西?由于xgboost模型是一堆参数,比较复杂,可能会包含一些unpicklable的东西,导致每次加载时的差异。有什么办法
【解决方案2】:

终于找到了问题所在,和pickle无关。还有其他一些因素会导致每次运行时出现一些随机化。

感谢您的帮助!打扰了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-09
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多