具有混合连续变量和二元变量的 t-SNE

机器算法验证 Python 降维 无监督学习 特纳 混合类型数据
2022-03-20 06:32:51

我目前正在研究使用 t-SNE 对高维数据进行可视化。我有一些混合了二进制和连续变量的数据,这些数据似乎很容易对二进制数据进行聚类。当然,这对于缩放(0 到 1 之间)数据是预期的:欧几里得距离在二元变量之间总是最大/最小。应该如何使用 t-SNE 处理混合的二进制/连续数据集?我们应该删除二进制列吗?它有不同的metric我们可以使用吗?

作为一个例子,考虑这个 python 代码:

x1 = np.random.rand(200)
x2 = np.random.rand(200)
x3 = np.r_[np.ones(100), np.zeros(100)]

X = np.c_[x1, x2, x3]

# plot of the original data
plt.scatter(x1, x2, c=x3)
# … format graph

所以我的原始数据是:

原始数据

其中颜色是第三个特征 (x3) 的值 - 在 3D 中,数据点位于两个平面中(x3=0 平面和 x3=1 平面)。

然后我执行 t-SNE:

tsne = TSNE() # sci-kit learn implementation
X_transformed = StandardScaler().fit_transform(X)
tsne = TSNE(n_components=2, perplexity=5)
X_embedded = tsne.fit_transform(X_transformed)

结果图:

tsne_data

并且数据当然由 x3 聚集。我的直觉是,由于二进制特征的距离度量没有很好地定义,我们应该在执行任何 t-SNE 之前放弃它们,这将是一种耻辱,因为这些特征可能包含用于生成集群的有用信息。

1个回答

免责声明:我对该主题只有切线知识,但由于没有其他人回答,我会尝试一下

距离很重要

任何基于距离的降维技术(tSNE、UMAP、MDS、PCoA 和可能的其他)都只能与您使用的距离度量一样好。正如@amoeba 正确指出的那样,不可能有一个万能的解决方案,您需要有一个距离度量来捕捉您认为数据中重要的内容,即您认为相似的行具有较小的距离和行您会考虑不同有很大的距离。

你如何选择一个好的距离度量?首先,让我做一点转移:

按立

早在现代机器学习的光辉岁月之前,社区生态学家(很可能还有其他人)已经尝试为多维数据的探索性分析绘制漂亮的图。他们称之为过程协调,它是一个有用的关键词,可以在生态学文献中搜索,至少可以追溯到 70 年代,并且在今天仍然很强大。

重要的是生态学家拥有非常多样化的数据集并处理二进制、整数和实值特征的混合(例如物种的存在/不存在、观察到的标本数量、pH、温度)。他们花了很多时间思考距离和转换,以使出家顺利进行。我不太了解该领域,但例如 Legendre 和 De Cáceres Beta 多样性作为社区数据的方差的评论:不相似系数和分区显示了您可能想要检查的大量可能距离。

多维缩放

排序的首选工具是多维缩放 (MDS),尤其是非度量变体 (NMDS),我鼓励您在 t-SNE 之外尝试。我不了解 Python 世界,但是包metaMDS函数中的 R 实现vegan为您做了很多技巧(例如,运行多次运行,直到找到两个相似的)。

这一直存在争议,请参阅评论: MDS 的优点在于它还可以投影特征(列),因此您可以看到哪些特征推动了降维。这有助于您解释数据。

请记住,t-SNE 一直被批评为一种获得理解的工具,例如对其陷阱的探索——我听说 UMAP 解决了一些问题,但我没有使用 UMAP 的经验。我也不怀疑生态学家使用 NMDS 的部分原因是文化和惯性,也许 UMAP 或 t-SNE 实际上更好。老实说,我不知道。

拉开自己的距离

如果您了解数据的结构,那么现成的距离和转换可能不适合您,您可能希望构建自定义距离度量。虽然我不知道您的数据代表什么,但为实值变量(例如,如果有意义,则使用欧几里德距离)和二进制变量分别计算距离并添加它们可能是明智的。二进制数据的常见距离是例如Jaccard 距离Cosine 距离您可能需要考虑距离的一些乘法系数,因为无论特征数量如何,Jaccard 和余弦的值都在中,而欧几里德距离的大小反映了特征的数量。[0,1]

一个警告

始终要记住,由于要调整的旋钮太多,因此很容易陷入调整的陷阱,直到看到自己想看到的为止。这在探索性分析中很难完全避免,但您应该谨慎。