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

时间:2018-08-21 20:21:10

标签: gensim lda

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

首次运行时主题数= 10 相干分数CV_1:0.31230269562327095

一致性得分UMASS_1:-3.30652368237860860

第二次运行主题数= 10 相干分数CV_2:0.277016662550274

一致性得分UMASS_2:-3.6146150653617743

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

1 个答案:

答案 0 :(得分:1)

TL; DR:一致性不是“稳定”的-即在运行之间具有可重现性-在这种情况下,由于基本的LDA特性。您可以通过设置随机种子和PYTHONHASHSEED=0使LDA可重现。您可以采取其他措施来改善结果。

长版:

这不是错误,它是一个功能。

这不是对库的信任问题,而是对所涉及方法的理解。 scikit-learn库还具有LDA实现,并且它们的每次运行都会为您提供不同的结果。但是从本质上讲,LDA是一种生成概率方法。在这里进行一点简化,每次使用它时,都会生成许多Dirichlet分布,然后是推断步骤。这些步骤和分布生成取决于随机数生成器。根据其定义,随机数生成器会生成随机数据,因此每种模型都略有不同。因此,计算这些模型的一致性会每次给您不同的结果。

但这并不意味着图书馆一文不值。它是一个非常强大的库,许多公司(例如Amazon和Cisco)和学者(NIH,无数研究人员)都在使用该库-引用gensim的“关于”页面:

  

据我所知,Gensim现在是最健壮,高效,最轻松的软件,可以从纯文本中实现无监督的语义建模。

如果这是您想要的,gensim是行之有效的方法-肯定不是唯一的行之有效的方法(tmtoolkitsklearn也具有LDA),而是一种不错的选择路径。话虽这么说,但是有一些方法可以确保模型运行之间的可重复性。

Gensim可重复性

设置PYTHONHASHSEED=0

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

在模型规格中使用random_state

Afaik,所有gensim方法都具有一种指定要使用的random seed的方式。选择任何您喜欢的数字,但默认值为零(“关”),并为每次重新运行使用相同的数字-这样可确保输入到随机数生成器的相同输入始终会产生相同的输出(gensim ldamodel documentation)。 / p>

将ldamodel.save()和ldamodel.load()用于模型持久性

这也是一个非常有用的省时步骤,可避免您每次启动时都必须重新运行模型(这对于长时间运行的模型非常重要)。

优化模型和数据

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

注意:您只能使用一个核心

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