原创python主题LDA建模和tSNE可视化数据分析报告论文含代码数据.docx
《原创python主题LDA建模和tSNE可视化数据分析报告论文含代码数据.docx》由会员分享,可在线阅读,更多相关《原创python主题LDA建模和tSNE可视化数据分析报告论文含代码数据.docx(12页珍藏版)》请在冰点文库上搜索。
![原创python主题LDA建模和tSNE可视化数据分析报告论文含代码数据.docx](https://file1.bingdoc.com/fileroot1/2023-5/28/e9e67b38-7778-4931-aae9-904d0e4227b5/e9e67b38-7778-4931-aae9-904d0e4227b51.gif)
原创python主题LDA建模和tSNE可视化数据分析报告论文含代码数据
python主题LDA建模和t-SNE可视化数据分析报告
来源:
大数据部落|有问题XX一下“
”就可以了
使用潜在Dirichlet分配(LDA)和t-SNE中的可视化进行主题建模。
本文中的代码片段仅供您在阅读时更好地理解。
有关完整的工作代码,请参阅此回购。
我们将首先介绍主题建模和t-SNE,然后将这些技术应用于两个数据集:
20个新闻组和推文。
什么是主题建模?
主题模型是一套算法/统计模型,可以揭示文档集中的隐藏主题。
直观地看,因为一个文件是关于某个特定话题,人们所期望的某些词出现在文档中或多或少频繁:
“算法”,“编译器”,和“阵”将在大约计算机科学文档更经常出现,“关于政治的文件中的民主','政治家'和'政策',''','a'和'是'两者都可能同样出现。
此外,文档通常涉及不同比例的多个主题,特别是在跨学科文档中(例如,60%关于生物学,25%关于统计学,15%关于计算机科学的生物信息学文章)。
主题模型在数学框架中捕获这种直觉,以检查和发现主题可能是什么以及每个文档的主题平衡。
热门话题建模算法包括潜在语义分析(LSA),分层Dirichlet过程(HDP)和潜在Dirichlet分配(LDA),其中LDA在实践中已经显示出很好的结果,因此被广泛采用。
这篇文章将使用LDA进行主题建模(对于那些喜欢了解LDA理论并且阅读公式很舒服的人,请参阅本文)。
T-SNE
t-SNE或t分布随机邻域嵌入是用于高维数据可视化的维数降低算法。
这部分是为了减轻人类不能(至少现在不能)感知超过3-D的向量空间这一事实。
这是一个减少784-D数字表示并在三维空间中可视化的示例(信用:
Google嵌入项目)
t-SNE是不确定的,其结果取决于数据批次。
换句话说,相对于批次中的其他数据点,相同的高维数据点可以被转换成不同批次的不同2-D或3-D向量。
可以使用各种语言实现t-SNE,但速度可能会有所不同。
例如,我对C++和Python包装器以及Pythonsklearn版本进行了比较,发现前者在矩阵转换速度方面通常快3倍:
环境
15-inchMacBookPro,macOSSierra
2.2GHzIntelCorei7processor
16GB1600MHzDDR3memory
1.将10,000x50矩阵转换为10,000x2
C++和Python
real1m2.662s
user1m0.575s
sys0m1.929s
Pythonsklearn
real3m29.883s
user2m22.748s
sys1m7.010s
2.将20,000x50矩阵转换为20,000x2
C++和Python
real2m40.250s
user2m32.400s
sys0m6.420s
Pythonsklearn
real6m54.163s
user4m17.524s
sys2m31.693s
3.将1,000,000x25矩阵转换为1,000,000x2
C++和Python
real224m55.747s
user216m21.606s
sys8m21.412s
Pythonsklearn
outofmemory...:
(
t-SNE的作者说,他们“已经将这项技术应用于数据集,最多有3000万个例子”(尽管他没有指定数据和运行时的维度)。
如果你有一个更大的数据集,你可以扩大你的硬件,调整参数(例如,sklearn的t-SNE中的angle参数),或尝试替代(如LargeVis,其作者声称“与tSNE比较,LargeVis显着降低了图形构建步骤的计算成本“。
我还没有测试过它。
把它放在一起:
20个新闻组的例子
足够的理论:
让我们亲自动手吧。
在本节中,我们将在20个新闻组数据集上应用LDA算法,以发现每个文档中的基础主题,并使用t-SNE将它们显示为组。
获取数据
幸运的是,它sklearn具有轻松检索和过滤20个新闻组数据的功能:
fromsklearn.datasetsimportfetch_20newsgroups
#weonlywanttokeepthebodyofthedocuments!
remove = ('headers','footers','quotes')
#fetchtrainandtestdata
newsgroups_train = fetch_20newsgroups(subset ='train',remove =remove)
newsgroups_test = fetch_20newsgroups(subset ='test',remove =remove)
#alistof18,846cleanednewsinstringformat
#onlykeepletters&makethemalllowercase
news = ['' .join(filter(unicode .isalpha,raw .lower() .split())) for raw in
newsgroups_train .data + newsgroups_test .data]
LDA模型
在我们获得清理后的数据后,我们可以对令牌进行矢量化并训练LDA模型:
importlda
fromsklearn.feature_extraction.textimportCountVectorizer
n_topics = 20#numberoftopics
n_iter = 500#numberofiterations
#vectorizer:
ignoreEnglishstopwords&wordsthatoccurlessthan5times
cvectorizer = CountVectorizer(min_df =5,stop_words ='english')
cvz = cvectorizer .fit_transform(news)
#trainanLDAmodel
lda_model = lda .LDA(n_topics =n_topics,n_iter =n_iter)
X_topics = lda_model .fit_transform(cvz)
其中X_topics是18,846(num_news)乘20(n_topics)矩阵。
注意,我们在这里有一个很好的概率解释:
每一行是属于某个主题的这个新闻的概率分布(由我们的LDA模型学习)(例如,X_topics[0][0]代表属于主题1的第一个新闻的可能性)。
用t-SNE减少到2-D
我们有一个学习过的LDA模型。
但我们无法直观地检查我们的模型有多好。
t-SNE来救援:
fromsklearn.manifoldimportTSNE
#at-SNEmodel
#anglevaluecloseto1meanssacrificingaccuracyforspeed
#pcainitializtionusuallyleadstobetterresults
tsne_model = TSNE(n_components =2,verbose =1,random_state =0,angle =.99,init='pca')
#20-D->2-D
tsne_lda = tsne_model .fit_transform(X_topics)
可视化组及其关键字
现在,我们已准备好使用流行的Python可视化库散景来可视化新闻组和关键字。
首先我们做一些设置工作(导入类和函数,设置参数等):
importnumpy as np
importbokeh.plotting as bp
frombokeh.plottingimportsave
frombokeh.modelsimportHoverTool
n_top_words = 5#numberofkeywordsweshow
#20colors
colormap = np .array([
"#1f77b4","#aec7e8","#ff7f0e","#ffbb78","#2ca02c",
"#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5",
"#8c564b","#c49c94","#e377c2","#f7b6d2","#7f7f7f",
"#c7c7c7","#bcbd22","#dbdb8d","#17becf","#9edae5"
])
然后我们找到每个新闻最可能的主题:
_lda_keys = []
for i in xrange(X_topics .shape[0]):
_lda_keys += _topics[i] .argmax(),
并获得每个主题的顶级单词:
topic_summaries = []
topic_word = lda_model .topic_word_#alltopicwords
vocab = cvectorizer .get_feature_names()
for i,topic_dist in enumerate(topic_word):
topic_words = np .array(vocab)[np .argsort(topic_dist)][:
-(n_top_words + 1):
-1]#get!
topic_summaries .append('' .join(topic_words))#append!
最后但并非最不重要的是,我们绘制新闻(每个点代表一个新闻):
title = '20newsgroupsLDAviz'
num_example = len(X_topics)
plot_lda = bp .figure(plot_width =1400,plot_height =1100,
title =title,
tools ="pan,wheel_zoom,box_zoom,reset,hover,previewsave",
x_axis_type =None,y_axis_type =None,min_border =1)
plot_lda .scatter(x =tsne_lda[:
0],y =tsne_lda[:
1],
color =colormap[_lda_keys][:
num_example],
source =bp .ColumnDataSource({
"content":
news[:
num_example],
"topic_key":
_lda_keys[:
num_example]
}))
并绘制每个主题的关键词:
#randomlychooseanews(withinatopic)coordinateasthecrucialwordscoordinate
topic_coord = np .empty((X_topics .shape[1],2)) * np .nan
for topic_num in _lda_keys:
if not np .isnan(topic_coord) .any():
break
topic_coord[topic_num] = tsne_lda[_lda_keys .index(topic_num)]
#plotcrucialwords
for i in xrange(X_topics .shape[1]):
plot_lda .text(topic_coord[i,0],topic_coord[i,1],[topic_summaries[i]])
#hovertools
hover = plot_lda .select(dict(type =HoverTool))
hover .tooltips = {"content":
"@content-topic:
@topic_key"}
#savetheplot
save(plot_lda,'{}.html' .format(title))
这是很多代码...但如果你已经做到这一点,你会得到一个像这样的交互式情节:
当我们为每个文档分配一个主要主题时,有些情况甚至最可能的主题的概率相当低(极端情况是每个主题被分配5%,即,均匀分布)。
换句话说,我们的模型无法自信(利润率很高)为这样的新闻分配主题。
一种解决方法是添加一个阈值因子,以帮助过滤掉非自信的分配。
在我们训练LDA模型之后,在我们使用t-SNE减少维数之前,简单地说明这些线:
importnumpy
threshold = 0.5
_idx = np .amax(X_topics,axis =1) > threshold#idxofdocthatabovethethreshold
X_topics = X_topics[_idx]
并重新运行我们将得到的代码:
看起来好多了:
孤立和明确的团体!
然而,我们以牺牲非自信的任务为代价来实现这一目标(在这种情况下,超过一半的数据)。
这表明我们的LDA模型只能从这个数据集中学到很多,而且我们的模型没有信心为所有新闻分配一个好的主题。
也就是说,如果你仔细检查每个主题,那么为每个主题学到的热门话语都有一定道理:
例如,'医疗保健使用号码患者'(医疗保健)反对'godjesuschristianbible'(宗教)。
推文示例
Twitter已成为最受欢迎的新闻和社交网络服务(SNS)平台之一。
在上一篇博客实时Twitter趋势发现中,我们讨论了如何实时可视化Twitter趋势。
然而,我们也可以使用推文语料库来模拟主题。
我们希望将推文保存到磁盘并积累一定数量(至少数百万)来有效地模拟主题,而不是将推文放在内存中进行实时处理。
首先,我们需要建立一个推文连接:
请查看本节的内容。
凭借凭据,我们可以抓取实时推文:
至少花一两天时间来积累相当数量的推文。
有时连接可能会中断:
只需重新运行脚本,以便将新推文保存到磁盘。
获得足够的推文后,我们可以加载推文,处理它们,对它们进行矢量化并计算tf-idf分数,训练LDA模型,减少到2-D,并可视化结果。
请参阅此处的完整脚本。
你会得到一个如下图:
这是对200万条推文进行过培训的模型的可视化,只显示了5,000个数据点(或推文)。
我们有一些很好的集群学习模型:
'性女孩色情'代表一些色情相关的推文,'视频喜欢新'代表社交网络内容,'特朗普希拉里cliton'代表政治和选举。