Gensim LDA:运行之间不可重现的一致性值

0 lda gensim

我使用此代码https://datascienceplus.com/evaluation-of-topic-modeling-topic-coherence/来查找数据集的主题一致性。当我用相同数量的主题尝试这段代码时,每次运行后我都会得到新的值。比如题目数=10,运行2次后得到如下值:

First Run for the number of topic =10 Coherence Score CV_1: 0.31230269562327095

一致性分数 UMASS_1:-3.3065236823786064

第二次运行主题数=10 Coherence Score CV_2:0.277016662550274

一致性分数 UMASS_2:-3.6146150653617743

是什么原因?在这种不稳定的情况下,我们如何信任这个库?最高相干值也发生了变化。

小智 6

TL;DR:一致性不是“稳定的”——即在运行之间可重现——在这种情况下,因为基本的 LDA 属性。您可以通过设置随机种子和PYTHONHASHSEED=0. 您可以采取其他步骤来改善结果。

长版:

这不是错误,而是功能。

这不是对图书馆的信任问题,而是对所涉及方法的理解。该scikit-learn库还有一个 LDA 实现,他们的实现也会在每次运行时为您提供不同的结果。但就其本质而言,LDA 是一种生成概率方法。这里稍微简化一下,每次使用时,都会生成许多 Dirichlet 分布,然后是推理步骤。这些步骤和分布生成取决于随机数生成器。随机数生成器,根据他们的定义,生成随机的东西,所以每个模型都略有不同。所以计算这些模型的一致性每次都会给你不同的结果。

但这并不意味着图书馆毫无价值。这是一个非常强大的库,被许多公司(例如亚马逊和思科)和学术界(NIH,无数研究人员)使用 - 引用 gensim 的关于页面:

到目前为止,据我所知,Gensim 是从纯文本实现无监督语义建模的最强大、最高效和最轻松的软件。

如果这就是您想要的,那么 gensim 是要走的路——当然不是唯一的路(tmtoolkitsklearn也有 LDA),而是一个不错的路径选择。话虽如此,有一些方法可以确保模型运行之间的可重复性。

Gensim 再现性

PYTHONHASHSEED=0

来自Python 文档:“在 Python 3.3 及更高版本上,默认情况下启用哈希随机化。”

使用random_state模型中的规范

Afaik,所有 gensim 方法都有一种指定要使用的随机种子的方法。选择您喜欢的任何数字,但默认值为零(“关闭”)并在每次重新运行时使用相同的数字 - 这确保随机数生成器的相同输入始终产生相同的输出(gensim ldamodel 文档)

使用 ldamodel.save() 和 ldamodel.load() 进行模型持久化

这也是一个非常有用、省时的步骤,让您不必在每次启动时重新运行模型(对于长时间运行的模型非常重要)。

优化您的模型和数据

从技术上讲,这不会使您的模型完全可重现,但即使没有随机种子设置,如果您增加iterations或,您也会看到您的模型性能更好(以计算时间为代价)passes。预处理也有很大的不同,它本身就是一门艺术——你是选择词形还原还是词干,你为什么要这样做?这一切都会对输出和您的解释产生重要影响。

警告:您必须只使用一个核心

LdaMulticore由于操作系统处理多处理的方式,多核方法(和分布式版本)永远无法 100% 重现。