我买了一台新的笔记本电脑,安装了最新版本的NLTK和SciKit-Learn。我使用一个旧脚本进行情感分析,加载了我今年早些时候创建的一个旧泡菜,我收到了下面的错误。似乎来自NLTK的SciKitClassifier包装器现在具有属性_vectorizer,而它以前没有属性。
File "c:\users\yoprado\pycharmprojects\gnip_sentiment\gnip_sentiment\main.py", line 64, in mongoaddsentiment
MongoSentiment(mongo_server, mongo_port, dbname, colname, pickle_file)
File "c:\users\yoprado\pycharmprojects\gnip_sentiment\gnip_sentiment\MongoSentiment.py", line 61, in MongoSentiment
senti = classifier_eng.classify(get_features(cleanedBody.split()))
File "C:\Python27\lib\site-packages\nltk-3.0.0-py2.7-win32.egg\nltk\classify\api.py", line 54, in classify
return self.classify_many([featureset])[0]
File "C:\Python27\lib\site-packages\nltk-3.0.0-py2.7-win32.egg\nltk\classify\scikitlearn.py", line 84, in classify_many
X = self._vectorizer.transform(featuresets)
AttributeError: 'SklearnClassifier' object has no attribute '_vectorizer'我使用了以前创建分类器泡菜的相同脚本,而新的泡菜似乎工作得很好。代码中的某些内容似乎是通过最近的更新而修改的。有没有办法将当前的泡菜转换成新的格式?
谢谢
发布于 2014-11-13 00:31:02
这个问题的类型是已知的问题。和sklearn。我也有同样的一般问题,脱毛训练的滑雪板模型后,更新到最新版本的软件包。无论出于什么原因,版本之间往往没有足够的一致性,因此您可以可靠地从以前的版本中脱毛一个经过训练的模型。当您最初对经过训练的分类器进行腌制时,它序列化了对遮罩下的函数的调用,该函数本身没有序列化。因此,当您脱毛时,它反序列化调用,但是调用该函数的新版本,该函数不再接受相同的参数,也不再具有相同的属性(在您的例子中是_vectorizer)。您有两个选项:(1)用新版本重新培训模型,或者(2)安装您使用的早期版本,而不是最新版本的sklearn。
发布于 2014-11-15 18:41:06
如果您要使用dill而不是pickle来序列化sklearn模型,那么即使有版本更改,您也应该能够恢复分类器。如果使用pickle,类实例的序列化只保存一些相关的状态,然后引用类定义…。所以,如果定义改变了,你对老泡菜就不走运了。默认情况下,dill与类实例…一起对类定义进行筛选。因此,即使类定义发生变化,也可以解锁保存的实例--并希望从旧的类实例中提取所需的内容。例如,您可以将状态从旧的分类器对象转换为新的分类器对象,然后使用一个闪亮的新对象继续生活。唯一的警告是,您必须提前计划,首先使用dill进行序列化--如果不这样做,您就倒霉了。
https://stackoverflow.com/questions/26899025
复制相似问题