One-Hot Encoding Dışında Kategorik Veri Kodlama Yöntemleri

One-hot encoding her kategorik değişken için yeni sütun oluşturduğu için yüksek boyutlu veri setlerinde sorun yaratır. Daha verimli alternatifler var.

Label Encoding en basit yöntem. Her kategoriyi 0'dan başlayan tam sayıyla eşleştirir. Sıralı ilişki olmayan veriler için uygun değildir çünkü model sayılar arasında matematiksel ilişki görebilir.

1import pandas as pd
2from sklearn.preprocessing import LabelEncoder
3
4df = pd.DataFrame({'renk': ['kırmızı', 'mavi', 'kırmızı', 'yeşil', 'mavi']})
5le = LabelEncoder()
6df['renk_encoded'] = le.fit_transform(df['renk'])
7print(df)
8print(f"Eşleştirme: {dict(zip(le.classes_, le.transform(le.classes_)))}")

Çıktı:

1renk renk_encoded
20 kırmızı 2
31 mavi 0
42 kırmızı 2
53 yeşil 1
64 mavi 0
7Eşleştirme: {'kırmızı': 2, 'mavi': 0, 'yeşil': 1}

Ordinal Encoding, kategorilerin doğal sırası varsa kullanılır. Eğitim seviyesi (lise < üniversite < yüksek lisans) gibi durumlarda ideal.

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1from sklearn.preprocessing import OrdinalEncoder
2
3df = pd.DataFrame({'eğitim': ['lise', 'üniversite', 'lise', 'yüksek_lisans']})
4enc = OrdinalEncoder(categories=[['lise', 'üniversite', 'yüksek_lisans']])
5df['eğitim_encoded'] = enc.fit_transform(df[['eğitim']])
6print(df)

Target Encoding (Mean Encoding), kategorilerin hedef değişkenle ortalama ilişkisini kullanır. Sınıflandırma problemlerinde güçlüdür.

1df = pd.DataFrame({
2'şehir': ['İstanbul', 'Ankara', 'İstanbul', 'İzmir', 'Ankara'],
3'satış': [1, 0, 1, 1, 0]
4})
5
6target_mean = df.groupby('şehir')['satış'].mean()
7df['şehir_target'] = df['şehir'].map(target_mean)
8print(df)

Frequency Encoding, her kategorinin veri setinde kaç kez geçtiğine göre kodlar. Sıklık önemli olduğunda faydalı.

1freq = df['şehir'].value_counts(normalize=True)
2df['şehir_freq'] = df['şehir'].map(freq)
3print(df)

Binary Encoding, kategorileri önce sayıya dönüştürüp sonra ikili (binary) forma çevirir. Çok fazla kategori varsa boyut düşürür.

1import numpy as np
2
3categories = df['şehir'].unique()
4cat_to_num = {cat: i for i, cat in enumerate(categories)}
5df['şehir_num'] = df['şehir'].map(cat_to_num)
6df['şehir_binary'] = df['şehir_num'].apply(lambda x: bin(x)[2:].zfill(2))
7print(df[['şehir', 'şehir_binary']])

Hangi yöntemi seçeceğin verinin yapısına ve modelinin türüne bağlı. Tree tabanlı modeller (XGBoost, Random Forest) label encoding'i iyi tolere eder. Doğrusal modeller için target encoding daha güvenli. Sıralı veriler varsa ordinal kullan, aksi takdirde one-hot encoding'in hafif alternatifi olarak frequency encoding dene.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz