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Ç