python - SklearnClassifier 对象没有属性 _vectorizer

标签 python scikit-learn nltk pickle

我买了一台新笔记本电脑并安装了最新版本的 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 转换为新格式吗?

谢谢

最佳答案

type of problem is a known issue使用 sklearn。在更新到最新版本的软件包后,我遇到了同样的一般问题,即对训练有素的 sklearn 模型进行去 pickle 。无论出于何种原因,版本之间通常没有足够的一致性,因此您可以可靠地从先前版本中去除经过训练的模型。当您最初对经过训练的分类器进行 pickle 时,它​​序列化了对本身未序列化的函数的调用。因此,当您 depickle 时,它​​会反序列化调用,但会调用该函数的新版本,该函数不再采用相同的参数或具有相同的属性(在您的情况下为 _vectorizer)。您有两个选择:(1) 使用新版本重新训练模型或 (2) 安装您使用的先前版本,而不是最新版本的 sklearn。

关于python - SklearnClassifier 对象没有属性 _vectorizer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26899025/

相关文章:

python - 我可以在 Django 中压缩 JavaScript 和 CSS 文件吗?

python - 循环遍历列表中的条目并创建新列表

python - 如何使用 NLTK snowball 词干提取器来提取西类牙语单词列表 Python

python - 按顺序执行函数

python - 从 python 打开 .dot 格式的图形

python - 在哪里设置 n_job : estimator or GridSearchCV?

Python KNeighbors 分类器

python - 访问随机森林模型中单个树的底层 (tree_) 对象(Python、scikit-learn)

python - 使用 spacy 和 Matcher 提取 NER 主语 + 动词的问题

python - 没有名为 'nltk' 的模块