【问题标题】:How to efficiently serialize a scikit-learn classifier如何有效地序列化 scikit-learn 分类器
【发布时间】:2013-07-09 04:16:39
【问题描述】:

序列化 scikit-learn 分类器最有效的方法是什么?

我目前正在使用 Python 的标准 Pickle 模块来序列化 text classifier,但这会导致 pickle 非常大。序列化的对象可以是 100MB 或更多,这似乎太大了,需要一段时间来生成和存储。我用 Weka 做过类似的工作,等效的序列化分类器通常只有几 MB。

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

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

【问题讨论】:

  • 你在cPickle中使用了协议-1吗?这通常会产生不可思议的影响。

标签: python machine-learning pickle scikit-learn


【解决方案1】:

对于大型文本数据集,使用散列技巧:将 TfidfVectorizer 替换为 HashingVectorizer(在管道中可能与 TfidfTransformer 堆叠):腌制会快得多,因为您不必这样做像最近在这个问题中讨论的那样存储词汇字典:

How can i reduce memory usage of Scikit-Learn Vectorizers?

【讨论】:

  • 谢谢。那和使用 joblib 减少了大约 20-30% 的大小。不大,但很体面。
【解决方案2】:

您也可以使用joblib.dump 并传入压缩。我注意到我的分类器泡菜转储使用选项 compress=3 减少了约 16 倍。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-09
    • 2012-09-26
    • 2018-07-01
    • 1970-01-01
    • 2018-07-14
    • 2015-09-25
    • 2016-02-24
    • 2016-05-22
    相关资源
    最近更新 更多