Veri Ön İşleme-2: Kategorik Nitelikleri Dönüştürmek, Gölge Değişkenler Oluşturmak (Python & R)

Makine rakamları sever. Aşağıdaki veri setinde toplam dört nitelik ve 10 kayıt bulunmaktadır. Niteliklerden Age ve Salary nümerik; Country ve Purchased kategoriktir. Bu yazımızda kategorik nitelikleri nasıl nümerik hale getireceğimizi uygulamalı olarak göreceğiz. Veri setini indirip X ve y değişkenlerini oluşturmayı bir önceki yazıya havale ediyorum.

Country Age Salary Purchased
1 Spain 27.0 48000.0 Yes
6 Spain NaN 52000.0 No
2 Germany 30.0 54000.0 No
5 France 35.0 58000.0 Yes
3 Spain 38.0 61000.0 No
9 France 37.0 67000.0 Yes
0 France 44.0 72000.0 No
7 France 48.0 79000.0 Yes
8 Germany 50.0 83000.0 No
4 Germany 40.0 NaN Yes

Python ile Uygulama

Pyton ile işe başlıyoruz. Gerekli kütüphaneleri indirelim:

sklearn preprocessing kütüphanesinden kullanacağımız ilk sınıf LabelEncoder olacak. Bu sınıf kategorik niteliklerin her birine 0 ile n arasında ayrı bir rakam ataması yapar. Şimdi sınıf nesnemizi yaratalım ve işe koyulalım:

labelencoder_X = LabelEncoder()

Nesneyi oluşturduktan sonra nesnemizin fit_transform() metoduyla Country niteliğimizi dönüştürelim ve X nitelikler matrisinin Country sütunu indeksi olan X[:,0] ‘a atayalım:

X[:,0] = labelencoder_X.fit_transform(X[:,0])

Şimdi X değişkenimizi bir yazdıralım ve bakalım 0 indeksli sütun ülke isimlerinden rakamlara dönmüş mü?

X
array([[0, 44.0, 72000.0],
[2, 27.0, 48000.0],
[1, 30.0, 54000.0],
[2, 38.0, 61000.0],
[1, 40.0, 63777.77777777778],
[0, 35.0, 58000.0],
[2, 38.77777777777778, 52000.0],
[0, 48.0, 79000.0],
[1, 50.0, 83000.0],
[0, 37.0, 67000.0]], dtype=object)

Kırmızı renkli sütunda ülke isimleri yerine 0 ile 2 arasında kodlanmış rakamlar görüyoruz. Şimdi nümerik niteliği biraz daha işlem yapılabilir bir hale çevirdik. Yalnız burada bir sorun var. Şimdi biz 0’ı France, 1’i Germany ve 2’yi Spain ile eşleştirdik, daha doğrusu biz değil LabelEncoder sınıfının fit_transform() metodu işledi bu cinayeti. Bu eşleşme sonunda 1 ve 2 arasında bir astlık üstlük ilişkisi var gibi ancak gerçekte Germany ile Spain arasında böyle bir ilişki yok. Eğer kategorik değişken sıralı olsaydı, örneğin ilk-orta-lise-üniversite gibi o zaman küçük rakamlar eğitim durumu düşük olana büyük rakamlar da yüksek olana eşleştirilirdi. Ancak burada kategorik niteliğin değerleri arasında artma/azalma, büyüklük/küçüklük gibi bir sıralama söz konusu değil. Bu sorun bir nebze gölde değişkenlerle (dummy variables) ile çözülmeye çalışılıyor. Bu nasıl oluyor. Kategorik niteliğin sahip olduğu her farklı değer için ayrı bir sütun oluşturuluyor. Her satırda bu nitelik hangi değeri almışsa o değerin bulunduğu sütuna 1 değeri diğerlerine 0 değeri atanıyor. Böylelikle kategoriler arasındaki sırasızlık korunmuş oluyor. Şimdi yukarıda sıktığımız hikayeyi kodlarla somutlaştıralım.

Gölge değişkenler yaratmak için sklearn.preprocessing kütüphanesinin OneHotEncoder sınıfını kullanıyoruz.

onehotencoder = OneHotEncoder(categorical_features=[0])

Sınıf yapıcısına (constructer) categorical_features adında bir parametre gönderdik o da Country sütununu temsil eden [0] indeksi. Sınıf nesnemizi oluşturduk.

X = onehotencoder.fit_transform(X).toarray()

Yukarıdaki kodda X nitelikler matrisimizi gölge değişkenler eklenmiş olarak güncelledik. Bu sefer Spyder’ın ara yüzünden bakıyorum, çünkü komut satırına X yazdığımda algı güçlüğü yaratacak bir biçim çıkıyor.

Yukarıdaki ekran görüntüsünde gölge değişkenlerin eklenmiş şekilde X nitelikler matrisini tablo halinde görüyoruz. Benzer işlemleri diğer kategorik niteliğimiz olan Purchased için yapalım. Purchased aynı zamanda hedef niteliğimiz ve y ile adlandırmıştık. y hedef nitelik için de ayrı bir LabelEncoder nesnesi yaratalım:

labelencoder_y = LabelEncoder()

y niteliğini kodlanmış şekliyle güncelleyelim:

y = labelencoder_X.fit_transform(y)

Spyder’dan hem X (solda) hem y (sağda)’yi tablo halinde görelim:

Kategorik Değişkenleri R Dilinde Kodlamak

Şimdi aynı işlemleri R dilinde de yapalım. R-Studio’yu açıyorum ve kodluyorum: (setwd()) ile çalışma dizninizi ayarlamayı unutmayın 🙂

Country sütunundan başlayalım:

dataset\$Country = factor(dataset\$Country,
                         levels = c('France','Germany','Spain'),
                         labels = c(0, 1, 2))

Yukarıda basit bir işlem yaptık. Python’da metod tarafından yapılanları biz yukarıda elle yaptık. levels ve labels adında iki vektör yarakttık, bunları birbiriyle eşleştirdik ve Country sütununda ülke isimleri yerine nümerik vektördeki değerleri atadık. Aynısını Purchased sütunu için de yapalım:

dataset\$Purchased = factor(dataset\$Purchased,
                           levels = c('No','Yes'),
                           labels = c(0, 1))

Sonucu R tablosunda görelim.

İtiraf ediyorum bu yazıda R daha iyiydi 🙂 Veriyle kalın…

Yazar Hakkında
Toplam 174 yazı
Erkan ŞİRİN
Erkan ŞİRİN
10 yılı aşkın süredir yurtiçi ve yurtdışında sektörde büyük veri mühendisliği, platform yönetimi ve makine öğrenmesi ile ilgili çalışmalar yürütmekte ve aynı zamanda birçok kurum ve şirkete danışmanlık ve eğitimler vermektedir. Çalışma alanları: Data ve MLOps platformları, gerçek zamanlı veri işleme, değişen veriyi yakalama (CDC) ve Lakehouse.
Yorumlar (2 yorum)
Seda ÇAĞLAR
Seda ÇAĞLAR Yanıtla
- 09:50

Merhaba, kategorik verilerde NaN değerleri nasıl doldurabiliriz?

    Erkan ŞİRİN
    Erkan ŞİRİN Yanıtla
    - 14:42

    Selam manuel olarak yapabileceğiniz gibi sklearn Imputer da kullanabilirsiniz. Küçük bir örnek:
    from sklearn.impute import SimpleImputer
    imputer_yas = SimpleImputer(strategy=’mean’)
    df[‘yas’] = imputer_yas.fit_transform(df[‘yas’].values.reshape(-1,1))

    Yukarıdaki kodlar yas sütunundaki boşlukları ortalama ile dolduracaktır.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

×

Bir Şeyler Ara