【问题标题】:How to load Python 3 Pickled SKlearn Model in Python 2如何在 Python 2 中加载 Python 3 Pickled SKlearn 模型
【发布时间】:2018-04-11 20:56:03
【问题描述】:

我有一个 Python 3.6 脚本,用于训练 SKLearn 模型,然后使用以下代码保存模型:

with open('filepath', 'wb') as f:
    pickle.dump(trained_model, f, protocol=2)

当我尝试在 python 3.6 中加载泡菜时,一切正常:

>>with open('filepath', 'rb') as f:
>>    model = pickle.load(f)
>>
>>model

RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',
        max_depth=None, max_features='auto', max_leaf_nodes=None,
        min_impurity_decrease=0.0, min_impurity_split=None,
        min_samples_leaf=1, min_samples_split=2,
        min_weight_fraction_leaf=0.0, n_estimators=80, n_jobs=1,
        oob_score=False, random_state=None, verbose=0,
        warm_start=False)

当我在 Python 2.7 中运行相同的 pickle.load 命令时,我收到以下错误:

>>with open('filepath', 'rb') as f:
>>    model = pickle.load(f)

ValueError: non-string names in Numpy dtype unpickling

查看文档和类似案例,将协议设置为 2应该使 pickle 文件兼容。是什么导致了这个问题,我该如何解决?

【问题讨论】:

  • 这是完整的回溯吗?
  • 不幸的是。
  • 此时我不能再说什么,因为您没有提供任何 minimal reproducible example 供我诊断。
  • 查看更新,这可能对您有很大帮助。

标签: python python-2.7 scikit-learn pickle python-3.6


【解决方案1】:

您可以使用pickle._load() 代替.load()force using a pure-Python implementation 并获得更有用的回溯。

如果错误部分在 numpy 的代码中,您仍然需要使用 C 调试器或手动跟踪源代码...
...或使用 @987654323 @ 在输入到 numpy 的 unpickling 例程的部分上,并尝试猜测它有什么问题!

  • pickletools.dis() 为你做这件事!它会打印出包含偏移量的 pickle 数据的反汇编。尽管您可能仍需要规范来找出违规的性质。

也就是说,3.4. Model persistence — scikit-learn 0.19.1 documentation 确实警告说不支持在另一个版本和/或架构中加载模型数据,并建议改为保存源材料。

【讨论】:

  • 指向 _load() 的链接和“强制使用纯 python..”似乎指向了错误的行。应该使用永久链接
猜你喜欢
  • 2020-05-31
  • 2015-07-21
  • 1970-01-01
  • 2014-07-29
  • 2017-09-21
  • 2021-09-12
  • 2018-10-21
  • 2023-03-03
  • 2020-05-09
相关资源
最近更新 更多