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

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…

Hakkında Erkan ŞİRİN

2014'ten beri hem akademik alanda hem de sektörde pratik anlamda büyük veri ve veri bilimi ile ilgili çalışmalar yürütmektedir. Halihazırda İmpektra Bilişim A.Ş.'de büyük veri yöneticisi olarak çalışmakta olup aynı zamanda Gazi Üniversitesi Yönetim Bilişim Sistemleri doktora öğrencisidir. Büyük veri ve veri bilimi ile ilgili birçok kurum ve şirkete eğitimler vermekte ve projeler icra etmektedir. Çalışma alanları: büyük veri platformlarının kurulum ve yönetimi, büyük veri üzerinde makine öğrenmesi, olağan dışılık tespiti, sahtecilik tespiti, veri hazırlama sürecidir.

GÖZ ATMAK İSTEYEBİLİRSİNİZ

GNU/Linux üzerinde Bash Komutları ile Veri Seti Keşfi ve Ön İşleme-1

Merhaba, Bugün sizlerle birlikte Ubuntu GNU/Linux üzerinde Bash komutları ile veri setini inceleme ve bazı …

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir