我买了一台新笔记本电脑,安装了最新版本的NLTK和SciKit-Learn。我正在使用一个旧脚本进行情绪分析,该脚本加载了我今年早些时候创建的旧泡菜,并收到了以下错误。似乎NLTK的SciKitClassifier包装器现在具有以前没有的属性_vectorizer。
File "c:usersyopradopycharmprojectsgnip_sentimentgnip_sentimentmain.py", line 64, in mongoaddsentiment
MongoSentiment(mongo_server, mongo_port, dbname, colname, pickle_file)
File "c:usersyopradopycharmprojectsgnip_sentimentgnip_sentimentMongoSentiment.py", line 61, in MongoSentiment
senti = classifier_eng.classify(get_features(cleanedBody.split()))
File "C:Python27libsite-packagesnltk-3.0.0-py2.7-win32.eggnltkclassifyapi.py", line 54, in classify
return self.classify_many([featureset])[0]
File "C:Python27libsite-packagesnltk-3.0.0-py2.7-win32.eggnltkclassifyscikitlearn.py", line 84, in classify_many
X = self._vectorizer.transform(featuresets)
AttributeError: 'SklearnClassifier' object has no attribute '_vectorizer'
我使用了之前创建分类器泡菜的相同脚本,新的泡菜似乎工作得很好。代码中的某些内容似乎已通过最近的更新进行了修改。有没有办法将当前的泡菜转换为新格式?
谢谢
问题是sklearn
的已知问题。在更新到最新版本的软件包后,我在腌制训练的 sklearn 模型时遇到了同样的一般问题。无论出于何种原因,版本之间通常没有足够的一致性,因此您可以可靠地从先前版本中解脱训练的模型。当你最初挑选训练的分类器时,它会序列化对本身未序列化的函数的调用。 因此,当您 depickle 时,它会反序列化调用,但调用该函数的新版本,该版本不再采用相同的参数或具有相同的属性(在您的情况下_vectorizer
)。您有两种选择:(1) 使用新版本重新训练模型,或 (2) 安装您正在使用的先前版本,而不是最新版本的 sklearn。
如果要使用 dill
而不是 pickle
来序列化sklearn
模型,那么即使版本更改,也应该能够恢复分类器。 如果使用 pickle
,类实例的序列化仅保存一些相关状态,但随后引用类定义...因此,如果定义发生变化,那么您就不走运了老泡菜。 默认情况下,dill
将类定义与类实例一起腌制...因此,即使类定义发生更改,您也可以取消保存的实例 - 并希望从旧类实例中提取所需的内容。 例如,您可以将状态从旧分类器对象转移到新的分类器对象,并使用闪亮的新对象继续生活。 唯一需要注意的是,您必须提前计划并首先使用dill
进行序列化 - 如果您不这样做,那么您就不走运了。