【问题标题】:"TypeError: __cinit__() takes exactly 8 positional arguments (3 given)" when loading sklearn Pickle加载 sklearn Pickle 时,“TypeError:__cinit__() 正好采用 8 个位置参数(给定 3 个)”
【发布时间】:2016-01-02 19:10:45
【问题描述】:

我在 pythonanywhere (Python 2.7) 上有一个 Flask 应用程序,它需要加载一个包含使用 sklearn 制作的机器学习估计器的 pickle 文件。

    with open("pickle.pkl", 'rb') as f:
    d = pickle.load(f)

给我这个错误:

2016-01-06 01:20:15,469 :Exception on / [GET]
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1687, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1360, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1358, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1344, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/znagler/mysite/flask_app.py", line 29, in index
    d = pickle.load(f)
  File "/usr/lib/python2.7/pickle.py", line 1378, in load
    return Unpickler(file).load()
  File "/usr/lib/python2.7/pickle.py", line 858, in load
    dispatch[key](self)
  File "/usr/lib/python2.7/pickle.py", line 1133, in load_reduce
    value = func(*args)
  File "_tree.pyx", line 1282, in sklearn.tree._tree.Tree.__cinit__ (sklearn/tree/_tree.c:10342)
TypeError: __cinit__() takes exactly 8 positional arguments (3 given)positional arguments (3 given)

我尝试过使用 joblib 和其他版本的 Python,但我总是遇到一些错误,而这个错误是最接近成功的。如果有人曾经在 pickle 文件中制作过使用 sklearn 估算器的 Flask API,将不胜感激。

【问题讨论】:

  • pickle 中似乎有一个错误?可能是版本不兼容
  • 您是否在生成包含估算器的文件的机器和 PythonAnywhere 上使用相同版本的所有内容? (使用pip show查看)
  • 请发布完整的错误回溯!
  • 您需要发布您正在酸洗的对象。但是,从__cinit__ 看来,这是一个与cython 相关的类失败了……这是pickle 预期的,除非有一个__reduce__ 方法注册到该类……或者您正在使用dillcloudpickle,它为您提供了腌制任何给定对象的最佳机会。仅供参考,sklearn 使用 joblib,它使用 cloudpickle 和/或 dill
  • 添加了完整的回溯。我确实认为这是 Pickle 版本的错误。不幸的是,我不知道如何在 Pythonanywhere 上更改事物的版本。感谢您迄今为止的帮助。

标签: python flask scikit-learn cython pickle


【解决方案1】:

看起来您使用的是不同版本的 sklearn。即您用于制作模型的 sklearn 版本与安装在用于解压模型的机器上的版本不同。

我遇到了这个确切的问题:我的本地机器正在使用 sklearn 0.18 (dev) 训练和腌制随机森林;我有一个运行 sklearn 0.17 的 ec2 实例(我从未腌制的随机森林输出预测);

>

>> foo_predictor = pickle.load(open('rF_REVENUENext_version2.pkl', 'rb'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/pickle.py", line 1378, in load
    return Unpickler(file).load()
  File "/usr/lib/python2.7/pickle.py", line 858, in load
    dispatch[key](self)
  File "/usr/lib/python2.7/pickle.py", line 1133, in load_reduce
    value = func(*args)
  File "_tree.pyx", line 1282, in sklearn.tree._tree.Tree.__cinit__ (sklearn/tree/_tree.c:10342)
TypeError: __cinit__() takes exactly 8 positional arguments (3 given)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多