我使用此代码https://datascienceplus.com/evaluation-of-topic-modeling-topic-coherence/来查找数据集的主题一致性。当我尝试使用相同数量的主题编写此代码时,每次运行后都会获得新值。例如,对于主题数= 10,我在运行2后得到以下值:
第一次运行主题数= 10 Coherence Score CV_1:0.31230269562327095
Coherence Score UMASS_1:-3.3065236823786064
第二次运行主题数= 10 Coherence Score CV_2:0.277016662550274
连贯分数UMASS_2:-3.6146150653617743
是什么原因?在这种不稳定的情况下,我们如何信任这个图书馆?最高的一致性值也发生了变化。
TL; DR:连贯性不是“稳定的”-e.e.在运行之间可重现 - 在这种情况下,由于基本的LDA属性。您可以通过设置随机种子和PYTHONHASHSEED=0
来使LDA重现。您可以采取其他步骤来改善结果。
长版:
这不是一个错误,它是一个功能。
它不是对图书馆的信任问题,而是对所涉及方法的理解。 scikit-learn
库也有一个LDA实现,他们也会在每次运行时给你不同的结果。但就其本质而言,LDA是一种生成概率方法。在这里简化一点,每次使用它时,会生成许多Dirichlet分布,然后是推理步骤。这些步骤和分布生成取决于随机数生成器。根据它们的定义,随机数生成器生成随机的东西,因此每个模型略有不同。因此,计算这些模型的一致性每次都会给你不同的结果。
但这并不意味着图书馆毫无价值。它是一个非常强大的库,被许多公司(例如亚马逊和思科)和学者(NIH,无数研究人员)使用 - 引用gensim的关于页面:
到目前为止,根据我的知识,Gensim是最强大,最有效和最轻松的软件,可以从纯文本中实现无监督的语义建模。
如果这就是你想要的,那么gensim是要走的路 - 当然不是唯一的方法(tmtoolkit或sklearn也有LDA),但是路径选择非常好。话虽如此,有一些方法可以确保模型运行之间的可重复性。
Gensim再现性
设置PYTHONHASHSEED=0
来自Python documentation:“在Python 3.3及更高版本中,默认情况下启用哈希随机化。”
在您的模型规范中使用random_state
Afaik,所有gensim方法都有一种方法来指定要使用的random seed。选择您喜欢的任何数字,但默认值为零(“关闭”)并为每次重新运行使用相同的数字 - 这可确保随机数生成器中的相同输入始终产生相同的输出(gensim ldamodel documentation)。
使用ldamodel.save()和ldamodel.load()来获得模型持久性
这也是一个非常有用的,省时的步骤,使您不必每次启动时都重新运行模型(对于长时间运行的模型非常重要)。
优化您的模型和数据
这在技术上并不能使您的模型完全可重复,但即使没有随机种子设置,如果增加iterations
or passes
,您将看到您的模型表现更好(以计算时间为代价)。预处理也会产生很大的不同,并且本身就是一门艺术 - 你选择引理或干预,你为什么这样做?这一切都会对输出和解释产生重要影响。
警告:你必须只使用一个核心
多核方法(LdaMulticore
和分布式版本)永远不会100%可重复,因为操作系统处理多处理的方式。