Tensorflow Feature Columns

Onuryilmaz
Google Developer Student Clubs
5 min readMar 8, 2021

Tahmin modellerimizi oluştururken eğitim için modellerimizi verilerle beslememiz gerekir. Ancak çoğunlukla ham verileri olduğu gibi modelimize veremeyiz. Veri kümemizi modelimizin anlayabileceği biçime getirmemiz gerekmektedir. İşte bu işler için Feature Columns kullanabiliyoruz. Özetlemek gerekirse Feature Columns ham verilerimiz ile modellerimiz arasındaki bir köprüdür diyebiliriz. Bu yazımızda da uygulamalı olarak nasıl kullanabileceğimizi göreceğiz.

Import Libraries and Data

Kullanacağımız veri setini yükledik. Eğer veri setini incelerseniz sayısal ve kategorik olmak üzere çeşitli özellikler olduğunu görebilirsiniz. Daha sonradan ise veri kümemizi train,test ve validation olarak parçaladık.

Sırada verilerimizi daha kullanışlı hale getirmek için Input Pipeline oluşturmak var. Bunun içinde Tensorflow.data kullanacağız.

Oluşturduğumuz fonksiyon ile yaptığımız işlemleri kısaca açıklayalım. İlk önce veri kümemizde bulunan target kolonunu (labellarımız) dataframe içinden sildik. Daha sonra tf.data.Dataset.from_tensor_slices kullanarak veri setimizi feature ve label (x,y) şeklinde ayırdık. Ve son kısımda ise verilerimizi karıştırarak return ettik. Burada dikkat etmemiz gereken nokta validation ve test setlerinde shuffle False vermemiz. Bunun sebebi onları modelimizi test ederken kullanacağımız için bir karıştırma işlemine gerek duymuyoruz.

Özellik Sütunlarımızın (Feature Column) çıktısını görebilmek için bir tane daha fonksiyon tanımlayalım.

Bu fonksiyonu çağırdığımızda göreceğimiz özellik sütunlarının çıktıları bizim modellerimiz için girdiler olacaklardır. Öyleyse Özellik sütunlarını incelemeye ve bunları nasıl kullanılabilecek formata getirebileceğimize bakmaya başlayalım.

1 ) Numeric columns

Sayısal Sütunlar (Numeric Columns) kullanımı en kolay olan sütun türüdür. Gerçek değerleri tutmak için kullanılırlar. Modelimiz bu değerleri direkt alabileceğinde üstünde bir değişiklik yapmamaktadır. Yapmamız gereken işlem bu sütunun Numeric olduğunu belirtebilmek için tf.feature_column.numeric_column kullanmaktır.

Gördüğümüz üzere age özelliğimizin bulunduğu sütun Numeric Column olarak kullanılmaktadır. Key parametresi olarak belirlenen değer giriş özelliğini tanımlayan benzersiz bir değerdir. shape olarak gözüken kısmı açıklamak gerekirse bizim age değerimiz skaler bir değerdir yani bunu bir vektör olarak düşünürsek 1 eksenlidir. Bu kısımda bunun sonucu görmekteyiz.

2 ) Bucketized columns

Bazen modellerimizi eğitirken sayısal değerleri direkt olarak modelimize vermek istemeyiz. Bunun yerine değerlerimizi belirli aralıklara parçalayıp kategorize edebiliriz. Örneğin yaş değerlerinin bulunduğu Sütunu belirli değerlere göre gruplandırabiliriz. Bunu yapmak istediğimizde Bucketized columns yapısını kullanmamız gerekmektedir.

tf.feature_column.bucketized_column fonksiyonunu kullanarak sayısal değerlerimizi farklı aralıklara bölmüş olduk. Bu fonksiyona 2 adet parametre yolladık. Bunun birincisi hangi değerler üzerinde bir gruplandırma yapacaksak onu veriyoruz. İkinci olarak (boundaries) hangi aralıklardan bölünmesini istiyorsak bu değerleri veriyoruz. Bunun sonucunda 11 aralıktan oluşan bir yapı oluşturmuş olduk. Bundan böyle age değerleri 11 değerden oluşan ve sadece kendi aralığına denk gelen index değeri 1 diğerleri 0 olan bir array ile temsil edilecektir.

3)Categorical columns

Gerçek hayattaki problemler uğraşırken karşımıza her zaman sayısal değerler çıkmayacaktır. Çoğu zaman string dizeleriyle de çalışma yapmamız gerekecektir. Ancak bu dizeleri modelimize doğrudan veremeyiz. İlk önce bunları sayısal değerler ile eşleştirmeliyiz . İşte Kategorik kelime sütunları bizim bunu yapmamızı sağlıyor. Bunu yaparken tf.feature_column.categorical_column_with_vocabulary_list kullanacağız. Bu verdiğimiz liste değerlerini bizim için sayısal değerlere döndürecektir. Ancak bir liste olarak değilde bir dosyadan okuma yapmak istiyorsanız categorical_column_with_vocabulary_fil kullanabilirsiniz.

Yukarıda gördüğümüz thal sütunu kelimelerden oluşmuş değerleri tutmaktadır. Biz bu değerleri Sayısal değerlere dönüştürmek istediğimiz için 1. satırdaki fonksiyonumuzu kullanıyoruz. İlk parametre olarak (key) hangi sütun üzerinde değişiklik yapacaksak onu veriyoruz. İkinci olarak ise bu sütunda bulunan kelime listelerini veriyoruz. 4.satırda gördüğümüz indicator_column ise sütundaki değerimizi multi-hot dediğimiz yapıya çevirmek için kullanıyor. Biraz daha açıklamak gerekirse verimizin gerçek değerinin bulunduğu indexin 1 diğerlerinin sıfır olduğu bir biçime çeviriyor.

4) Embedding columns

Yukarıdaki yapıda elimizde olası bir kaç değer olduğu için kategorik sütun yolunu tercih etmiştik. Ancak elimizdeki olası değerlerin sayısı çok daha fazla olduğunda o yöntemi kullanarak modelimizi eğitmek çok zor duruma gelmektedir. İşte bu sorunu yaşamamak için Embedding columns yapısını kullanabiliriz. Bu fonksiyon bizim hücrelerimizi sadece 0 ve 1 lerden oluşan değil, herhangi bir sayının olabileceği daha düşük boyutlu bir vektör halini getirerek temsil eder. Her bir hücre için ayrı bir sayı bulunacağından indicator column yapısına göre daha az hücre içerir. Bunu bir görsel ile göstermek gerekirse :

Görüleceği üzere dimensionlar arasında çok büyük farklar bulunmaktadır. Şimdi bunu kod üzerinde görelim.

Embedding_column kullanarak işlemimizi gerçekleştirdik. Bunu yaparken üzerinde çalışacağımız sütunu ve oluşacak olan vektörün dimension değerini vermemiz yeterli oldu. Sonuç olarak her değeri temsil eden rastgele değerlerden oluşan vektörlerimiz oluşmuş oldu.

5) Hashed Feature Columns

Kategori sayısının fazla olduğu durumlarda her kelime veya tam sayı için kategorik bir değere sahip olmak mümkün olmayabilir. Bu durumlarda kullanabileceğimiz bir diğer yöntem ise Hashed Feature Columns ‘ dur. Bunu şu şekilde düşünebiliriz. ‘ Acaba benim kaç tane kategorik değere ihtiyacım var ki hücrelerimi biçimlendirebileyim”. İşte bu noktada bu fonksiyonu kullanacağız.

Yukarıda bahsettiğimiz durumu fonksiyon üzerinde nasıl uyguladığımızı inceleyelim. İlk önce her zaman ki gibi hangi değerlerimizi kategorik hale getirmek istiyorsak onu veriyoruz. Daha sonra ise istediğimiz kategorik değer sayısını hash_bucket_size parametresi ile fonksiyonumuza veriyoruz. Bu şekilde kelimelerimizi aynı şekilde kategorik hale getirmiş oluyoruz.

6) Crossed Feature Columns

Bahsedeceğimiz Son Feature Columns ise çaprazlama olarak nitelendirebileceğimiz yöntemdir. Bu özellik ile birden çok girdi özelliklerini kombinasyonlarını kullanarak tek bir özellik olarak kullanabiliriz. Bu şekilde modelimiz farklı ağırlıklarıda güzel şekilde öğrenebilecektir. Burada dikkat etmemiz gereken nokta ise özellikleri birleştirirken tüm olası kombinasyonları almak çok büyük işlem yüküne sebep olabilir. Bu yüzden hashed_column ile istediğimiz tablo büyüklüğünü seçebiliriz.

Yukarıda açıkladığımız yöntemleri kullanarak özelliklerinizi modelinize verebilecek formata getirebilirsiniz. Bundan sonra yapmanız gereken şey modelinizi oluşturup buradaki özellikler ile onu beslemektir.

Kaynakça (Sources):

1- https://www.tensorflow.org/api_docs/python/tf/feature_column

Model oluşturmak için bakabileceğiniz kaynak :

https://keras.io/api/models/model/

--

--

Onuryilmaz
Google Developer Student Clubs

Istanbul University- Industrial engineering / Computer Engineering / Junior Software Engineer @LcWaikiki