在sklearn中持久化数据

5
我正在使用scikit-learn对文本文档进行聚类。我使用CountVectorizer、TfidfTransformer和MiniBatchKMeans类来帮助我完成这个任务。 由于系统中不断添加新的文本文档,因此我需要使用上述类来转换文本并预测聚类。我的问题是:我应该如何将数据存储在磁盘上? 我应该只是pickle向量化器、转换器和kmeans对象吗? 还是我只需保存数据?如果是这样,我如何将其添加回向量化器、转换器和kmeans对象中?
非常感谢您的帮助。
2个回答

6
这取决于你想要做什么。
如果你想在训练集上找到一些固定的聚类中心,然后将它们保存下来以便以后用于计算新数据的聚类分配,则使用pickle模块(或者只保存向量化器的词汇表、其他模型构造参数和聚类中心位置)是可以的。
如果你想对新数据进行聚类,可能需要重新训练整个流程,使用新数据和旧数据的并集,使得向量化器的词汇表能够为新单词构建新特征(维度),让聚类算法找到更好地匹配完整数据集结构的聚类中心。
请注意,在未来我们将提供哈希向量化器(例如,作为第一个构建块的 哈希变换器的拉取请求),因此不再需要存储词汇表(但您将失去内省特征维度“含义”的能力)。
至于使用pickle模块还是使用自己的表示方法来保存模型的参数,我已经在你之前的问题中回答过了,链接在这里:持久化Tf-Idf数据

4

我认为在使用sk-learn时,通常的答案是要使用pickle并祈祷。

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


我们知道这个很脆弱,目前我们并不保证100%的向后兼容性(尽管每个不兼容的更改都必须在ML上进行讨论,并且通常会在几个版本中保留兼容性)。更好的序列化解决方案还没有被找到。 - Fred Foo
在 Google 工作期间,协议缓冲区发挥了易于使用和跨语言串行化格式的作用。在我的业余时间,我使用过 Thrift,它也做得很好。 - Rob Neuhaus

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