Site Loader

Merhaba arkadaşlar Feature Engineering Eğitim Serisinde yeni bir yazı ile birlikteyiz. Bu yazıda Cardinality ve High Cardinality konusunu ele  alacağız. Cardinality ve high cardinality nedir? High cardinality sorunları nelerdir? High cardinality problemin nasıl çözüleceğini ve bazı çözüm tekniklerini ele alacağız. Python uygulamaları ile birlikte pekiştirmiş olacağız. Keyifli okumalar.

Cardinality Nedir?

Cartinalty anlatmadan kısaca kategorik değişkenlere değinelim aslında daha önce çok defa kategorik değişkenleri gördünüz. Örneğin cinsiyet değişkeni bir kategorik değişkendir. Bu değişken erkek ve kadın olmak üzere iki etiket(kategori) bulundurur. Başka bir örnek daha verelim örneğin araba markası değişkeni; Ford, Fiat, Toyota vb. etiketler bulundurur. Her kategorik değişkenin kendine özgü etiket sayısı vardır. Cinsiyet değişkeninde iki etiket varken araba markası değişkenin belki yüzlerce etiketi vardır. Bu etiketlerin sayısına cardinalty denir.

Peki cardinalty neden önemli ve neden dikkat edilmesi gereken bir konu? Az önce iki adet örnek değişken verdik bunlardan bir tanesi cinsiyet değişkeni  iki tane etikete sahipken diğeri araba modeli değişkeni yüzden fazla etikete sahiptir. Bu yüzden , fazla etikete sahip değişken ile oluşturduğumuz makine öğrenme modellerin performansını etkiler. O zaman yeni bir başlık atalım.

High Cardinality Nedir?

High cardinalty çok fazla etikete sahip değişkenlerin sahip olduğu duruma denir. Durum dedim çünkü high cardinalty durumu çözülebilir bir durum ve biz bu derste bunu uygulamalarla göreceğiz. Böylelikle oluşturacağımız modellerin performansını da artmış olacak. Çünkü high cardinalty makine öğreneme modelleri için büyük bir problemdir. High cardinalty özellikle zaman serisi verilerinde de sıkça yaşanan bir problemdir.

High Cardinality Sorunları

  • Çok fazla etikete sahip değişkenler, özellikle Ağaç tabanlı algoritmalarda, yalnızca birkaç etikete sahip olanlara hakim olma eğilimindedir.(Rare problemi bunu bir sonraki derslerde detaylıca ele alacağız.)
  • Verisetini eğitim ve test olarak ayırdığımızda eğitim verisetinde bulunan etiketler test verisetinde bulunmayabilir. Veya tam tersi test verisetinde bulunan etiketler -kategoriler- eğitim verisetinde olmayabilir. Bu da model başarısını düşürür.

Veriseti Okuma

O zaman  hemen uygulama kısmına geçelim, eğitim serisini titanic  veriseti üzerinden anlatacağız verisetini indirip takip edebilirsiniz.

Kütüphaneleri ekleyip verisetini ekleyelim.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

data = pd.read_csv("titanic.csv")
data.sample(7)

Hihg Cardinality için Bazı Çözümler

Şimdi bir değişken veya diğer adı ile feature içindeki etiketlere bakalım.

data.name.unique()

name değişkeninde görüldüğü gibi bazı etiketler var. Şimdi bu etiketlerin sayısını bulalım.

print('Name feature etiket sayısı: {}'.format(len(data.name.unique())))
print('Gender feature etiket sayısı: {}'.format(len(data.sex.unique())))
print('Ticket feature etiket sayısı: {}'.format(len(data.ticket.unique())))
print('Cabin feature etiket sayısı: {}'.format(len(data.cabin.unique())))
print('Embarked feature etiket sayısı: {}'.format(len(data.embarked.unique())))

Gender ve Emberkad değişkenleri normal etiket sayısına sahipken Name, Ticket ve Cabin değişkenleri etiket yani kategori sayısı çok fazla yani high cardinalty(yüksek kardinalite) var. Peki bu cardinalty problemini nasıl çözebiliriz?

İlk önce Name feature(değişken) ile başlayalım.

for name in data.name.unique():
    print(name)

Görüldüğü gibi çok fazla kategori bulunmakta ama burada dikkat etmemiz gereken bir nokta var. Name etiketleri bizim model için pek işimize yaramaz iken name etiketi içindeki  title’ları bize kişi hakkında birçok bilgi verir bu yüzden bizde buradan kişilerin title bilgisi için yeni bir feature oluşturmuş olacağız.

data["title"] = [i.split(",")[1].split(" ")[1] for i in data.name]

len(data.title.unique())

18

 

Artık elimizde 1307  kategoriye sahip name feature yerine 18 kategoriye sahip title feature var hemen kategori dağılımına bakalım.

sns.countplot(x='title',data=data)
data['title'].value_counts(normalize=True)*100

Bir de grafiğine bakalım.

Dikkat edecek olursanız 4 tane kategoride fazlayken diğer kategoriler çok az buna Rare Label denir. Bunu başka bir derste detaylı olarak ele alacağız. Biz burada basit çözüm yöntemi yapalım ve az olan etiketleri bir kategori altında toplayalım.

data['title'] = data['title'].replace(['Lady.', 'Countess.','Capt.', 'Col.','Don.', 'Dr.', 'Major.', 'Rev.', 'Sir.', 'Jonkheer.', 'Dona.','the'], 'Rare')
data['title'] = data['title'].replace('Mlle.', 'Miss.')
data['title'] = data['title'].replace('Ms.', 'Miss.')
data['title'] = data['title'].replace('Mme.', 'Mrs.')

Şimdi yeni etiketlerin yani kategorilerin dağılımına bakalım.

data['title'].value_counts(normalize=True)*100

Görüleceği üzere artık biraz daha homojen gibi görünüyor. Dilerseniz grafiğine de bakalım.

Şimdi de Cabin Feture’ne bakalım çünkü Cabin feature içinde 187 tane etiket vardı buda high cardinality var demek. Peki bu feature üzerinde nasıl bir çözüm uygulayacağız. İlk önce etiketleri görelim.

data.cabin.unique()

Burada dikkat ederseniz etiketler bir harfle başlıyor bu harfler kabinlerin bulunduğu güverteyi gösterir bizde burada sadece ilk harfleri yani bulundukları güverteyi alabiliriz. Kabinlerin bulundukları güverteler kişilerin sosyal sınıf statüsünü bize verir. Hemen gerekli işlemi yapalım.

data["cabin_class"] = [i[0] for i in data.cabin]

cabin_class adında yeni bir feature oluşturduk şimdi bu featur’un etiketlerine bakalım.

data.cabin_class.unique()

Çıktı:
array(['B', 'C', 'E', 'D', 'A', '?', 'T', 'F', 'G'], dtype=object)


len(data.cabin_class.unique())

Çıktı:
9

Yeni feature 9 etikete sahip “?” olan etiket eksik veriyi belirtiyor eğer onu çıkarırsak 8 etikete sahip olacaktır.

Burada eksik veri üzerinde durmadığımız için sadece etiketlerin dağılımı görmek için eksik verileri silip yeni dağılıma bakıyoruz.

data['cabin_class'].value_counts(normalize=True)*100

Birde grafiğe bakalım.

sns.countplot(x='cabin_class',data=data,order = data['cabin_class'].value_counts().index)

pythonearth.com da bu yazıda Cardinality ve High Cardinality Nedir? High Cardinality sorunları nelerdir? High Cardinality problemi nasıl çözülür ve bazı çözüm tekniklerini Python pandas kütüphanesi ile ele aldık.Lütfen eksik veya yanlışlarımız için iletişime geçiniz. Bir sonraki derste görüşmek dileği ile.Bana Buradan ulaşabilirsiniz.

Post Author: Python Earth

Bir cevap yazın

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