Veri Ön İşleme: Kategorik Verilerin Sayısallaştırılması
Veri, kategorik ve sayısal veriler olarak iki başlık altında incelenmektedir. Örneğin bir kişinin eğitim durumu, medeni durumu, unvanı, rütbesi,bedeni(S,M,L,XL,XXL) ve cinsiyeti gibi bilgiler kategorik veri olarak karşımıza çıkarken yine o kişinin yaşı,boyu,kilosu, günlük/aylık/yıllık alışveriş harcamaları gibi bilgiler ise sayısal değer olarak değerlendirilir.
Kategorik ve sayısal veriler kendi içlerinde ölçek türlerine göre alt gruplara ayrılmaktadırlar.
Nominal ölçek: Sayısal nitelik taşımayan aynı zamanda birbirlerine üstünlüğü bulunmayan sınıflanmış verileri içerir. Örneğin; Cinsiyet,kan grubu,ülke,evet/hayır gibi binary(ikili) tipteki cevaplar…
Ordinal ölçek: Nominal verilerin aksine birbirleri arasında sıralanmış verileri içerir. Örneğin; Unvan, gelir durumu,eğitim durumu, rütbe , hastalık evresi, organizasyon şeması gibi…
Oransal ölçek: Sayısal nitelik oluşturan,ölçümlerin birbirine oranlanabilir değerler içeren ve başlangıç noktasını sıfır kabul eden ölçek türüdür. Örneğin; Boy, kilo, yaş , maaş, hız ,fiyat gibi değerler bu ölçek altında değerlendirilir.
Aralıklı ölçek: Sayısal nitelik taşıyan değerlerdir fakat oran ölçeğindeki gibi veriler kendi aralarında oranlanabilir değildir. Sıfır başlangıç noktası kabul edilmez.Örneğin; Sıcaklık, zeka derecesi, başarı ölçümü, rakım …
Genellikle veri setleri sayısal ve insanların okuyup anlayabileceği kategorik veriler içerirler ancak bazı makine öğrenmesi ,derin öğrenme modelleri kategorik veriler ile başa çıkamadığından dolayı veri ön işleme adımında kategorik nitelikli verileri sayısal forma dönüştürürüz.
Kategorik verilerin sayısal forma dönüştürülmesi için birçok yöntem vardır bu yazımda sizlere en çok kullanılan yöntemlerden Ordinal Encoder , Label Encoder ve OneHotEncoder’ı oluşturacağımız bir veri seti üzerinden anlatacağım..
Veri setimizde Employee ID, Gender, Age, Year of Exprience, Ability Score,Title ve Salary değişkenleri ve 8 gözlem değeri bulunmaktadır.
Ordinal Encoder
Ordinal Encoder veri setimizde bulunan sıralama niteliğine sahip veriler üzerinde kullanılır kısaca yukarıda bahsettiğimiz ordinal ölçek türündeki gözlem değerleri bu yöntem ile sayısallaştırılır.
Örnek veri setimizde Title değişkenine baktığımızda bir insan olarak Junior<Senior<Manager<Director<Ceo sıralamasını görebiliriz lakin bunu makinelerin, algoritmaların anladığı dile çevirmek istersek;
Öncelikle Pandas kütüphanesinde bulunan Categorical() metodunu kullanalım. Bu metodun parametre yapısı sırasıyla;
pd.Categorical(values,categories,ordered)
values: Kategorik veri değerlerini içermelidir.
categories: Katergorik nitelikteki verilerin unique değerlerini içermeli ve ilişki sıralaması burada belirlenir.
ordered: True/False değerleri alabilen bu parametre,herhangi bir değer atanmadığında default’u False olarak davranır. Eğer değerler sıralanmalı ise True değeri atanmalıdır.
Kodun çıktısı:
kodumuzun çıktısını incelediğimizde Title değişkeninde belirttiğimiz gözlem değerlerinin sıralandığını görmekteyiz. Bir sonraki adımımız ise yine Pandas kütüphanesinde bulunan factorize() metoduyla sıralanmış değerleri sayısal değerlere çevirelim.
Kodun çıktısı:
Veri setimizi incelediğimizde Title değişkeninde bulunan kategorik değerler yerini sayısal değerlere bırakmıştır. Bu değerlerin karşılıkları sırasıyla;
0: Junior < 1:Senior <2:Manager < 3:Director < 4:Ceo olarak gösterilmektedir.
Label Encoder
Denetimli öğrenmedeki yapılandırılmış veri kümeleri için önemli bir ön işleme adımı olan Label Encoder, kategorik nitelikteki değerleri sayısal forma dönüştürmeyi ifade etmektedir.
Örneğimize veri setimizde bulunan Gender değişkeniyle devam edersek ; öncelikle iloc[] ile değişkende bulunan Female-Male gözlem birimlerini çekelim.
Kodun çıktısı:
İloc ile Gender değişkenindeki değerleri sayısal forma dönüştürmek için LabelEncoder classını ve bu class’taki fit_transform() metodunu kullanırız.
Kodun çıktısı:
Kodun çıktısını incelediğimizde Label Encoder ile gözlem değerlerimiz ; 0:Female ve 1:Male olarak sayısal forma dönüştürülmüştür. Veri setimize yeni hali aşağıdaki gibidir:
(*) Label Encoder , binary(ikili) kategorik değerler için kullanılımı tercih edilir. İkiden fazla değerlerimiz olsaydı örneğin ülkeleri 0: TR, 1:FR, 2:USA gibi düşünelim modeli eğitirken USA ,FR ve TR’den daha yüksek önceliğe sahip gibi yorumlanabilir fakat ülkeler arasında böyle bir öncelik ilişkisi yoktur. Bu yüzden ikiden fazla gözlem değeri bulunan değişkenlerin One Hot Encoder yöntemiyle çözülmesi önerilir.
One Hot Encoder
OneHotEncoder,label encoder ve diğer encoder yöntemleri gibi kategorik değerleri sayısal forma dönüştürülmesinde rol oynar. Diğer yöntemlerden farklı olarak değişkende bulunan gözlem değerlerinin sayısı kadar 1 ve 0'lardan oluşan yeni çoklu değişkenler üretir.
Öncelikle Gender değişkenini OneHotEncoder ile sayısal formata dönüştürelim.
Kodun çıktısı:
Çıktıyı incelersek Female için ayrı Male için ayrı değişken oluşturdu. Ancak burada dikkat etmemiz gerek bir problemle karşı karşılaya kalmaktayız.
Dummy Variable Trap
Literatürde kukla değişken tuzağı olarak karşımıza çıkan kavram, kategorik nitelikli değerlerin 0–1 ikili sayısal forma dönüştürülürken, bir değişkenin bir başka değişken üzerinden ifade edilmesidir. Kısaca yeni oluşturulan iki değişken aynı ifadeleri içermektedir ve bu durum makinelerin yanılmasına sebep olmaktadır.
genders=pd.get_dummies(Data_Frame,columns=['Gender'],prefix=
['gender'])
genders
Peki bu tuzağa nasıl düşmeyiz ?
Eğer m kategorilerin sayısı ise ;
m-1
Örneğimizde OneHotEncoder ile oluşturduğumuz Female ya da Male değişkenini kaldırarak bu tuzaktan kaçınmış oluruz. Sonuçta kişinin cinsiyeti Female ise 1 , Male ise 0 değeri karşımıza çıkmış olacaktır.