【问题标题】:Using TSNE to Visualize Clusters in Python使用 TSNE 在 Python 中可视化集群
【发布时间】:2020-05-05 16:24:17
【问题描述】:

我正在使用 TSNE 来可视化我的集群,但输出似乎有点奇怪。应该有 3 个集群,但实际上有 4 行。我如何可视化它们有什么问题还是kmeans方法本身有问题? 我还能如何可视化集群?

import pandas as pd
import numpy as np
import ast
from sklearn import metrics
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE
from sklearn.decomposition import TruncatedSVD

colNames = ['unixTime', 'sampleAmount','Time','samplingRate', 'Data']

data = pd.read_csv("project_fan.csv",  sep = ';', error_bad_lines = False, names = colNames) 

# changing data into list
data['Data'] = data.Data.transform(ast.literal_eval)

# Selecting the average value from the list and replacing the list with it
data['Data'] = data.Data.apply(np.mean)

kmeanModel = KMeans(n_clusters = 3)
kmeanModel.fit(data)

y = kmeanModel.labels_


X_train, X_test, y_train, y_test = train_test_split(data, y, test_size = 0.2, random_state = 1)

k = 3
tfs_reduced = TruncatedSVD(n_components=k, random_state=0).fit_transform(data)
tfs_embedded = TSNE(n_components=2, perplexity=40, verbose=2).fit_transform(tfs_reduced)
fig = plt.figure(figsize = (10, 10))
ax = plt.axes()
plt.scatter(tfs_embedded[:, 0], tfs_embedded[:, 1], marker = "x", c = km.labels_)
plt.show()

示例数据集: https://drive.google.com/file/d/1APIG7C5d-zWPfe1bZa2azDmfQIkDOyVu/view?usp=sharing

       unixTime  sampleAmount  Time  samplingRate         Data
0  1.556891e+09         16384   340  48188.235294  1620.242170
1  1.556891e+09         16384   341  48046.920821  1620.237716
2  1.556891e+09         16384   340  48188.235294  1620.236340
3  1.556891e+09         16384   340  48188.235294  1620.229289
4  1.556891e+09         16384   340  48188.235294  1620.227541

我的输出:

[![enter image description here][1]][1]


  [1]: https://i.stack.imgur.com/Jth9X.png

【问题讨论】:

  • 如果您将 TSNE 直接应用于您的数据并跳过 SVD 步骤会怎样?鉴于您的数据只有 5 个特征,因此您不需要 SVD。
  • @MaximeKan 那仍然没有给出理想的结果。我只得到 4 条不同的“线”(每条线有 5 个不同颜色的部分)而不是簇。
  • 您可能会考虑提供指向您的数据的链接...
  • @SergeyBushmanov 我添加了一个链接!
  • 在修改了您的数据后,我可以与您分享的不是解决方案——因为我相信这里没有解决方案——而是一些想法。 (1) 一般来说TSNE 不是一个很好的获取数据结构的工具。里面的参数太多了。改变它们,有时您将能够发现基本事实,有时则不能。您可以尝试自己更改它们,或者以谷歌为例,有很多在线资源。 (2) 虽然它本身不是一个好的工具,但它可以作为一个初步的特征提取工具,作为其他算法的基础(参见 Kaggle 的模型堆叠)

标签: python pandas scikit-learn data-science data-analysis


【解决方案1】:

我查看了您的代码,除了可能使用一些参数之外,看起来您的可视化效果还不错。由于 t-sne 是对数据进行了相当大的非线性变换,因此通过聚类算法找到的组在通过 t-sne 分析时并不总是会出现。

我在您提供的样本数据上运行了 tsne(暂时没有 TruncatedSVD 步骤),并生成了这个 tsne 嵌入图。

这表明出现在这个嵌入中的组主要由 K-means 分配的相同集群的成员组成,这意味着这两种算法在组中至少有一些相似性正在提议。

是否有可能数据中可能有多少个集群的基本事实不是 3?根据您决定将 3 作为“k”值的原因,您可以考虑验证这一点。 Silhouette scoreCalinski-Harabasz score 是可用于评估集群拟合优度的两个度量示例 - 您可以使用不同的 k 值运行 k-means 并使用分数来确定 k 的哪个值返回集群最适合数据(根据这些措施)。您还可以尝试自行决定“k”值的聚类算法。

最后,然而,就其他可视化集群的方法而言,PCA、SVD 或 TSNE 是我所知道的常规降维方法。您可以通过寻找原始特征的(统计学上显着的)差异来研究不同的集群/colNames

【讨论】:

  • 您可能会考虑增加KMeans 中的“k”,看看KMeansTSNE 在集群定义上是否一致(您可能希望检查sklearn.metrics.homogeneity score)。实际上有 30 多种方法可以检查集群定义的好坏。总结和实现见RNbClust库。定义最佳集群数量更多的是艺术而非科学,很大程度上取决于背后的业务逻辑
猜你喜欢
  • 2018-07-11
  • 1970-01-01
  • 2021-05-18
  • 2021-05-15
  • 2014-05-25
  • 2014-04-18
  • 2020-10-24
  • 1970-01-01
  • 2018-09-07
相关资源
最近更新 更多