SklearnClassifier对象没有属性\u vectoriz

2024-05-21 08:25:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我买了一台新的笔记本电脑,安装了最新版本的NLTK和SciKit Learn。我正在使用一个旧脚本进行情绪分析,加载了我今年早些时候创建的一个旧pickle,我收到了下面的错误。看来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似乎可以正常工作。代码中的某些内容似乎通过最近的更新进行了修改。有没有办法把当前的pickle转换成新的格式?在

谢谢你


Tags: inpy脚本lineuserspicklefilesentiment
2条回答

type of problem is a known issue与{}一起使用。在更新到最新版本的软件包后,我也遇到了同样的问题:depickling培训过的sklearn模型。无论出于什么原因,版本之间往往没有足够的一致性,因此您可以可靠地将经过训练的模型从以前的版本中分离出来。当您最初对训练过的分类器进行pickle时,它将对自身未序列化的函数的调用序列化。因此,当您depickle时,它会反序列化调用,但会调用该函数的新版本,该版本不再使用相同的参数或具有相同的属性(在您的例子中是_vectorizer)。您有两个选择:(1)使用新版本重新培训模型,或者(2)安装您使用的以前版本,而不是最新版本的sklearn。在

如果要使用dill而不是pickle来序列化sklearn模型,那么即使有版本更改,也应该能够恢复分类器。如果使用pickle,类实例的序列化只会保存一些相关的状态,但随后会引用类定义…因此,如果定义发生更改,则您将失去旧pickle的运气。默认情况下,dill将类定义与类实例一起pickle…因此,即使类定义发生更改,也可以取消对保存的实例的拾取,并希望从旧类实例中提取所需的内容。例如,您可以将状态从旧分类器对象转移到新分类器对象,然后使用一个闪亮的新对象继续生活。唯一需要注意的是,您必须提前计划并在第一时间使用dill进行序列化如果不这样做,您就走运了。在

相关问题 更多 >