Categories Machine Learning

Makine Öğrenmesinde Kategorik Verilerin Kodlanması: Doğru Yöntem Seçimi

Press enter or click to view image in full size

Press enter or click to view image in full size

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 LabelEncoder

le = 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.
Press enter or click to view image in full size

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 pd

ohe = 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.
Press enter or click to view image in full size

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.
Press enter or click to view image in full size

Ordinal Encoding

Sıralı kategoriler için uygundur.

from sklearn.preprocessing import OrdinalEncoder
import pandas as pd

df = 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)

Press enter or click to view image in full size

Target Encoding

Her kategori, hedef değişkenin ortalama değeri ile temsil edilir.

import pandas as pd

df = 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. 🚀

You May Also Like