在 sklearn 中持久化数据

Posted

技术标签:

【中文标题】在 sklearn 中持久化数据【英文标题】:Persisting data in sklearn 【发布时间】:2012-06-23 21:36:29 【问题描述】:

我正在使用 scikit-learn 对文本文档进行聚类。我正在使用 CountVectorizer、TfidfTransformer 和 MiniBatchKMeans 类来帮助我做到这一点。 新的文本文档一直添加到系统中,这意味着我需要使用上面的类来转换文本并预测一个聚类。我的问题是:我应该如何将数据存储在磁盘上? 我应该简单地腌制矢量化器、转换器和 kmeans 对象吗? 我应该只保存数据吗?如果是这样,如何将其添加回矢量化器、转换器和 kmeans 对象?

任何帮助将不胜感激

【问题讨论】:

【参考方案1】:

这取决于你想做什么。

如果您想在训练集上找到一些固定的集群中心,然后在以后重新使用它们来计算新数据的集群分配,然后对模型进行酸洗(或者只是保存矢量化器的词汇表和其他模型构造函数参数和簇中心位置)是好的。

如果您想要对新数据进行聚类,您可能希望使用新数据 + 旧数据的联合重新训练整个管道,以使矢量化器的词汇表能够构建新特征(维度)对于新词,让聚类算法找到与完整数据集结构更好匹配的聚类中心。

请注意,将来我们将提供散列矢量化器(例如,参见 pull request on hashing transformers 作为第一个构建块),因此不再需要存储词汇表(但您将失去自省“特征维度的含义)。

至于腌制模型与使用您自己的参数表示,我已经在您之前的问题中回答了这部分:Persist Tf-Idf data

【讨论】:

【参考方案2】:

是的,我认为 sk-learn 的一般答案是 pickle 并祈祷。

在我看来,与具有不依赖于实现细节的文档化序列化格式相比,这非常脆弱。但也许他们知道这一点,并且不会对他们的类进行向后不兼容的更改?

【讨论】:

我们知道这是多么脆弱,不,我们目前不保证 100% 向后兼容(尽管每个不兼容的更改都必须在 ML 上讨论并且兼容性通常会保留一段时间发布)。只是还没有找到更好的序列化解决方案。 在 Google 的工作中,协议缓冲区扮演着易于使用和跨语言序列化格式的角色。在我的业余爱好中,我使用过 Thrift,它也做得很好。

以上是关于在 sklearn 中持久化数据的主要内容,如果未能解决你的问题,请参考以下文章

使用sklearn优雅地进行数据挖掘

(sklearn)机器学习模型的保存与加载

使用sklearn进行数据挖掘

sklearn

使用 Sklearn 的算法模型持久性

Sklearn - 没有 pkl 文件的模型持久性