Veri analizi ve makine öğrenmesi projelerinde sayısal verilerle çalışmak çoğu zaman daha kolaydır. Ancak gerçek dünya verilerinde kategorik değişkenler — örneğin şehir isimleri, ürün kategorileri veya renkler — çok sık karşımıza çıkar. Bu verileri doğrudan modellere beslemek mümkün değildir. İşte burada encoder yöntemleri devreye girer.
Bu yazıda Label Encoding, One-Hot Encoding, get_dummies ve diğer encoder çeşitlerini ele alacak, aralarındaki farkları açıklayacak ve hangi durumda hangisinin tercih edilmesi gerektiğini tartışacağız.
Neden Kodlama Yöntemlerine İhtiyaç Duyuyoruz?
Çünkü makine öğrenmesi algoritmaları matematiksel işlemler yapar.
Yani:
- “Mavi, Yeşil, Kırmızı” gibi kategorileri modelin anlayacağı şekilde sayısallaştırmak gerekir.
- Doğru yöntemi seçmezsek model yanlış ilişkiler öğrenebilir.
Örneğin “Kırmızı=0, Yeşil=1, Mavi=2” gibi bir dönüşüm yaparsak model bu renkler arasında sıralı bir ilişki olduğunu düşünebilir. Ancak renklerin kendi içinde bir büyüklük ilişkisi yoktur.
Label Encoding
Nasıl çalışır?
Her kategoriye bir sayı atanır.
from sklearn.preprocessing import LabelEncoderle = LabelEncoder()
df['renk_encoded'] = le.fit_transform(df['renk'])
- Avantajı: Basit, hızlı ve hafıza dostudur.
- Dezavantajı: Kategoriler arasında yapay bir sıralama ilişkisi oluşturur.
- Nerede kullanılır?
- Eğer kategoriler arasında doğal bir sıralama varsa (örn: “Küçük, Orta, Büyük”), Label Encoding uygundur.
- Karar ağaçları ve türevleri (Random Forest, XGBoost) gibi algoritmalar Label Encoding’den olumsuz etkilenmez çünkü sıralamaya doğrudan bağlı değillerdir.
One-Hot Encoding
Nasıl çalışır?
Her kategori için ayrı bir sütun oluşturulur ve 0/1 değerleri atanır.
from sklearn.preprocessing import OneHotEncoder
import pandas as pdohe = OneHotEncoder(sparse=False)
encoded = ohe.fit_transform(df[['renk']])
df_encoded = pd.DataFrame(encoded, columns=ohe.get_feature_names_out(['renk']))
- Avantajı: Kategoriler arasında yapay bir sıralama ilişkisi oluşturmaz.
- Dezavantajı: Kategori sayısı çok olduğunda “boyut patlaması” (curse of dimensionality) yaşanır.
- Nerede kullanılır?
- Az sayıda kategori varsa.
- Lineer modeller (Lojistik Regresyon, Lineer Regresyon) veya derin öğrenme gibi yöntemlerde tercih edilir.
Pandas get_dummies
Python’da en pratik yöntemlerden biridir. One-Hot Encoding’e benzer çalışır.
df = pd.get_dummies(df, columns=['renk'])- Avantajı: Tek satırlık kodla dönüşüm yapılabilir.
- Dezavantajı: Daha büyük projelerde, özellikle model pipeline’larında scikit-learn tabanlı yöntemlere göre daha az esnektir.
- Nerede kullanılır?
- EDA (Keşifsel Veri Analizi) aşamasında hızlıca veri dönüştürmek için.
- Küçük ve orta ölçekli projelerde.
Ordinal Encoding
Sıralı kategoriler için uygundur.
from sklearn.preprocessing import OrdinalEncoder
import pandas as pddf = pd.DataFrame({'eğitim': ['İlkokul', 'Lise', 'Üniversite', 'Lise']})
ordinal_map = [['İlkokul', 'Lise', 'Üniversite']] # doğal sıralama
encoder = OrdinalEncoder(categories=ordinal_map)
df['eğitim_encoded'] = encoder.fit_transform(df[['eğitim']])
print(df)
Frequency / Count Encoding
Her kategori, veri setindeki tekrar sayısıyla temsil edilir.
df = pd.DataFrame({'şehir': ['Ankara', 'İzmir', 'Ankara', 'İstanbul', 'İstanbul', 'İstanbul']})count_map = df['şehir'].value_counts().to_dict()
df['şehir_encoded'] = df['şehir'].map(count_map)
print(df)
Target Encoding
Her kategori, hedef değişkenin ortalama değeri ile temsil edilir.
import pandas as pddf = pd.DataFrame({
'kategori': ['A', 'B', 'A', 'C', 'B', 'A'],
'hedef': [1, 0, 1, 0, 1, 1]
})
target_mean = df.groupby('kategori')['hedef'].mean().to_dict()
df['kategori_encoded'] = df['kategori'].map(target_mean)
print(df)
Senaryo 1: Ürün Bedenleri
Elimizde “Küçük, Orta, Büyük” gibi sıralı kategoriler olsun.
- En uygun yöntem: Ordinal Encoding / Label Encoding
- Çünkü bu kategorilerde gerçekten bir büyüklük sırası var. One-Hot kullanırsak gereksiz sütun üretmiş oluruz.
Senaryo 2: Renkler
Veri setinde ürün rengi var: “Kırmızı, Mavi, Yeşil”.
- En uygun yöntem: One-Hot Encoding / get_dummies
- Çünkü renklerin kendi arasında bir sıralama yok. Eğer Label Encoding yaparsak model “Yeşil > Mavi > Kırmızı” gibi yanlış çıkarımlar yapabilir.
Senaryo 3: Çok Fazla Şehir Bilgisi
Müşteri adresi üzerinden 81 şehirlik bir kategorik değişken düşünelim.
- En uygun yöntem: Frequency Encoding
- Çünkü One-Hot Encoding yaparsak 81 yeni sütun oluşur, bu da modelin performansını düşürür. Frequency Encoding ile şehirleri veri setinde göründükleri sıklığa göre kodlayabiliriz.
Senaryo 4: Kaggle Yarışması — Satış Tahmini
Bir e-ticaret verisinde kategoriler çok fazla ve hedef değişken satış tutarı olsun.
- En uygun yöntem: Target Encoding
- Çünkü her kategoriyi, hedef değişkenin ortalama değeriyle kodlamak, modele ekstra bilgi kazandırabilir. Ama dikkat! Overfitting riskini azaltmak için genelde cross-validation ile beraber kullanılmalıdır.
Son Söz
Kategorik verileri kodlamak, sadece teknik bir dönüşüm değil, aynı zamanda doğru strateji seçimi işidir. Elinizdeki verinin yapısına, algoritmanızın doğasına ve problemin amacına göre encoder seçmek, model performansında ciddi fark yaratabilir.
Unutmayın:
- Az kategori → One-Hot
- Doğal sıralı kategori → Label/Ordinal
- Çok kategori → Frequency / Target
Doğru encoder seçimi modelinizi bir adım öne taşıyacaktır. 🚀
