在 64 位 python 上训练的 Scikit-Learn 随机森林不会在 32 位 python 上打开

Posted

技术标签:

【中文标题】在 64 位 python 上训练的 Scikit-Learn 随机森林不会在 32 位 python 上打开【英文标题】:Scikits-Learn RandomForrest trained on 64bit python wont open on 32bit python 【发布时间】:2014-01-28 18:15:02 【问题描述】:

我在 64 位 python 上训练了一个 RandomForestRegressor 模型。 我腌制物体。 尝试在 32 位 python 上解开对象时,出现以下错误:

'ValueError: 缓冲区 dtype 不匹配,预期为 'SIZE_t' 但得到了 'long long''

我真的不知道如何解决这个问题,所以任何帮助将不胜感激。

编辑:更多细节

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "c:\python27\lib\pickle.py", line 1378, in load
    return Unpickler(file).load()
  File "c:\python27\lib\pickle.py", line 858, in load
    dispatch[key](self)
  File "c:\python27\lib\pickle.py", line 1133, in load_reduce
    value = func(*args)
  File "_tree.pyx", line 1282, in sklearn.tree._tree.Tree.__cinit__ (sklearn\tre
e\_tree.c:10389)

【问题讨论】:

我不确定这是否应该被认为是 cython Tree 类的错误,它在 unpickling 时的容忍度不够,是缓冲区 dtype 的错误选择,还是 pickling sklearn 模型的基本限制。 这方面有进展吗?我现在发现了同样的问题。 到 2017 年 11 月,我遇到了完全相同的问题。 sklearn.__version__:'0.19.1' 【参考方案1】:

这是因为随机森林代码在 32 位和 64 位机器上使用不同类型的索引。不幸的是,这只能通过彻底检查随机森林代码来解决。由于有几个 scikit-learn 开发人员是working on that,所以我把它放在了待办事项列表中。

目前,训练机和测试机需要具有相同的指针大小。

【讨论】:

@larsmans larsmans,你介意一个关于字长独立 .dump() / .load() 方法的当前状态的问题在scikit-learn?无论如何,您是否听说过/同时遇到过任何workaround(通过marshall 或其他方式)?如果你发现分享这些额外的知识很有用,我会很高兴,拉尔斯曼。谢谢。 顺便说一句,pull_2732(上面提到)提到了关于“大树”的memalloc 问题的辩论。是的,这些很重要。将pickle.dump()-ed 野兽从超过 3.2GB 的大型磁盘表示移回 RAM 后,保持低调非常重要。希望听到您团队的新消息(自 2014 年 1 月以来,S/O 上没有太多活动)。 敬请期待。你做得很好! 这个特定问题现在有解决方案吗?目前面临同样的麻烦 @FredFoo,有什么解决办法吗? 每年检查一次...有解决办法吗?【参考方案2】:

为方便起见,请使用 python 64 位版本来分散您的模型。我最近遇到了同样的问题。采取这一步后,问题就解决了。

所以尝试在 64 位版本上运行它。我希望这会有所帮助

【讨论】:

【参考方案3】:

我通过在同一台机器上训练模型解决了这个问题。我在 Jupyter Notebook(Windows PC)上训练模型并尝试加载到 Raspberry Pi 中,但我得到了错误。因此,我在树莓派中训练模型并再次维护,然后解决了问题。

【讨论】:

【参考方案4】:

我在系统上安装了 python 3.7.0 32bit 训练模型时遇到了同样的问题。安装python 3.8.10 64bit版本,再次训练模型后解决。

【讨论】:

以上是关于在 64 位 python 上训练的 Scikit-Learn 随机森林不会在 32 位 python 上打开的主要内容,如果未能解决你的问题,请参考以下文章

Python 中用 XGBoost 和 scikit-learn 进行随机梯度增强

理解 scikit 学习预测的随机森林内存需求

Python scikit-learn:导出经过训练的分类器

python机器学习——使用scikit-learn训练感知机模型

在 scikit learn 中训练具有不同特征维度的逻辑回归模型

在 Python Scikit-Learn 中训练测试拆分得分高但 CV 得分低