Python pickle.PicklingError:Can';t pickle<;0x109217488处的函数预处理器>;:它';找不到作为主预处理器的
我需要存储一个使用sklearn开发的机器学习分类器。我正在为此使用joblib包。我是这样做的:Python pickle.PicklingError:Can';t pickle<;0x109217488处的函数预处理器>;:它';找不到作为主预处理器的,python,scikit-learn,pickle,Python,Scikit Learn,Pickle,我需要存储一个使用sklearn开发的机器学习分类器。我正在为此使用joblib包。我是这样做的: from sklearn.externals improt joblib #clf is defined above joblib.dump(clf,'test.clf') 我有以下错误: Traceback (most recent call last): File "svm_clf.py", line 333, in <module> my_svm_classifier
from sklearn.externals improt joblib
#clf is defined above
joblib.dump(clf,'test.clf')
我有以下错误:
Traceback (most recent call last):
File "svm_clf.py", line 333, in <module>
my_svm_classifier(get_best_model(), X, y, name="svm pos vs neg", plot=True)
File "svm_clf.py", line 300, in my_svm_classifier
joblib.dump(clf, 'neg.clf')
File "//anaconda/lib/python2.7/site-packages/sklearn/externals/joblib/numpy_pickle.py", line 369, in dump pickler.dump(value)
...
...
...
pickle.PicklingError: Can't pickle <function preprocessor at 0x108301488>: it's not found as \__main\__.preprocessor
回溯(最近一次呼叫最后一次):
文件“svm_clf.py”,第333行,在
my_svm_分类器(获取最佳_模型(),X,y,name=“svm pos vs neg”,plot=True)
文件“svm_clf.py”,第300行,在my_svm_分类器中
joblib.dump(clf,'neg.clf')
文件“//anaconda/lib/python2.7/site packages/sklearn/externals/joblib/numpy_pickle.py”,第369行,在dump pickler.dump(value)中
...
...
...
pickle.PicklingError:无法pickle:找不到它作为\\uuu main \\uuuu.preprocessor
有什么帮助吗?你有没有碰巧将名为
预处理器的函数定义为本地函数?有,亲爱的。这是一种帮助。它是在一个函数中定义的,基本上是一个子函数。为了避免成为子函数,我将其上移了一步,似乎工作得很好。谢谢。嗯,事实上那没用。我有两个错误:(1)pickle.PicklingError:无法pickle:它与\\u main\ u.preprocessor不是同一个对象。当我将“预处理器”设置为子函数时,会出现此错误。当我将此函数设置为全局函数时,在加载模块时出现以下错误:AttributeError:“module”对象没有属性“preprocessor”\uuuuuu main\uuuu
在通过引用进行pickle时不被视为一级模块…因此,如果函数位于main中,pickle按名称引用函数,然后您将得到一个PicklingError
。您应该尝试使用更好的序列化程序dill
或cloudpickle
,并像对待一等公民一样对待\uuuuu main\uuuuu
。如果您在github上使用dill
主机,只需说import-dill
,它将覆盖pickle
中的正常酸洗行为dill
和cloudpickle
还可以(通常)pickle函数所依赖的所有对象,并将它们与pickle一起使用(通过源代码或引用)。或者您可以将函数移动到单独的文件中;)您是否有可能将名为预处理器的函数定义为本地函数?是的,亲爱的。这是一种帮助。它是在一个函数中定义的,基本上是一个子函数。为了避免成为子函数,我将其上移了一步,似乎工作得很好。谢谢。嗯,事实上那没用。我有两个错误:(1)pickle.PicklingError:无法pickle:它与\\u main\ u.preprocessor不是同一个对象。当我将“预处理器”设置为子函数时,会出现此错误。当我将此函数设置为全局函数时,在加载模块时出现以下错误:AttributeError:“module”对象没有属性“preprocessor”\uuuuuu main\uuuu
在通过引用进行pickle时不被视为一级模块…因此,如果函数位于main中,pickle按名称引用函数,然后您将得到一个PicklingError
。您应该尝试使用更好的序列化程序dill
或cloudpickle
,并像对待一等公民一样对待\uuuuu main\uuuuu
。如果您在github上使用dill
主机,只需说import-dill
,它将覆盖pickle
中的正常酸洗行为dill
和cloudpickle
还可以(通常)pickle函数所依赖的所有对象,并将它们与pickle一起使用(通过源代码或引用)。或者您可以将函数移动到单独的文件中;)您是否有可能将名为预处理器的函数定义为本地函数?是的,亲爱的。这是一种帮助。它是在一个函数中定义的,基本上是一个子函数。为了避免成为子函数,我将其上移了一步,似乎工作得很好。谢谢。嗯,事实上那没用。我有两个错误:(1)pickle.PicklingError:无法pickle:它与\\u main\ u.preprocessor不是同一个对象。当我将“预处理器”设置为子函数时,会出现此错误。当我将此函数设置为全局函数时,在加载模块时出现以下错误:AttributeError:“module”对象没有属性“preprocessor”\uuuuuu main\uuuu
在通过引用进行pickle时不被视为一级模块…因此,如果函数位于main中,pickle按名称引用函数,然后您将得到一个PicklingError
。您应该尝试使用更好的序列化程序dill
或cloudpickle
,并像对待一等公民一样对待\uuuuu main\uuuuu
。如果您在github上使用dill
主机,只需说import-dill
,它将覆盖pickle
中的正常酸洗行为dill
和cloudpickle
还可以(通常)pickle函数所依赖的所有对象,并将它们与pickle一起使用(通过源代码或引用)。或者您可以将函数移动到单独的文件中;)