Çok Boyutlu Verilerin t-SNE ile Görselleştirilmesi – 1

Bir müşterinin (yaş, eğitim, cinsiyet, eğitim … ) gibi bir çok özelliği, bir görüntüye ait piksel değerleri ya da bir kelime/dokümana ait TF-IDF, word-embedding değerler onlar, yüzler, binler … boyutlarında olabilir.

Veri üzerinde bir model geliştirmeden önce veriyi tanımak önemli bir aşamadır. Yüzlerce özellik (değişken) içeren bir veri kümesini incelemek;  sayıların yan yana okunmasıyla içinden çıkabileceğimiz bir iş değildir. Yapabileceğimiz tek şey bize muhakeme  etme imkanı sunacak bir görselleştirmedir. Veriyi görselleştirmek için de tek seçeneğimiz onu en fazla 3 boyutta ifade edebilmemizle mümkündür.

Boyut indirgeme konusundaki en güncel ve en iyi çözüm  ödüllü  t-Distributed Stochastic Neighbor Embedding (t-SNE) tekniğidir. Bir diğer alternatif ise Principal Component Analysis(PCA)’dır. Bu örnekte sadece t-SNE kullanılacaktır.

Bu konuda gördüğüm kod örneklerinin hemen hemen tamamında MNIST veri seti kullanılmış. Hem farklılık olsun hem de  sklearn.manifold.TSNE sınıfının temel haliyle kullanımını görelim diye az sayıda kelime ve bu kelimelerin çok az boyutlu önceden eğitilmiş vektör karşılıklarını örnek veri olarak kullanacağım.

4 boyutlu olan bu verileri 2 boyuta indirgeyip grafik üzerinde göreceğiz.

kelimeVec-1.txt dosyasına aşağıdaki satırları yazıp kaydederek örnek veri seti hazırlanmış olur:

Sayısal değerler Türkçe için önceden eğitilmiş FastText vektörlerinden alınmıştır. Örneğin hızlı çalışması ve rahat anlaşılması için normalde 300 boyutlu olan vektörlerin sadece ilk 4 değerleri kullanılmıştır.

      türkiye 0.17971 -0.33787 -0.29897 -0.45949 
      istanbul -0.046406 0.036643 -0.1067 -0.12378 
      ankara -0.026434 0.013544 -0.091341 -0.19564 
      almanya 0.10396 -0.12048 0.027103 -0.4349 
      fransa -0.37203 0.02605 -0.23266 -1.1524 
      paris -0.25637 -0.073173 -0.18539 -0.66266 
      berlin -0.16518 -0.16686 0.10747 0.095184
      münih -0.080603 0.28828 0.46011 -0.22857
      frankfurt 0.10926 0.15596 -0.027719 0.0064991

 

#dosya yolunu belirle

here = os.getcwd()
sample_dir = os.path.join(here, "kelimeVec-1.txt")

 

# kelimeleri y, vektör karşılıklarını da x arraylerine yerleştir

arr_x = [] 
arr_y = [] 

with open(sample_dir, "r", encoding="utf-8") as ins:
    for line in ins:
        values = line.strip().split()
        arr_y.append(values[0])
        arr_x.append(values[1:])
print('%s adet vektör bulundu.' % len(arr_y))

9 adet vektör bulundu.

 

print(arr_x[0], " = ", arr_y[0])

[‘0.17971’, ‘-0.33787’, ‘-0.29897’, ‘-0.45949’] = türkiye

 

from sklearn.manifold import TSNE

# önce bir TSNE modeli nesnesi oluşturulur
model = TSNE(learning_rate = 100)

# bazı önemli default parametler:

# learning_rate=200.0,  10.0 ile 1000.0 arasında
# n_iter = 1000,  en az 250 olmalı 
# min_grad_norm=1e-07,
# metric=’euclidean’,

# fit_transform metoduyla boyut indirgeme modeli eğitilir

transformed = model.fit_transform(arr_x)

 

önemli !!!

fit_transform her çağrıldığında birebir aynı noktaları bulmayacaktır. dolayısıyla çizdireceğimiz X,Y koordinat değerleri de farklı çıkacaktır

 

# indirgenmiş vektörlerin grafik üzerinde gösterilmesi

import matplotlib.pyplot as plt

xs = transformed[:,0]
ys = transformed[:,1]

# semantik benzerleğine göre kelimelere renkler verirsek
# 0: türkiye, istanbul, ankara
# 1: almanya, berlin, münih, frankfurt
# 2: fransa, paris

gruplar = [0, 0, 0, 1, 2, 2, 1, 1, 1]

plt.scatter(xs, ys, c=gruplar)

<matplotlib.collections.PathCollection at 0x7f4ec170cf98>

 

Görüldüğü üzere tıpkı bal kelimesinin arı kelimesine yakın olmasını bekleyeceğimiz gibi fransa-paris kelimeleri (sarı) birbirine yakın çıkmaktadır. Bu örneği 300 boyutlu ve tüm kelimelerle gerçekleştirdiğimiz taktirde çok daha anlamlı sonuçlar alabiliriz.

Kodun tamamını ve veri dosyasını github‘dan alabilirsiniz.

https://github.com/irhallac/deep_learning_examples/tree/master/t-SNE_Example

İyi çalışmalar,

İbrahim R. HALLAÇ