![](/img/trans.png)
[英]AttributeError: Can't get attribute 'DataFrameSelector' on <module '__main__'>
[英]AttributeError: Can't get attribute 'tokenizer' on <module '__main__'>
我在文本数据上训练了一个logistic regression
模型,并使用pickle
保存了模型。 但是为了进行测试,当我尝试加载模型时,我在执行以下行时遇到了标题中提到的错误:
model = pickle.load(open("sentiment.model", "rb"))
以下是用于保存模型的代码:
import pickle
print("[INFO] saving Model...")
f = open('sentiment.model', "wb")
# first I saved the best_estimator_
f.write(pickle.dumps(gs_lr_tfidf.best_estimator_))
# but again I saved the model completely without mentioning any attribute i.e:
# f.write(pickle.dumps(gs_lr_tfidf))
# but none of them helped and I got the same error
f.close()
print("[INFO] Model saved!")
当我在完成训练过程后(在同一运行时)将模型加载到同一笔记本中时,不会出现此错误。 但是,当我尝试在不同的运行时分别加载模型时,即使模型加载器代码相同,也会发生此错误。 为什么会这样?
我认为问题出在pickle的行为上,正如@hafiz031所说,在文件中运行相同的代码是正常的。 如此简短的回答是您需要在加载模型之前导入标记器(从您使用的任何库)
对于懂中文的人,你可以去这个CSDN 链接了解更多信息。
对于不懂中文的人,对不起我的英语不好,我会尽力解释。
文档说:
pickle.loads(data, /, *, fix_imports=True, encoding='ASCII', errors='strict', buffers=None)
返回对象的腌制表示数据的重构对象层次结构。 data必须是类似字节的对象。
如果您使用pickle.loads
,则有一个隐含的要求,必须在加载之前声明对象层次结构。 直觉上你可以想,当你把美元带到北极时,你想用美元换取企鹅钓鱼。 由于他们没有什么是金钱的概念,他们不会做交易。 和pickle一样,如果你之前没有导入tokenizer,在pickle将字节加载回tokenizer之后,他们不知道什么是'tokenizer'并返回错误给你。 这就是为什么您的代码在训练文件中工作但在将模型加载到不同文件中时失败的原因。
就我而言,我只是导入了一个额外的库。
# import your own lib
import pickle
import nltk.tokenizer
import genism
import sklearn
#...
model = pickle.load(open("sentiment.model", "rb"))
#model.predict()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.