Data, Encoding

Kategori: Machine Learning , 23 Kasım 2019 , JanFranco


Bir önceki yazımızda eksik verileri doldurmayı görmüştük. Aynı veriseti üzerinden devam edeceğiz. İlk olarak veri tiplerinden bahsedelim. Veriler Categorical ve Numeric olmak üzere ikiye ayrılır. Adı üzerinde kategorik değerler ve sayısal değerler. Kategorik değerler kendi içinde Nominal ve Ordinal olarak ikiye ayrılır. Nominal değerler sıralanamayan kategorik değerlerdir. Örneğin araba markaları örnek verilebilir. Honda, Ford, Renualt... Kategorik değerlerdir ancak Honda > Ford gibi bir şey söyleyemeyiz. Ayrıca Honda, Ford şeklinde bir sıralama da yapamayız. Ordinal değerler ise kategorik ancak sıralanabilir değerlerdir. Örneğin il kodları. 34, 35, 36 şeklinde sıralayabiliriz. Numeric yani sayısal değerler de kendi içlerinde Ratio ve Interval olarak ikiye ayrılır. Interval, aralıklı değerlerdir. Veriler arasında bir oran yoktur ancak bir aralık vardır. Örneğin Celcius cinsinden sıcaklık değerleri. 40 derece sıcalık 20 derece sıcaklıktan iki kat daha sıcaktır tarzı bir şey söylemeyiz. Ratio ise oransal değerlerdir. Yaş örnek verilebilir. 40 yaşında bir insan, 20 yaşındaki bir insandan iki daha fazla yaşamıştır diyebiliriz. Bunları bilmemiz önemli çünkü encoding kavramına giriş yapacağız. Machine learning veya deep learning algoritmalarının büyük bir çoğunluğu kategorik değerler üzerinde çalışamaz. Sayısal değerleri kabul ederler. Bu yazımızda kategorik değerleri sayısal değerlere çevirmeyi göreceğiz. veriler.csv dosyasında 3 ülke mevcuttu. Bu 3 değer de kategorik bir değerdir. Bu değerleri sayısal değere 2 farklı yolla çevirebiliriz. LabelEncoding ile TR - 0, FR - 1, US - 2 şeklinde bir dönüşüm yapabiliriz. İlk olarak sklearn kütüphanesindeki encoding methodlarını import edelim:


from sklearn.preprocessing import LabelEncoder, OneHotEncoder
LabelEncoder ve OneHotEncoder sınıflarından iki obje oluşturalım. OneHotEncoding kavramını açıklayacağız:


le = LabelEncoder()
ohe = OneHotEncoder()
Ülkeleri LabelEncoder ile sayısal değerlere dönüştürelim:


country = df.iloc[:, 0:1].values
country[:, 0] = le.fit_transform(country[:, 0])
print(country)
print("****************")

>>

[[1]
 [1]
 [1]
 [1]
 [1]
 [1]
 [1]
 [1]
 [1]
 [2]
 [2]
 [2]
 [2]
 [2]
 [2]
 [0]
 [0]
 [0]
 [0]
 [0]
 [0]
 [0]]
****************
Görüldüğü gibi sayısal değerlere dönüştürdük. Genellikle ordinal değerler için LabelEncoder kulllanırız. Ancak aralarında bir sıralama ilişkisi kuramadığımız veriler için Nominal değerler için OneHotEncoderı kullanırız. OneHotEncoding yönteminde, kaç farklı değer var ise o kadar sütun oluşturulur. Örneğin 3 değerimiz var TR, FR ve US. Bu 3 değer için 3 sütun oluşturulur. Eğer ülke TR ise 1 0 0 şeklinde bir veri oluşur. FR ise 0 1 0, US ise 0 0 1. Görelim:


country = ohe.fit_transform(country).toarray()
print(country)
print("****************")

>>

[[0. 1. 0.]
 [0. 1. 0.]
 [0. 1. 0.]
 [0. 1. 0.]
 [0. 1. 0.]
 [0. 1. 0.]
 [0. 1. 0.]
 [0. 1. 0.]
 [0. 1. 0.]
 [0. 0. 1.]
 [0. 0. 1.]
 [0. 0. 1.]
 [0. 0. 1.]
 [0. 0. 1.]
 [0. 0. 1.]
 [1. 0. 0.]
 [1. 0. 0.]
 [1. 0. 0.]
 [1. 0. 0.]
 [1. 0. 0.]
 [1. 0. 0.]
 [1. 0. 0.]]
****************
Normalde OneHotEncoding uygulayabilmek için ilk olarak LabelEncoding uygulanılması gerekir. Ancak yeni sklearn sürümlerinde bu ortadan kalktı. Yeni versiyonlarda direk olarak OneHotEncoding yapılabiliyor. Burada iki yöntemi de göstermek için yaptık.


Sonraki Yazı: Normalization, Standardization, train_test_split
Yorumlar

Henüz bir yorum bulunmuyor.