LDA主题模型评价指标汇总
主题模型评价指标一览
- 前言
- 一、主题距离(Topic distance)
- 引入与思考
- 函数与原理
- Jaccard distance
- Kullback-Leibler divergence
- Hellinger distance
- 注意事项
- 个人经验
- 二、pyldavis
- 简介
- 注意事项
- 三、困惑度(perplexity)
- 四、语义一致性(Coherence Score)
- 概念及流程
- 注意事项
- 五、主观参考评价(Human Judgement Based Methods)
- Word Intrusion
- Topic Intrusion
- 总结:主题模型很难评价!
- 参考
前言
在训练好LDA模型后,一个很自然的举动就是尝试去衡量模型的好坏。在介绍这些评价方法之前,有些东西是需要意识到的
使用gensim包进行LDA建模时对于相同语料集会每次建模会产生不同的模型,这将导致影响模型的评价指标。可以通过
numpy.dandom.seed(1)
来固定随机种子似的每次训练都能得到相同的模型。
一、主题距离(Topic distance)
引入与思考
在我们训练一个LDA模型时可能会考虑如下问题
- 因为训练LDA模型是一个十分漫长的过程,如果我们能知道模型何时收敛,那么就可以及时停止训练,节省训练时间。因此一个很自然的想法就是每隔特定的时间或者轮数或者文档数就输出一次模型,然后进行模型之间的比较。具体模型之间的比较方法请往下看。
在我们得到一个LDA模型后通常会思考两件事:
看看这个模型和其他模型相比的好坏。
我们都知道LDA可以看做两个矩阵,分别是文档和主题的矩阵以及主题和单词的矩阵。gensim的dictionary可以通过训练语料集得到corpus,所以其实每个模型可以用θ(Topic∗Dictionary)\theta(Topic*Dictionary)θ(Topic∗Dictionary)的矩阵来表示。
横向研究一个模型的好坏,很重要的一点是计算它与其他模型之间的相似性和差异性。
对于一个模型中的一个主题,使用最能体现该主题的topntop_ntopn个词进行标注表示(annotation),再通过距离计算公式计算矩阵[topici][topicj][topic_i][topic_j][topici][topicj]的大小来刻画主题i和主题j之间的差异性和相似性。
看看自己聚出来的模型中每个主题之间有哪些不同。
如下图,对于单个模型评价可视化指标的最终的效果是这样的:
- 我使用LDA把语料集聚成了10类,所以横纵坐标长度为10,格子的颜色代表纵坐标主题和横坐标主题的相关程度,非对角线上的格子越蓝越好,z值越趋近于1越好,因为这说明两个主题之间的区分度比较大,交集较少。
- +++的意思是两个主题之间共享的主题词
- .- - -的意思是“ words from the symmetric difference of topics”,也就是最能体现两个主题差异的单词
- 对于两个模型进行比较,方法也很简单,只需要把横轴或者纵轴换成另一个模型的主题表示即可。
函数与原理
本文重点分析一下该方法实现的原理是是什么。先看下实现该指标可视化的函数:
def plot_difference_plotly(mdiff, title="", annotation=None):"""Plot the difference between models.Uses plotly as the backend."""import plotly.graph_objs as goimport plotly.offline as pyannotation_html = Noneif annotation is not None:annotation_html = [["+++ {}<br>--- {}".format(", ".join(int_tokens), ", ".join(diff_tokens))for (int_tokens, diff_tokens) in row]for row in annotation]data = go.Heatmap(z=mdiff, colorscale='RdBu', text=annotation_html)layout = go.Layout(width=950, height=950, title=title, xaxis=dict(title="topic"), yaxis=dict(title="topic"))py.iplot(dict(data=[data], layout=layout))
可以看到该函数有三个输入参数,mdiff,title,annotation。其中title就是可视化图片的标题,mdiff是不同主题之间的距离矩阵,annotation则记录了不同主题之间的共享主题词和差异主题词(就是上面提到的+++和- - -),可以通过
mdiff, annotation = lda_model.diff(lda_model, distance='jaccard', num_words=50)
得到。其中lda_model就是你用gensim包训练的lda模型, distance='jaccard’说明采用了jaccard距离进行计算, 除了jaccard,还有‘kullback—leibler’,‘hellinger’以及‘jensen-shannon‘共四种距离计算方法可以选择。num_words=50说明使用了相关性最高的50个单词代表主题进行计算。
Jaccard distance
Jaccard系数常用来衡量两个样本之间的相似性,公式为:
J(A,B)=∣A⋂B∣∣A⋃B∣J(A,B)=\frac{|A\bigcap B|}{|A\bigcup B|}J(A,B)=∣A⋃B∣∣A⋂B∣
通过维基百科上的图片可以很好理解这一概念,其实就是两个数据集重合的部分所占的比例。
至于Jaccard distance,有两种不同的表示,其一是Jd(A,B)=1−J(A,B)J_d(A,B)=1-J(A,B)Jd(A,B)=1−J(A,B),其二是等于非交集(symmetric difference),即Jd(A,B)=∣A⋃B∣−∣A⋂B∣J_d(A,B)=|A\bigcup B|-|A\bigcap B|Jd(A,B)=∣A⋃B∣−∣A⋂B∣
Kullback-Leibler divergence
KL散度用来衡量两个分布的差异性。就是说对于topicitopic_itopici来说,topicjtopic_jtopicj有多大程度的不同。值得注意的是,KL散度是不对称的。
DKL(P∥Q)=∑x∈XP(x)ln(P(x)Q(x))D_{\mathrm{KL}}(P \| Q)=\sum_{x \in \mathcal{X}} P(x) \ln \left(\frac{P(x)}{Q(x)}\right) DKL(P∥Q)=x∈X∑P(x)ln(Q(x)P(x))
Aurélien Géron的这个视频对KL散度的物理意义解释的非常清晰
Hellinger distance
同样是用来衡量两个分布差异性或相似性的方法,属于f-divergence的一种。对于离散的两个分布,有如下定义:
H(P,Q)=12∥P−Q∥2H(P, Q)=\frac{1}{\sqrt{2}}\|\sqrt{P}-\sqrt{Q}\|_{2} H(P,Q)=21∥P−Q∥2
系数的目的是为了让值在区间[0,1]之间
注意事项
- 此函数仅适用于gensimLDA模型,gensim的HDP和malletLDA并不可用,如果使用会报错如:
AttributeError: 'LdaMallet' object has no attribute 'diff'
- Jaccard 的鲁棒性较好,但是敏感度较低,(就是训练得到的效果看起来会好一点);hellinger的敏感度要高一些。
个人经验
此指标需要与其他指标综合进行考虑。仅仅看模型在该指标下可视化效果还不错,并不能说明你的模型很好。我在实际训练过程中发现不管我的预处理做的有多烂(正常范围内的烂),coherence score有多低(只有0.3多一点),pyvislda看到的效果有多差(很大面积的重叠),这项指标总会以一个“相对很让我满意”的结果安慰我一下。
所以切记不可太过依赖该指标。你可以考虑在其他指标都还可以的情况下,看看这项指标,了解一下主题间的一些差异性,而不应该通过该指标来进行预处理工作中和LDA中的参数修改。
二、pyldavis
简介
这是一个常用的LDA结果可视化工具包,使用pip install pyldavis进行导入。
调用函数:
pyLDAvis.enable_notebook()#mLDA时需要添加
#mallet_model = gensim.models.wrappers.ldamallet.malletmodel2ldamodel(ldamallet)vis = pyLDAvis.gensim.prepare(model, corpus, dictionary)
pyLDAvis.save_html(vis,'model.html')
输入参数有模型,语料集以及字典。
可视化效果如下所示:
左边的气泡代表聚出来的主题,气泡的大小体现该主题的重要程度。左边则是对整个语料集和每个主题内关键词进行打分排序。
注意事项
两个坐标轴是通过PCoA(principal coordinate analysis,主坐标分析)得到的,但也在某种程度上是无意义的。它其实只是把每个主题给在坐标轴上表示出来了,但是仅此而已,因为语义空间是高维的。
- 你很难直观的比较每个主题之间的重要程度,仅仅通过比较每个气泡的大小
- 你也很难比较每个主题之间的相关性关系,因为气泡之间的位置关系和他们的相关性没多大关系。
三、困惑度(perplexity)
perplexity是一个很垃圾的评价指标,别用它。因为它并没有进行任何语义上的分析。让我们仅仅看下perplexity是如何评价模型的:
H(D′)=∑D′P(wd)log2P(wd)PP=2H(D′)\begin{aligned} H\left(D^{\prime}\right) &=\sum_{D^{\prime}} P\left(w_{d}\right) \log _{2} P\left(w_{d}\right) \\ P P &=2^{H\left(D^{\prime}\right)} \end{aligned} H(D′)PP=D′∑P(wd)log2P(wd)=2H(D′)
这只是个对于保留集(hold out data)的极大似然估计罢了。D′D^{\prime}D′保留集数据,我们假设你有个很捞的模型,不管输入什么最后的分类预测结果都是cat,这时恰好你的预留集里面只有cat,结果只能是自欺欺人罢了。
所以我们说,perplexity并没有告诉你语料集的语义信息。
四、语义一致性(Coherence Score)
概念及流程
现在考虑一种能捕捉到模型中语义信息的评价方法。
假设我们没有模型,我们想看下面这两句话的语义一致性
那么我们可能会首先提取出这些关键词来表示这两句话的语义
然后这两句话实际上都是描写曲棍球(ice hockey)的,那么再去掉那些低信息的词后,我们就得到了如下表示曲棍球的关键词词袋。
现在的问题是如果再给我们一个新的语料集,我们怎么分析它们和这些表示曲棍球词袋的语义一致性。
具体处理步骤如上图流水线所示,
t是你模型训练得到的主题集,如下图所示
S是你模型得到的每个主题中的前n个关键词的组合。必须是两个两个一组,可以是两个单词一组,两个(两个单词)一组,或者两个(三个单词)一组。
然后引入外部语料集计算probability:
计算语义确信度衡量(confirmation messure)之CUMassC_{UMass}CUMass:CUMass=2N∗(N−1)∑i=2N∑j=1i−1logP(wi,wj)P(wj)C_{U M a s s}=\frac{2}{N *(N-1)} \sum_{i=2}^{N} \sum_{j=1}^{i-1} \log \frac{P\left(w_{i}, w_{j}\right)}{P\left(w_{j}\right)} CUMass=N∗(N−1)2i=2∑Nj=1∑i−1logP(wj)P(wi,wj)
可以看到这其实是单词间同时出现的条件似然,同时包括了两个单词的信息。所以说这是能体现语境(context)的,不像perplexity。
最后一步的Aggregation其实就是求个均值。
注意事项
- 除了CUMassC_{UMass}CUMass之外,还有很多计算coherence score的指标,比如CVC_{V}CV,CUCIC_{UCI}CUCI等等,但是有几个需要注意的问题:
- 在流水线中仅在最后计算了均值,但是却没有关注方差。所以能难去确认你算的均值能否代表整个语料集的相似性。
- 流水线中的数据处理没有做归一化
- 需要格外注意测试集的选取,有时结果不好可能并不是你的模型不好,而是你的测试集和训练集不匹配。
- 有时你模型聚出来100类,发现效果没有35类的分数高,可能是因为那100类中有55类是没用的主题,拉低了分数。但是!那100类中还有45类有用的主题,却没有被该评价指标反映出来。
五、主观参考评价(Human Judgement Based Methods)
Word Intrusion
当我们用模型训练得到一个主题时,主观判断这个模型好坏的一个方法是先得到这个主题的关键词,然后人为的插入一个不属于该主题的词,再让别人把这个插入词给找出来。如果有很多人一下就能找出来这个插入词,比如下面这个集合中apple就是插入词,那么就说明这个模型聚出来的主题效果还不错。
{dog, cat, horse, apple, pig, cow}
反之,如果别人找不出来所谓的插入词,则说明你聚出来的主题效果可能不大行,比如下面这个集合。
{cat, airport, yarn, horse, security, tomorrow}
Topic Intrusion
对于一篇文档我们也可以训练出一些主题的概率分布,对于那些概率分布极低的主题,我们可以相信这篇文档大概说的主要不是那些内容。
如果同时给出几个主题,你认为的那些和文档讨论内容相关度高的主题恰好是模型聚出来概率分布高的主题,而那些和文档讨论内容相关度低的主题恰好是模型聚出来概率分布低的主题;则说明模型的效果不错。
总结:主题模型很难评价!
- 定性分析费时费力且主观因素强
- 定量分析通常是一些被封装好的算法(intrinsic methods),有时很难去理解结果。
最后,模型的好坏终究还是取决于你自己。
参考
papers
- Chang et. al Reading Tea Leaves: How Humans Interpret Topic Models, NIPS 2009
- Wallach et. al Evaluation Methods for Topic Models, ICML 2009
- Lau et. al Machine Reading Tea Leaves: Automatically Evaluating Topic Coherence and Topic Model Quality, ACL 2014
- Röder et. al Exploring the Space of Topic Coherence Methods, Web Search and Data Mining 2015
- Sievert et. al LDAvis: A method for visualizing and interpreting topics ACL 2014 Workshop on Interactive Language Learning, Visualization, and Interfaces
- Chuang et. al Termite: Visualization Techniques for Assessing Textual Topic Models, AVI 2012
- Chuang et. al Topic Model Diagnostics: Assessing Domain Relevance via Topical Alignment, ICML 2013
others
- https://github.com/RaRe-Technologies/gensim/pull/1243
- https://www.youtube.com/watch?v=UkmIljRIG_M&list=RDCMUCOjD18EJYcsBog4IozkF_7w&start_radio=1&t=0
- https://radimrehurek.com/gensim/models/ldamodel.html
- https://en.wikipedia.org/wiki/Jaccard_index
- https://en.wikipedia.org/wiki/Hellinger_distance
- https://rare-technologies.com/what-is-topic-coherence/
- https://mattilyra.github.io/2017/07/30/evaluating-topic-models.html
LDA主题模型评价指标汇总相关推荐
- lda主题模型困惑度_r语言lda主题模型代码 lda主题模型 案例分析
r语言做灰色预测模型代码为什么会出错? 我正在MATLAB下编写一个Grey system的函数库, 我想其他的网友也做过类似的工作吧. 灰色模型的MATLAB求解代码应该很容易找到吧.如果不想用MA ...
- 【带你玩转主题模型Topic Model】—— 之 利用sklearn 实现Latetnt Dirichlet Allocation(LDA)主题模型
写在前面的话 9月份的第一篇blog, 正好是开学季,作为一个学生,hahahha, 我还是正正经经的贡献一篇认为比较干货的文章给大家吧. 我自己是花了很多时间去看懂LDA的算法了,当然了这篇文章不涉 ...
- lda主题模型的可视化_把LDA主题模型作为自己的硕士课题,有什么可以做的?
经典的LDA主题模型实现了文本的软聚类的工作,将文档转化为基于主题的数值向量,每个维度上的主题概率取值就是对特定主题的聚类中心的隶属度.由于LDA主题模型提出较早,所以作为基础模型有了很多改进和创新, ...
- 【机器学习】基于LDA主题模型的人脸识别专利分析
作者 | Soren Gran 编译 | VK 来源 | Towards Data Science 介绍 作为一名数据科学家,文本数据提出了一个独特的挑战:虽然金融.年龄和温度数据可以立即被注入线性回 ...
- [Pyhon疫情大数据分析] 三.新闻信息抓取及词云可视化、文本聚类和LDA主题模型文本挖掘
思来想去,虽然很忙,但还是挤时间针对这次肺炎疫情写个Python大数据分析系列博客,包括网络爬虫.可视化分析.GIS地图显示.情感分析.舆情分析.主题挖掘.威胁情报溯源.知识图谱.预测预警及AI和NL ...
- 机器学习之LDA主题模型算法
文章目录 1.知道LDA的特点和应用方向 1.1.特点 1.2.应用方向 2.知道Beta分布和Dirichlet分布数学含义 3.了解共轭先验分布 4.知道先验概率和后验概率 5.知道参数α值的大小 ...
- 自然语言处理-LDA主题模型
LDA主题模型 哈尔滨工程大学-537 一.LDA主题模型简介 LDA(Latent Dirichlet Allocation)中文翻译为:潜在狄利克雷分布.LDA主题模型是一种文档生成模型,是一种非 ...
- 一文详解LDA主题模型
[本文作者]达观数据 夏琦 [作者简介]夏琦,达观数据NLP组实习生,就读于东南大学和 Monash University,自然语言处理方向二年级研究生,师从知识图谱专家漆桂林教授.曾获第五届&quo ...
- LDA通俗理解LDA主题模型
转自:http://blog.csdn.net/v_july_v/article/details/41209515#t13 通俗理解LDA主题模型 0 前言 印象中,最开始听说"LDA&qu ...
最新文章
- Signal和slot的声明和连接
- 【Science】CMU机器学习系主任:八个关键标准判别深度学习任务成功与否
- MYSQL数据库注释
- map and flatmap 区别
- android网络通信之SOAP教程实例汇总
- 数据结构:哈希表函数构造和冲突解决方法
- groovy 字符串截取最后一个_Python入门高级教程--Python 字符串
- rust 编程入门_面向初学者的Rust –最受欢迎的编程语言入门
- 图片 过度曝光_解读:摄影初学者,如何理性处理“曝光不足”与“曝光过度”...
- 说说我心中的Linux系统
- 微信公众号开发C#系列-5、用户和用户组管理-支持同步
- [mark] first shellcode
- SUS安装配置简明图解攻略
- 服务器日志egl文件,【图片】Liddy's Linux编译日志(版本8.4)【蕾迪猫的linux吧】_百度贴吧...
- linux勒索病毒如何恢复数据,勒索病毒和相应的解密工具
- VSU(虚拟交换单元)组网提升网络可用性
- Minecraft Forge Mod 开发笔记
- python爬取美女_Python爬取高颜值美女(爬虫+人脸检测+颜值检测)附学习教程
- JVM参数MetaspaceSize的误解
- 做产品引流如何设计引流诱饵?引流核心的步骤是什么?
热门文章
- 安装Discuz开源论坛
- Android 使用模板生成Word文档,支持手机直接查看word
- KubeSphere3.0发布满足对容器混合云的所有想象
- 自适应网页ios失效
- 0x00881789 处的第一机会异常(在 receive_filter.exe 中): 0xC0000005: 读取位置 0x00000000 时发生访问冲突。
- 百度地图获取行政范围边界
- DWG文件有什么方法可以转换为JPG文件
- 读书:成为PPT高手—从思维开始重塑PPT的能力(4)
- java蜘蛛纸牌_Java课程设计——蜘蛛纸牌
- 库索族鼠标连点器 V3.0 绿色版