【问题标题】:Gensim Doc2Vec visualization issue when using t-SNE and/or PCA使用 t-SNE 和/或 PCA 时的 Gensim Doc2Vec 可视化问题
【发布时间】:2020-12-04 07:50:29
【问题描述】:

我正在尝试通过使用电影评论的公共数据集来熟悉 Doc2Vec 结果。我已经清理了数据并运行了模型。如下所示,有 6 个标签/流派。每个都是具有其矢量表示的文档。

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)]

“浪漫”和“喜剧”非常相似,而“动作”和“科幻”与“浪漫”相比是完全不同的类型。到目前为止,一切都很好。但是,为了可视化结果,我需要降低向量维数。因此,我先尝试 t-SNE,然后尝试 PCA。这是代码和结果:

# TSNE
tsne = TSNE(n_components=2)
X_tsne = tsne.fit_transform(X)
df = pd.DataFrame(X_tsne, index=doc_tags, columns=['x', 'y'])
print(df)
                    x           y
animation -162.499695   74.153679
fantasy    -10.496888   93.687149
comedy     -38.886723  -56.914558
action     -76.036247  232.218231
romance    101.005371  198.827988
sci-fi     123.960182   20.141081

# PCA
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
df_1 = pd.DataFrame(X_pca, index=doc_tags, columns=['x', 'y'])
print(df_1)
                   x         y
animation  -3.060287 -1.474442
fantasy    -2.815175 -0.888522
comedy     -2.520171  2.244404
action     -2.063809 -0.191137
romance    -2.578774  0.370727
sci-fi     13.038214 -0.061030

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

TSNE:

主成分分析:

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

【问题讨论】:

    标签: python machine-learning scatter-plot cosine-similarity doc2vec


    【解决方案1】:

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

    尤其是像 word2vec/doc2vec 这样的高维“密集嵌入”,在完整嵌入中方式的信息比二维投影中显示的要多。您可能会在这样的情节中看到一些明智的微观关系——在一些符合预期的地方的近邻——但整体“地图”几乎不像真正的 2D 表面的真实地图那样具有可解释性。

    而且:看起来您正在创建一个只有 6 个文档标签的 30 维 Doc2Vec 模型。由于Doc2Vec 的工作方式,如果只有 5 个唯一标签,则基本上是您只训练 5 个虚拟文档,只是被分割成不同的片段。就好像你把所有的“喜剧”评论连接成一个大文档,所有的“浪漫”评论都是一样的,等等。

    对于Doc2Vec 的许多用途,尤其是在已发表的介绍底层“段落向量”算法的论文中,更典型的是使用每个文档的唯一 ID 作为其“标签”,特别是因为许多下游使用需要每个文档的文档向量,而不是每个已知类别。这可能会更好地保留/建模原始数据中的信息 - 而将所有内容折叠为仅 6 个大型文档和 6 个摘要标签向量,强加了更简单的隐含类别形状。

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

    使用 known-labels 作为文档标签有时仍然很有价值,可以代替唯一 ID(正如您在此处所做的那样),或者除了唯一 ID(使用多个 @ 选项) 987654324@ 每个培训文档)。

    但是您应该知道使用已知标签,并且只使用已知标签,因为标签可能会受到限制。 (例如,如果您改为为每个文档训练一个单独的向量,那么您可以通过可视化绘制文档,并使用已知标签为点着色,查看哪些类别往往有较大的重叠,并突出显示某些数据点似乎挑战类别,或在不同类别中有最近邻。)

    【讨论】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-27
        • 1970-01-01
        • 2016-06-07
        • 2019-06-11
        • 1970-01-01
        • 2017-02-12
        • 2018-07-21
        • 1970-01-01
        相关资源
        最近更新 更多