如何高效地序列化scikit-learn分类器

7

如何最有效地序列化scikit-learn分类器?

我目前正在使用Python的标准Pickle模块来序列化文本分类器,但这会导致一个非常大的pickle文件。序列化对象可以达到100MB或更多,这似乎过于浪费时间和存储空间。我之前用Weka做了类似的工作,相应的序列化分类器通常只有几MB。

scikit-learn是否可能在pickle中缓存训练数据或其他无关信息?如果是,如何加速和减小序列化scikit-learn分类器的大小?

classifier = Pipeline([
    ('vectorizer', CountVectorizer(ngram_range=(1,4))),
    ('tfidf', TfidfTransformer()),
    ('clf', OneVsRestClassifier(LinearSVC())),
])

你在cPickle中使用了协议-1吗?这通常会产生神秘的差异。 - Andreas Mueller
2个回答

5
对于大型文本数据集,请使用哈希技巧:将 TfidfVectorizer 替换为 HashingVectorizer(可能与管道中的 TfidfTransformer 堆叠在一起):它将更快地进行pickle,因为您不再需要存储词汇字典,如最近在此问题中所讨论的那样: 如何减少Scikit-Learn Vectorizers的内存使用?

谢谢。这样做并使用joblib可以将大小减少约20-30%。不是很大,但还算不错。 - Cerin

4
你也可以使用joblib.dump并传入压缩参数。我注意到使用选项compress=3时,我的分类器pickle dump的大小减少了约16倍。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接