降維
1D,2D和3D數據可以可視化。但是在數據科學領域並不總是能夠處理一個小於或等於3維的數據集,我們肯定會遇到使用高維數據的情況。對於數據科學專業人員來說,有必要對工作數據進行可視化和深入了解,以便更好地完成工作,我們可以使用降維技術
降維技術的另一個最受歡迎的用例是在訓練ML模型時降低計算複雜度。通過使用降維技術,數據集的大小已經縮小,與此同時,有關原始數據的信息也已應用於低維數據。因此,機器學習算法從輸入數據集中學習既簡單又省時。
PCA-主成分分析是降維領域最主要的算法。它最初是由皮爾遜(Pearson)在1901年開發的,許多人對此做了即興創作。即使PCA是一種廣泛使用的技術,但它的主要缺點是無法維護數據集的局部結構。為了解決這個問題,t-SNE出現了。
什麼是t-SNE?
t-SNE的主要用途是可視化和探索高維數據。它由Laurens van der Maatens和Geoffrey Hinton在JMLR第九卷(2008年)中開發並出版。t-SNE的主要目標是將多維數據集轉換為低維數據集。相對於其他的降維算法,對於數據可視化而言t-SNE的效果最好。如果我們將t-SNE應用於n維數據,它將智能地將n維數據映射到3d甚至2d數據,並且原始數據的相對相似性非常好。與PCA一樣,t-SNE不是線性降維技術,它遵循非線性,這是它可以捕獲高維數據的複雜流形結構的主要原因。
t-SNE工作原理
首先,它將通過選擇一個隨機數據點並計算與其他數據點(|x —x |)的歐幾裡得距離來創建概率分布。從所選數據點附近的數據點將獲得更多的相似度值,而距離與所選數據點較遠的數據點將獲得較少的相似度值。使用相似度值,它將為每個數據點創建相似度矩陣(S1)。
因為不可能將超過3維的數據集可視化,所以為了舉例的目的,我們假設上面的圖是多維數據的可視化表示。
這裡需要說明的是:相鄰指的是與每個點最接近的點的集合。
由上圖可知,我們可以說X1的鄰域 N(X1)= ,這意味著X2,X3,X4,X5和X6是X1的鄰居。它將在相似度矩陣「 S1」中獲得更高的價值。這是通過計算與其他數據點的歐幾裡得距離來計算的。
另一方面,X20遠離X1。這樣它將在S1中獲得較低的值。
其次,它將根據正態分布將計算出的相似距離轉換為聯合概率。
通過以上的計算,t-SNE將所有數據點隨機排列在所需的較低維度上。
t-SNE將再次對高維數據點和隨機排列的低維數據點進行所有相同的計算。但是在這一步中,它根據t分布分配概率。這就是名稱t-SNE的原因。t-SNE中使用t分布的目的是減少擁擠問題(後面與PCA對比可見)。
但是請記住,對於高維數據,該算法根據正態分布分配概率。
t分布視覺上t分布看起來很像正態分布,但尾部通常更胖,這意味著數據的可變性更高。
對於較低維的數據點,還將創建一個相似度矩陣(S2)。然後該算法將S1與S2進行比較,並通過處理一些複雜的數學運算來使S1與S2之間有所不同。包括使用兩個分布之間的Kullback Leibler散度(KL散度)作為損失函數運行梯度下降算法。使用KL散度通過將兩個分布之間相對於數據點位置的值最小化,幫助t-SNE保留數據的局部結構。
在統計學中,Kullback-Leibler散度是對一個概率分布與另一個概率分布如何不同的度量。梯度下降算法是各種機器學習算法中用於最小化損失函數的一種優化算法。
最後,該算法能夠得到與原始高維數據相對相似度較好的低維數據點。我們可以使用sklearn.manifold.TSNE()實現t-SNE算法
要點
t-SNE算法具有擴展密集簇並縮小稀疏簇的特點。
t-SNE不會保留群集之間的距離。
t-SNE是一種不確定性算法或隨機算法,這就是為什麼每次運行結果都會略有變化的原因。
即使它不能在每次運行中保留方差,也可以使用超參數調整來保留每個類之間的距離。
該算法涉及許多計算和計算。因此,該算法需要大量時間和空間來計算。
困惑度(perplexity)是控制數據點是否適合算法的主要參數。推薦範圍是(5–50)。
困惑度應始終小於數據點的數量。
低困惑度關心本地結構,並關注最接近的數據點。
高度困惑關心全局結構。
t-SNE可以巧妙地處理異常值。
簡單的實現
我們使用kaggle的一個數據集:確定是有毒還是可食用是蘑菇的分類問題https://www.kaggle.com/uciml/mushroom-classification
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
df= pd.read_csv(『Downloads/mushrooms.csv』)
df.head()
X = df.drop(『class』, axis=1)
y = df[『class』]
y = y.map({『p』: 『Posionous』, 『e』: 『Edible』})
cat_cols= X.select_dtypes(include=』object』).columns.tolist()
for col in cat_cols:
print (f」 col name : , N Unique : 」)
for col in cat_cols:
X[col]=X[col].astype(「category」)
X[col]=X[col].cat.codes
X.head()
使用PCA的降維可視化
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
X_std = StandardScaler().fit_transform(X)
X_pca = PCA(n_components=2).fit_transform(X_std)
X_pca = np.vstack((X_pca.T, y)).T
df_pca = pd.DataFrame(X_pca, columns=[『1st_Component』,『2n_Component』, 』class』])
df_pca.head()
plt.figure(figsize=(8, 8))
sns.scatterplot(data=df_pca, hue=』class』, x=』1st_Component』, y=』2nd_Component』)
plt.show()
t-SNE降維可視化
from sklearn.manifold import TSNE
tsne = TSNE(n_components=2)
X_tsne = tsne.fit_transform(X_std)
X_tsne_data = np.vstack((X_tsne.T, y)).T
df_tsne = pd.DataFrame(X_tsne_data, columns=[『Dim1』, 『Dim2』, 『class』])
df_tsne.head()
plt.figure(figsize=(8, 8))
sns.scatterplot(data=df_tsne, hue=』class』, x=』Dim1', y=』Dim2')
plt.show()
PCA vs t-SNE
根據以上分類結果,可以說與PCA的性能相比,t-SNE的表現要好。
t-SNE算法將有毒和可食用蘑菇聚類,沒有任何重疊
PCA無法將蘑菇分類完美。
要知道在哪裡可以得到穩定的形狀,我們應該使用困惑度和n_iter參數。
在困惑度= 30且n_iter = 5000之後,聚簇形狀變得穩定。
總結
與PCA不同,t-SNE可以更好地應用於線性和非線性良好聚類的數據集,並產生更有意義的聚類。儘管t-SNE在可視化分離良好的群集方面非常出色,但大多數情況下它無法保留數據的整體幾何形狀。
作者:Ramakrishnan Thiyagu
deephub翻譯組
原文地址:https://medium.com/swlh/everything-about-t-sne-dde964f0a8c1