Veri Boyutu Azaltma Yöntemleri (PCA, t-SNE ve UMAP)
Giriş
Boyut azaltma (dimensionality reduction), yüksek boyutlu verilerdeki karmaşıklığı azaltarak veri setinin daha anlaşılır hale gelmesini sağlayan bir tekniktir. Büyük veri kümelerinde işlem yapmak, hesaplama gereksinimlerini ve karmaşıklığı artırarak, işlemlerin sonuçlanma süresini uzatabilir. Bu sorunların üstesinden gelmek, orijinal veri kaybını minimum şekilde tutarak verinin anlaşılır bir şekilde yorumlanabilmesi için özellik çıkarım (feature extraction) metotları kullanılır.
Bu yazıda en çok kullanılan feature extraction metotlarından PCA, t-SNE ve UMAP’den bahsedeceğim.
PCA(Principal Component Analysis)
PCA en çok kullanılan boyut azaltma yöntemlerinden biridir.
6 sample içeren ve 2 boyutlu olarak temsil edilen örnek bir veri üzerinde PCA’ in çalışma mantığını inceleyelim.
Burada Gene1 ve Gene2 iki ayrı özelliği temsil eder. Öncelikle verilerin Gene1 ve Gene2 eksenleri üzerinde orta noktası bulunur (Kırmızı x işaretleri) ve tüm verinin orta noktası belirlenir (Mavi x işareti). Bu merkez noktası orijin noktasının üzerinde olacak şekilde veriler Figür 2' deki gibi kaydırılır.
Orijinden geçen sonsuz adet doğrudan, veri setine en iyi şekilde uyum sağlayanı bulmak gerekir. Bunun için olası doğrular çizilir (Figür 2’ deki kırmızı doğrular bunlardan birkaçı) ve her bir noktanın bu doğrulara olan mesafeleri hesaplanır. Mesafelerin minimize edildiği doğru, veri setine en iyi uyum sağlayan doğru olarak kabul edilir (Figür 3’de kırmızı kesikli PC1 çizgi). PC1 doğrusuna dik ve orijinden geçen başka bir doğru çizilir ve bu doğruyada PC2 doğrusu denir (Figür 3’deki mavi kesikli çizgi)
Nokta şeklinde temsil edilen veriler PC1 ve PC2 eksenine yansıtılır. Verilerin PC1 veya PC2 üzerinde projeksiyonu alınarak, eigenvalue (öz değerler) belirlenir. Eigenvalue varyansın bir ölçüsüdür.
PC1 varyans değerinin 15, PC2 varyans değerinin 5 olduğunu varsayalım. Principal componentler arasındaki total varyans 20 olur. PC1 varyansı tüm principal compenentler içerisindeki varyans yüzdesi 15/20=%75 olur. Bu değer PC1 ekseninin toplam varyasyondan ne kadar sorumlu olduğunu gösterir.
Şimdi PCA algoritması ile basit bir uygulama yapalım.
Iris dataseti 3 farklı çiçek türü ve bunlara ait özellikler içerir. Daha iyi gözlem yapabilmek adına veriyi data frame’e çevirerek ilk 5 öğesini bastıralım.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
# Iris veri setini yükleme
iris = load_iris()
X = iris.data
y = iris.target
#Veriyi data frame'e çevirme
df=pd.DataFrame(X,columns=iris.feature_names)
df.head(5)
#2 boyutta PCA modelini oluştur
pca = PCA(n_components=2)
pca.fit(X)
X_pca = pca.transform(X)
pca.explained_variance_ratio_
sum(pca.explained_variance_ratio_)
Yukarıda head() fonksiyonu ile data frame’i bastırdığımızda X değerinin 4 boyutlu olduğunu gördük(sepal length, sepal width, petal length ve petal width) ve bu değeri PCA fonksiyonu sayesinde 2 boyuta indirdik. Teorik kısımda dimension reduction metodunu uyguladıktan sonra her bir PC ekseninin datanın ne kadarını temsil ettiğini hesaplamıştık. Aynı işlemi “explained_variance_ratio_” fonksiyonu ile uygulama kısmında da görmek istiyoruz. Oluşturduğumuz 2 yeni eksenden birisi datanın varyansını 0.92 olarak gösterirken diğeri 0.05 olarak gösteriyor. Toplam varyans değeri ise 0.97 olarak bulunuyor.
Buradan şu sonucu çıkarabiliriz; PCA ile veri boyutunu 2 bileşene indirgemek, verilerin toplam varyansının yaklaşık % 97.7'sini korumuştur.
plt.figure(figsize=(8, 6))
for i in range(len(np.unique(y))):
plt.scatter(X_pca[y == i, 0], X_pca[y == i, 1], label=iris.target_names[i])
plt.title('PCA with Irıs Dataset')
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.legend()
plt.show()
t-SNE (T-distributed Stochastic Neighbor Embedding)
t-SNE doğrusal olmayan boyut azaltma yöntemidir ve noktaların birbirlerine olan benzerliklerini kullanır. Şimdi t-SNE çalışma mantığını inceleyelim.
2D bir gösterimde 3 farklı sınıfa ait verilerin kümeler şeklinde birbirinden ayrı konumlarda bulunduğunu varsayalım. Bunların dışında sınıfı belirli olmayan bir veri örneğimiz (siyah ile temsil edilmiştir) olduğunu düşünelim.
Bu belirsiz veri noktasının diğer noktalarla arasındaki mesafe ölçülür, mesafeler korunarak veriler normal dağılım grafiği üzerine yerleştirilir ve benzerlik puanı içeren bir matris (S1) oluşturulur.
*High dimensionda(Yüksek boyutta) gösterilen verilerde Normal dağılım kullanılır.
Sonrasında, data random olarak tek boyuta dağıtılır. Her bir veri örneği ile diğer noktalar arasındaki mesafeler ölçülür. Bunu yaparken t-dağılım kullanılır ve benzerlik puanı içeren bir matris (S2) oluşturulur.
* Low dimensionda(Düşük boyutta) gösterilen verilerde t — dağılım kullanılır.
t-dağılım sonucu elde edilen benzerlik matrisi orijinal matristen daha farklıdır. Son aşamada yineleme kullanılarak benzer noktalar birbirine yaklaşarak kümeleşir ve benzer olmayanlar birbirinden uzaklaşır. S1 ve S2 matrisleri kıyaslanır. Yüksek boyutlu uzay ile düşük boyutlu uzaydaki benzerlik matrisleri arasındaki farkı Kullback-Leibler Divergence ile en aza indirmek amaçlanır. Bu da verinin yerel yapısını korumasına yardımcı olur.
*Kullback-Leibler Divergence iki olasılık dağılımı arasındaki farkı ölçer.
İki dağılım da çan şeklinde bir eğriye sahiptir. t dağılım , normal dağılıma göre daha düşük bir tepe noktasına ve daha geniş açılan kuyruklara sahiptir. Kuyruk kısmının bu şekilde olması dağılımdaki büyük sapmalara karşı daha fazla direnç sağladığını gösterir.
Şimdi t-SNE algoritması ile de basit bir uygulama yapalım.
from sklearn.manifold import TSNE
#t-SNE modeli oluşturma
tsne = TSNE(n_components=2)
X_tsne = tsne.fit_transform(X)
print('Old Shape of X: ', X.shape)
#Old Shape of X: (150, 4)
print('New Shape of X: ', X_tsne.shape)
#New Shape of X: (150, 2)
plt.figure(figsize=(8, 6))
for i in range(len(np.unique(y))):
plt.scatter(X_tsne[y == i, 0], X_tsne[y == i, 1], label=iris.target_names[i])
plt.title('t-SNE with Irıs Dataset')
plt.xlabel('Component 1')
plt.ylabel('Component 2')
plt.legend()
plt.show()
UMAP (Uniform Manifold Approximation and Projection for Dimension Reduction)
UMAP veri noktaları arasındaki benzerlik skorunu hesaplayarak düşük boyutlu gösterimde, aynı sınıfa ait noktaların kümelenmesini korumayı hedefler. Öncelikle veri yüksek boyutlu olarak temsil edilir ve her bir veri noktası arasındaki mesafe hesaplanır. Sonra bu mesafeler kullanılarak benzerlik skoru hesaplanacaktır.
Benzerlik skorunu high dimensional gösterimde hesaplayabilmek için 1 veri noktası referans olarak seçilir ve bu nokta temsili doğrumuzun başlangıcına konumlandırılır. Figür 14’de A noktası referans olarak seçilmiştir. Tüm veri noktaları, referans noktasına olan uzaklığına göre doğru üzerine yerleştirilir. Veriler üzerindeki benzerlik puanını hesaplamak için bir eğri çizilir (Figür 14'de yeşil ile gösterilmiştir). Eğrinin y eksenindeki değerler komşuluk ilişkilerine bağlı olarak belirlenir.
Yukarıdaki örnek veri setinde her bir sınıfta 3 veri bulunmaktadır. Bu verilerin y eksenindeki karşılığını bulabilmek adına aşağıdaki formül kullanılır.
log2(num neighborhood) = log2(3)=1.6
Formülden elde edilen 1.6 değeri A noktasının komşularının y eksenine karşılık gelen değerlerinin toplamını ifade eder.
Bu sonuca göre B noktasının değerinin 1.0 , C noktası değerinin 0.6 olduğunu varsayalım. A noktasından oldukça uzakta bulunan D, E ve F noktaları 0 benzerlik puanına sahip olacaktır. Fakat noktalar referans alınarak benzerlik skoru hesaplanmak istendiğinde skorların simetrik olmadığı anlaşılır.
Örneğin C noktasını referans olarak seçseydik, B ve C noktası arasındaki benzerlik skoru 1 olacaktı fakat B noktası referans seçilseydi, B ve C noktası arasındaki benzerlik skoru 0.6 olacaktı. UMAP algoritması ortalama hesaplamaya benzer bir yöntemle bu sorunun üstesinden gelmektedir.
Şimdi verileri low dimensional olarak görselleştirelim. Veri dağılımı 1D olarak gösterilirken (Figür 16' daki gibi ) doğru şekilde konumlanmamıştır. Burada amaç görselleştirme yapılırken aynı sınıfa ait verilerin bir arada bulunmasını sağlamaktır.
Bunu düzeltebilmek için bir veri noktası seçilir ve bu noktanın komşuları arasında benzerlik skoru yüksek olan ikinci bir nokta seçilir.(Benzerlik skorları Figür 15' de hesaplanmıştır). Bu örnekte ilk nokta A , ikinci nokta B olarak seçilmiştir.
A noktasını referans aldığımızda buna en yakın noktanın (benzerlik değeri en yüksek olan) B noktası olduğunu Figür 16'da belirledik. Seçilen nokta çifti skor puanının yüksekliğine göre birbirine yaklaştırılır.
Algoritmanın çalışmaya devam edebilmesi için bu işlem devamlı olarak yapılmalıdır. Bir sonraki adımda E noktasını seçelim. E noktası A ve B noktası ile aynı sınıfta bulunmadığı için doğru üzerinde de uzaklaştırılmalıdır.
1D doğru üzerinde hangi noktanın nereye , ne kadar yaklaştırılması gerektiğini hesaplamak için low dimensional gösterimde benzerlik skoru hesaplanmalıdır. Bu skor t — dağılım benzeri bir yapıyla hesaplanır.
A noktasını dağılım grafiğinin merkezine yerleştirirsek, aynı sınıfta olan B noktasını A noktasına doğru yaklaştırız(Figür 18). Bu şekilde low dimensional skoru maksimize etmeyi hedefleriz.
Benzer şekilde E noktasını dağılım grafiğinin ortasına yerleştirirsek, B noktası E noktasından uzaklaşacaktır. Bu şekilde E ve B noktaları arasındaki low dimensional skor minimize edilir(Figür 19). İşlemler her veri noktası için tekrarlanır ve yapı korunarak, boyut azaltma işlemi geçekleştirilir.
import umap.umap_ as umap
umap_obj = umap.UMAP()
embedding = umap_obj.fit_transform(X)
print('Old Shape of X: ', X.shape)
print('New Shape of X: ', embedding.shape)
#Old Shape of X: (150, 4)
#New Shape of X: (150, 2)
for i in range(len(np.unique(y))):
plt.scatter(embedding[y == i, 0], embedding[y == i, 1], label=iris.target_names[i])
plt.title('UMAP Embedding')
plt.xlabel('UMAP Dimension 1')
plt.ylabel('UMAP Dimension 2')
plt.legend()
plt.show()
PCA , t-SNE ve UMAP Karşılaştırması
t-SNE’de her runda datalar farklı bir konumda 1D olarak konumlanırken, UMAP’de veri noktaları her runda aynı konumda bulunur. t-SNE’ de her bir nokta her iterasyonda hareket ederek en uygun konumu bulmaya çalışır, fakat UMAP’ de mümkün oldukça az nokta kümesi hareket ettirilir. Bu da büyük veri setlerinin iyi ölçeklenmesini sağlar.
t-SNE’nin aksine UMAP’de data 1D şeklinde temsil edilirken random olarak dağıtılmaz. UMAP’de ise Spectral Embedding olarak adlandırılan bir initilaze yöntemi sayesinde başlangıçta veri kümeleri daha iyi bir şekilde temsil edilir.
* Spectral Embedding , verinin yerel yapısını koruyarak noktaları benzerliklerine göre kümelemeye yardımcı olur.
t-SNE verinin yerel yapısını koruma konusunda UMAP’den daha başarılıdır. Buna karşı UMAP ise verinin küresel yapısını korur. PCA ise yalnızca verinin küresel yapısına odaklanır.
*Yerel yapı veri noktaları arasındaki yakın ilişkileri ve komşulukları ifade eder. Küresel yapı ise veri kümesinin genel düzenini ve ilişkilerini anlamak için önemlidir.
Aşağıdaki linkten UMAP parametrelerinin veri üzerindeki değişikliklerini interaktif olarak gözlemleyebilirsiniz.
https://pair-code.github.io/understanding-umap/
Sonuç
Örnek veri setimize 3 farklı veri boyutu azaltma yöntemini uyguladığımızda, en iyi çıktıyı UMAP’dan aldığımızı söyleyebiliriz. PCA ve t-SNE çıktılarında veri sınıfları daha iç içe görünürken, UMAP’ de sınıflar birbirinden daha net bir şekilde ayrılmıştır. Veri kümesinin büyük olduğu senaryolarda bu ayrım daha net görülebilir. Hiçbir boyut azaltma tekniği mükemmel şekilde çalışmaz fakat büyük veri setleri ile çalışmak zorunda kaldığımızda veriyi anlamada ve görselleştirmede bizlere yardımcı olur.