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 pd2from sklearn.preprocessing import LabelEncoder34df = 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_encoded20 kırmızı 231 mavi 042 kırmızı 253 yeşil 164 mavi 07Eş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.
1from sklearn.preprocessing import OrdinalEncoder23df = 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})56target_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 np23categories = 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.
0 yorum