关于数据挖掘:拓端tecdatpython主题建模可视化LDA和TSNE交互式可视化

56次阅读

共计 5186 个字符,预计需要花费 13 分钟才能阅读完成。

原文链接:http://tecdat.cn/?p=4261

原文出处:拓端数据部落公众号

应用潜在 Dirichlet 调配(LDA)和 t -SNE 中的可视化进行主题建模。

本文中的代码片段仅供您在浏览时更好地了解。无关残缺的工作代码,请参阅残缺材料。

咱们将首先介绍主题建模和 t -SNE,而后将这些技术利用于两个数据集:20 个新闻组和推文。

什么是主题建模?

主题模型是一套算法 / 统计模型,能够揭示文档集中的暗藏主题。文档通常波及不同比例的多个主题,特地是在跨学科文档中(例如,60%对于生物学,25%对于统计学,15%对于计算机科学的生物信息学文章)。主题模型在数学框架中检查和发现主题可能是什么以及每个文档的主题可能性。

热门话题建模算法包含潜在语义剖析(LSA),分层 Dirichlet 过程(HDP)和潜在 Dirichlet 调配(LDA),其中 LDA 在实践中曾经显示出很好的后果,因而被宽泛采纳。这篇文章将应用 LDA 进行主题建模。

T-SNE

t-SNE 或 t 散布随机邻域嵌入是用于高维数据可视化的维数升高算法。这部分是为了加重人类不能(至多当初不能)感知超过 3 - D 的向量空间这一事实。

这是一个降维并在三维空间中可视化的示例(信用:Google 嵌入我的项目)

t-SNE 是不确定的,其后果取决于数据批次。换句话说,绝对于批次中的其余数据点,雷同的高维数据点能够被转换成不同批次的不同 2 - D 或 3 - D 向量。

能够应用各种语言实现 t -SNE,但速度可能会有所不同。

环境

15-inch MacBook Pro, macOS Sierra

2.2 GHz Intel Core i7 processor

16 GB 1600 MHz DDR3 memory

1. 将 10,000 x 50 矩阵转换为 10,000 x 2

C ++ 和 Python

real 1m2.662s

user 1m0.575s

sys 0m1.929s

Python sklearn

real 3m29.883s

user 2m22.748s

sys 1m7.010s

2. 将 20,000 x 50 矩阵转换为 20,000 x 2

C ++ 和 Python

real 2m40.250s

user 2m32.400s

sys 0m6.420s

Python sklearn

real 6m54.163s

user 4m17.524s

sys 2m31.693s

3. 将 1,000,000 x 25 矩阵转换为 1,000,000 x 2

C ++ 和 Python

real 224m55.747s

user 216m21.606s

sys 8m21.412s

Python sklearn

out of memory… :(

t-SNE 的作者说,他们“曾经将这项技术利用于数据集,最多有 3000 万个例子”(只管他没有指定数据和运行时的维度)。如果你有一个更大的数据集,你能够扩充你的硬件,调整参数(例如,sklearn 的 t -SNE 中的 angle 参数),或尝试代替(如 LargeVis,其作者宣称“与 tSNE 比拟,LargeVis 显着升高了图形构建步骤的计算成本“。我还没有测试过它。

把它放在一起:20 个新闻组的例子

在本节中,咱们将在 20 个新闻组数据集上利用 LDA 算法,以发现每个文档中的根底主题,并应用 t -SNE 将它们显示为组。

获取数据

sklearn 具备检索和过滤 20 个新闻组数据的性能:

from sklearn.datasets import fetch_20newsgroups
 remove = ('headers', 'footers', 'quotes')
 newsgroups\_train = fetch\_20newsgroups(subset ='train', remove =remove)
newsgroups\_test = fetch\_20newsgroups(subset ='test', remove =remove)
  news = \[' ' .join(filter(unicode .isalpha, raw .lower() .split())) for raw in
newsgroups\_train .data + newsgroups\_test .data\]

LDA 模型

在咱们取得清理后的数据后,咱们能够对数据进行矢量化并训练 LDA 模型:

import lda
from sklearn.feature_extraction.text import CountVectorizer
n_topics = 20 # 主题数目
n_iter = 500 # 循环次数
 cvectorizer = CountVectorizer(min\_df =5, stop\_words ='english')
cvz = cvectorizer .fit_transform(news)
 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 来剖析:

from sklearn.manifold import TSNE
 
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 可视化库来可视化新闻组和关键字。

首先咱们做一些设置工作(导入类和函数,设置参数等):

import numpy as np
import bokeh.plotting as bp
from bokeh.plotting import save
from bokeh.models import HoverTool
n\_top\_words = 5 
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\_ # 所有主题关键词
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\] # 取得数据
topic\_summaries .append(' ' .join(topic\_words)) # 加到单词列表

咱们绘制新闻(每个点代表一个新闻):

title = '20 newsgroups LDA viz'
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\]
}))
#绘制每个主题的关键词: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)\]
 for i in xrange(X_topics .shape\[1\]):
plot\_lda .text(topic\_coord\[i, 0\], topic\_coord\[i, 1\], \[topic\_summaries\[i\]\])
 hover = plot_lda .select(dict(type =HoverTool))
hover .tooltips = {"content": "@content - topic: @topic_key"}
 save(plot_lda, '{}.html' .format(title))

你会失去一个像这样的交互式图表:

当咱们为每个文档调配一个次要主题时,有些状况 最可能的主题的概率相当低(极其状况是每个主题被调配 5%,即,均匀分布)。换句话说,咱们的模型无奈为这样的新闻调配主题。

一种解决办法是增加一个阈值因子,以帮忙过滤掉低相信的调配。在咱们训练 LDA 模型之后,应用 t -SNE 缩小维数之前,简略地阐明:

import numpy
threshold = 0.5
\_idx = np .amax(X\_topics, axis =1) > threshold  
X\_topics = X\_topics\[_idx\]

并从新运行咱们将失去的代码:

看起来好多了:独立和明确的簇!

推文示例

Twitter 已成为最受欢迎的新闻和社交网络服务(SNS)平台之一。咱们也能够应用推文语料库来模仿主题。

咱们心愿将推文保留到磁盘并积攒肯定数量(至多数百万)来无效地模仿主题,而不是将推文放在内存中进行实时处理。

首先,咱们须要建设一个推文连贯,咱们能够抓取实时推文:

至多花一两天工夫来积攒相当数量的推文。有时连贯可能会中断:只需从新运行脚本,以便将新推文保留到磁盘。

取得足够的推文后,咱们能够加载推文,解决它们,对它们进行矢量化并计算 tf-idf 分数,训练 LDA 模型,缩小到 2 -D,并可视化后果。请参阅此处的残缺脚本。

你会失去一个如下图:

这是对 200 万条推文进行过训练的模型的可视化,只显示了 5,000 个数据点(或推文)。咱们有一些很好的集群学习模型:“视频点赞新”代表社交网络内容。


参考文献

1.matlab 偏最小二乘回归 (PLSR) 和主成分回归 (PCR) 和主成分回归(PCR)”)

2.R 语言高维数据的主成分 pca、t-SNE 算法降维与可视化剖析

3. 主成分剖析 (PCA) 基本原理及剖析实例基本原理及剖析实例 ”)

4. 基于 R 语言实现 LASSO 回归剖析

5. 应用 LASSO 回归预测股票收益数据分析

6.r 语言中对 lasso 回归,ridge 岭回归和 elastic-net 模型

7.r 语言中的偏最小二乘回归 pls-da 数据分析

8.r 语言中的偏最小二乘 pls 回归算法

9. R 语言线性判别分析(LDA),二次判别分析(QDA)和正则判别分析(RDA)

正文完
 0