有效使用t-SNE进行降维
数据可视化在现实世界的机器学习应用中非常重要。随着大量数据集和大量信息的日益可用性,以不同的特征编码的数据集成为研究新的可视化方法的合适选择。
数据集包含许多特征,但都是不可探究的。在统计学和机器学习中,降维是通过获得一组主要变量来减少所考虑的随机变量数量的过程。它可以分为特征选择和特征提取。
有许多降维技术,如Sammon mapping,多维标度(MDS),基于图形的可视化和t-SNE。在这里,我们将讨论t-SNE方法,t-分布式随机邻域嵌入是一种用于挖掘高维数据的非线性降维算, 它将多维数据映射到适合于人类观察的两个或多个维度。然后我们将在MNIST数据集上应用此方法。
什么是t-SNE?
它是一种探索高维数据的流行方法,并已在机器学习领域广泛应用。它是一种非常有用的降维技术,并且比上面提到的其他技术要好得多。它具有从高维数据创建二维图形的能力。
t-SNE如何运作?
t-SNE的工作对数学领域的知识要求比较高。t-SNE的大致作用是试图保持邻域内的距离。
假设我们使用t-SNE将d维数据减少为二维数据。
从上面的图片中我们可以看到x2和x3在x1 [N(x1)= {x2,x3}]邻域内,并且x5在x4 [N(x4)= {x5}]的邻域内。
由于t-SNE保留了邻域的距离,
d(x1, x2) ≈ d(x'1, x'2)
d(x1, x3) ≈ d(x'1, x'3)
d(x4, x5) ≈ d(x'4, x'5)
对于每一点,它构造了一个概念,其他点是它的“邻居”,试图使所有点具有相同数量的邻居。然后它尝试嵌入它们,以便这些点都具有相同数量的邻居。
正确阅读t-SNE
1、假设我们有两个集群,每个集群包含二维平面上的50个点。每个图具有不同的困惑度(perplexity value)
我们可以看到,随着困惑的增加,我们得到越来越稳定的结构,但是困惑的值应该总是小于总点数,因为当它们变得相等时算法失败。如在最后一个图中,perplexity = 100也等于总点数,因此我们得到了一个意料之外的图形。
2、在下面的图中,将每个图表的perplexity设置为30,观察每个图表的在不同迭代次数下产生的差异。迭代次数(10,20,60,120和1000)。
TSNE是一个不断细化样本间差异的迭代过程。您可以设置要执行的最大迭代次数的限制。对于大型数据集,这可能会加快获得效果所需的时间,但在大多数情况下,您应将此设置保留为默认值1000。
MNIST数据集
MNIST是计算机视觉数据集,其包含手写数字的图像,每个图像高28像素,宽28像素,总共784像素。
现在,我们将使用不同的超参数值在此数据集上执行t-SNE。
perplexity设置为30,n_iter = 1000,只选取1000个数据点
from sklearn.preprocessing import StandardScaler standardized_data = StandardScaler().fit_transform(data) print(standardized_data.shape) from sklearn.manifold import TSNE data_1000 = standardized_data[0:1000,:] labels_1000 = labels[0:1000] model = TSNE(n_components=2, random_state=0) tsne_data = model.fit_transform(data_1000) tsne_data = np.vstack((tsne_data.T, labels_1000)).T tsne_df = pd.DataFrame(data=tsne_data, columns=("Dim_1", "Dim_2", "label")) sn.FacetGrid(tsne_df, hue="label", size=6).map(plt.scatter, 'Dim_1', 'Dim_2').add_legend() plt.show()
2、perplexity设置为50,n_iter = 1000
3.perplexity设置为2,n_iter = 1000
4.这回我们更改perplexity设置为30,n_iter = 5000,考虑获取15000点。
from sklearn.manifold import TSNE data_15000 = standardized_data[0:15000,:] labels_15000 = labels[0:15000] model = TSNE(n_components=2, random_state=0, n_iter=5000) tsne_data = model.fit_transform(data_15000) tsne_data = np.vstack((tsne_data.T, labels_15000)).T tsne_df = pd.DataFrame(data=tsne_data, columns=('Dim_1', 'Dim_2', 'labels')) sn.FacetGrid(tsne_df, hue="labels", size=6).map(plt.scatter,'Dim_1', 'Dim_2').add_legend() plt.show()
正确的图表
perplexity的默认值= 30,n_iter = 1000,学习率= 1000
类sklearn.manifold.TSNE(n_components = 2,perplexity= 30.0,early_exaggeration = 12.0,learning_rate = 200.0,n_iter = 1000,n_iter_without_progress = 300,min_grad_norm = 1E-07,metric= 'euclidean ' ,init= 'random ' ,verbose= 0,random_state =None,method='barnes_hut',angle= 0.5)
结论 -
通过在MNSIT数据集上应用t-SNE,我们可以看到随着迭代次数和困惑度的增加,我们得到了越来越稳定的配置。迭代的次数决于数据集。因此,在得到合适的可视化图形之前,我们必须使用不同的超参数值反复执行t-SNE。