使用t-SNE和/或PCA时Gensim Doc2Vec可视化问题

问题描述

我试图通过使用电影评论的公共数据集来熟悉doc2vec的结果。我已经清理了数据并运行模型。如您在下面看到的,有6个标签/类型。每个都是带有向量表示的文档。

soup = BeautifulSoup(page.content,'lxml')

“浪漫”和“喜剧”相当相似,而“动作”和“科幻”与“浪漫”相比则完全不同。到现在为止还挺好。但是,为了使结果可视化,我需要减小向量维数。因此,我先尝试t-SNE,然后再尝试PCA。这是代码和结果:

doc_tags = list(doc2vec_model.docvecs.doctags.keys())
print(doc_tags)
X = doc2vec_model[doc_tags]
print(X)
['animation','fantasy','comedy','action','romance','sci-fi']
[[ -0.6630892    0.20754902   0.2949621    0.622197     0.15592825]
 [ -1.0809666    0.64607996   0.3626246    0.9261689    0.31883526]
 [ -2.3482993    2.410015     0.86162883   3.0468733   -0.3903969 ]
 [ -1.7452248    0.25237766   0.6007084    2.2371168    0.9400951 ]
 [ -1.9570891    1.3037877   -0.24805197   1.6109428   -0.3572465 ]
 [-15.548988    -4.129228     3.608777    -0.10240117   3.2107658 ]]

print(doc2vec_model.docvecs.most_similar('romance'))
[('comedy',0.6839742660522461),('animation',0.6497607827186584),('fantasy',0.5627620220184326),('sci-fi',0.14199887216091156),('action',0.046558648347854614)]

出了点问题。当我可视化结果时,这一点更加明显:

TSNE:

t-SNE result

PCA:

PCA result

这显然不是模型产生的。我确信我缺少一些基本知识。如果您有任何建议,将不胜感激。

解决方法

  • t-SNE 嵌入:认为嵌入空间中的点(或簇)之间的距离与原始空间中的距离成比例是一个常见的错误。这是t-SNE的主要缺点,有关更多信息,请参见here。因此,您不应从可视化中得出任何结论。

  • PCA 嵌入:PCA对应于将坐标系统旋转到新的正交坐标系中,该坐标系最佳地描述了数据的方差。当保留所有主成分时,(欧几里得)距离被保留,但是当减小尺寸时(例如到2D),这些点将以最大的方差投影到轴上,并且该距离可能不再与原始距离相对应。同样,很难得出关于原始空间中的点与嵌入之间的距离的结论。

,

首先,按照这种可视化的要求,在进行2D投影时,您总是会失去全尺寸模型的某些品质。您只是希望-并尝试选择适当的方法/参数-保留重要方面。因此,当特定的可视化效果令人失望时,不一定有任何“错误”。

尤其是像word2vec / doc2vec这样的高维“密集嵌入”,完整嵌入中的 way 信息比2D投影中显示的要多。您可能会在这样的情节中看到一些明智的微观关系-在一些地方的近邻符合预期-但是,整体的“地图”将无法像真正的2D曲面的真实地图那样被解释。 >

但是:看起来您正在创建一个只有6个文档标签的30维Doc2Vec模型。由于Doc2Vec的工作方式,如果只有5个唯一标签,则基本上是在只对5个虚拟文档进行培训的情况下,将它们切成不同的片段。好像您已将所有“喜剧”评论合并到一个大文档中,而所有“浪漫”评论都一样,等等。

对于Doc2Vec的许多用途,尤其是在介绍了基础“段落矢量”算法的已发表论文中,更典型的是将每个文档的唯一ID用作其“标签”,尤其是由于许多下游用途那么每个文档都需要一个文档载体,而不是每个已知类别。这样可以更好地保存/建模原始数据中的信息,而将所有内容折叠成6个大型文档和6个摘要标记向量,则可以使用更简单的隐式类别形状。

请注意,如果将唯一的ID用作标签,则不会自动从每个类别中获得一个摘要标签矢量,您可以从模型中读取每个类别的摘要标签矢量。但是,您可以合成这样的向量,也许只需将某个类别中所有文档的向量平均即可得到该类别的质心。

有时,将已知标签用作文档标签有时还是很有价值的,它们可以代替唯一ID(如您在此处所做的那样),或者作为唯一ID的补充(使用不止一个{ {1}}(每个培训文档)。

但是您应该知道使用已知标签,并且只能使用已知标签,因为标签可能会受到限制。 (例如,如果您改为为每个文档训练一个单独的矢量,则可以通过可视化来绘制文档,并用已知标签为圆点上色,并查看哪些类别往往具有较大的重叠,并突出显示某些类别的数据点挑战类别,或者在其他类别中拥有最近的邻居。