【发布时间】: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__方法注册到该类……或者您正在使用dill或cloudpickle,它为您提供了腌制任何给定对象的最佳机会。仅供参考,sklearn使用joblib,它使用cloudpickle和/或dill。 -
添加了完整的回溯。我确实认为这是 Pickle 版本的错误。不幸的是,我不知道如何在 Pythonanywhere 上更改事物的版本。感谢您迄今为止的帮助。
标签: python flask scikit-learn cython pickle