我买了一台新笔记本电脑并安装了最新版本的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'
我使用了之前创建分类器pickle的相同脚本,新的pickle似乎工作得很好。似乎代码中的某些内容通过最近的更新进行了修改。有没有办法将当前的泡菜转换成新的格式?
谢谢
答案 0 :(得分:3)
此type of problem is a known issue与sklearn
。在更新到最新版本的软件包之后,我遇到了同样的一般问题。无论出于何种原因,版本之间通常没有足够的一致性,因此您可以从先前版本中可靠地去除训练模型。当你最初腌制训练有素的分类器时,它序列化了一个本身未被序列化的引擎下的函数调用。因此,当你去除它时,它会反序列化调用,但会调用该函数的新版本,该函数不再使用相同的参数或具有相同的属性(在您的情况下为_vectorizer
)。您有两种选择:(1)使用新版本重新训练模型或(2)安装您使用的先前版本而不是最新版本的sklearn。
答案 1 :(得分:1)
如果您使用dill
代替pickle
来序列化sklearn
模型,那么即使版本发生了更改,您也应该能够恢复分类器。如果你使用pickle
,类实例的序列化只会保存一些相关的状态,但是然后引用类定义......所以如果定义发生了变化,那么对于旧的泡菜来说你运气不好。默认情况下,dill
将类定义与类实例一起腌制...因此即使类定义发生更改,您也可以取消删除已保存的实例 - 并希望从旧类实例中提取所需内容。例如,您可以将状态从旧的分类器对象转移到新的分类器对象,然后使用闪亮的新对象继续生活。唯一需要注意的是,你必须提前计划并首先使用dill
进行序列化 - 如果你不这样做,那你就不走运了。