One-Hot Encoding (Tek-Sıcak Kodlama)

Kategorik değişkenleri, her kategori için yalnızca bir bitin '1', geri kalanların '0' olduğu ikili vektörlere dönüştüren veri ön işleme yöntemidir.

One-hot encoding (tek-sıcak kodlama), kategorik verileri makine öğrenmesi modellerinin işleyebileceği sayısal biçime çeviren temel bir veri ön işleme tekniğidir. Makine öğrenmesi algoritmaları matematiksel işlemler yaptığından, 'kırmızı', 'mavi' veya 'İstanbul' gibi metin tabanlı kategorik değerleri doğrudan kullanamaz. One-hot encoding bu sorunu çözmek için her kategoriye özgü bir ikili (binary) vektör oluşturur. Yöntemin çalışma mantığı şöyledir: N farklı kategoriden oluşan bir değişken için N boyutlu bir vektör uzayı tanımlanır. Her kategori, yalnızca kendi konumundaki bitin '1', diğer tüm bitlerin '0' olduğu benzersiz bir vektörle temsil edilir. Örneğin üç renkten oluşan bir 'renk' değişkeni için: kırmızı → [1, 0, 0], mavi → [0, 1, 0], yeşil → [0, 0, 1]. Bu kodlama biçimi, modelin kategoriler arasında yanlış bir sıralama veya büyüklük ilişkisi kurmasını engeller. Label encoding gibi alternatif yöntemler kategorilere 0, 1, 2... gibi tam sayılar atar; ancak bu yaklaşım modelin 'mavi > kırmızı' gibi anlamsız sıralama çıkarımları yapmasına yol açabilir. One-hot encoding, kategoriler arasında herhangi bir sıralama olmadığını garantiler; çünkü her vektör Öklid uzayında diğerlerine eşit uzaklıktadır. Temel dezavantajı, yüksek kardinaliteli (çok sayıda benzersiz değer içeren) değişkenlerde boyut patlamasına (curse of dimensionality / boyut laneti) yol açmasıdır. Binlerce şehir veya ürün kategorisi içeren bir değişken, binlerce yeni sütun oluşturur. Bu durum hem bellek tüketimini hem de eğitim süresini önemli ölçüde artırır. Bu tür senaryolarda hedef kodlama (target encoding), frekans kodlama veya öğrenilebilir gömme (embedding) katmanları daha uygun alternatifler sunar. One-hot encoding; lojistik regresyon, destek vektör makineleri ve yapay sinir ağları gibi modellerde kategorik özellikleri işlemek için yaygın biçimde kullanılır. scikit-learn'ün OneHotEncoder sınıfı ve pandas'ın get_dummies() fonksiyonu bu dönüşümü birkaç satır kodla gerçekleştirmeyi mümkün kılar. Düşük kardinaliteli, nominal (sırasız) kategorik değişkenlerde tercih edilen bu yöntem, veri ön işleme pipeline'larının vazgeçilmez bir parçasıdır.

Neden One-Hot Encoding Gerekir?

  • check_circle Makine öğrenmesi modelleri, ağırlıklar ve gradyanlar gibi matematiksel kavramlarla çalışır. Bu nedenle girdi verilerinin tamamen sayısal olması gerekir. 'Kedi', 'köpek' veya 'kuş' gibi metin tabanlı değerlerin doğrudan bir denklemde kullanılması mümkün değildir.
  • check_circle Kategorik verileri sayıya çevirmenin en basit yolu label encoding'dir: her kategoriye bir tam sayı atanır. Ancak bu yöntem, modelin kategoriler arasında bir sıra ya da büyüklük ilişkisi varmış gibi davranmasına neden olur. Örneğin 'kırmızı=0, mavi=1, yeşil=2' kodlaması modele 'yeşil, kırmızıdan iki kat büyüktür' gibi yanlış bir sinyal verir.
  • check_circle One-hot encoding bu yanıltıcı sıralamayı ortadan kaldırır. Her kategoriyi eşit uzaklıktaki ayrı bir vektörle temsil ederek modelin veriden bağımsız bir hiyerarşi öğrenmesinin önüne geçer. Bu özellik özellikle nominal (doğal bir sırası olmayan) kategorik değişkenlerde kritik önem taşır.

Çalışma Mekanizması

  • check_circle One-hot encoding işlemi şu adımlarla gerçekleşir: Önce değişkendeki tüm benzersiz kategoriler belirlenir ve her birine bir indeks atanır. Ardından orijinal değişken, bu benzersiz kategori sayısı kadar yeni ikili sütuna bölünür.
  • check_circle Her gözlem için, ilgili kategoriye karşılık gelen sütun '1', diğer tüm sütunlar '0' değerini alır. Bu sayede vektörde her zaman tam olarak bir tane '1' bulunur — yöntemin adı da ('tek-sıcak') buradan gelir.
  • check_circle Örnek olarak 'şehir' adında bir değişken düşünelim: Ankara, İstanbul, İzmir. One-hot encoding sonucunda üç yeni sütun oluşur. Ankara için [1,0,0], İstanbul için [0,1,0], İzmir için [0,0,1] vektörleri üretilir. Orijinal 'şehir' sütunu bu üç sütunla değiştirilir.
  • check_circle Pandas'ta bu işlem pd.get_dummies(df['şehir']) veya scikit-learn'de OneHotEncoder().fit_transform(X) ile yapılır. scikit-learn'ün versiyonu, eğitim setinde görmediği kategorileri test setinde de yönetme esnekliği sunduğundan üretim pipeline'larında tercih edilir.

Avantajları

  • check_circle En büyük avantajı, kategoriler arasında yapay bir sıralama ilişkisi yaratmamasıdır. Lojistik regresyon, SVM ve yapay sinir ağları gibi modeller bu kodlamayla kategorik verileri doğru biçimde yorumlayabilir.
  • check_circle İkili vektörler matematiksel olarak şeffaftır. Hangi kategorinin hangi boyuta karşılık geldiği açıkça bilinir; bu durum model yorumlanabilirliğini kolaylaştırır. Katsayı analizi veya özellik önem sıralaması yapıldığında her kategori ayrı ayrı değerlendirilebilir.
  • check_circle Seyrek veri yapısıyla iyi çalışır. Büyük veri kümelerinde one-hot matrisler çoğunlukla seyrek (sparse) biçimde saklanır; scipy.sparse gibi kütüphaneler bu matrisleri bellek açısından verimli yönetir. Bu sayede yüzlerce kategoride dahi hesaplama maliyeti yönetilebilir kalır.

Dezavantajları ve Sınırlamalar

  • check_circle Yüksek kardinaliteli değişkenlerde boyut patlaması ciddi bir sorun oluşturur. Örneğin 10.000 benzersiz ürün kodu içeren bir değişken, 10.000 yeni sütun üretir. Bu durum modelin eğitim süresini uzatır ve aşırı öğrenme (overfitting) riskini artırır.
  • check_circle Doğrusal bağımlılık (multicollinearity) problemi de göz önünde bulundurulmalıdır. N kategoriden oluşan bir değişkende, herhangi N-1 sütun bilindiğinde N'inci sütun otomatik olarak belirlenir. Lojistik regresyon gibi modellerde bu 'kukla değişken tuzağı'nı önlemek için drop='first' parametresiyle bir sütun atılır.
  • check_circle One-hot encoding, kategoriler arasındaki anlamsal benzerliği yakalayamaz. 'Paris' ve 'Fransa'nın coğrafi veya kültürel açıdan ilişkili olduğunu bu temsil biçimi ifade edemez. Bu tür ilişkileri yakalamak için word embedding veya entity embedding gibi yöntemler gerekir.
  • check_circle Nadir görülen kategoriler ve yeni kategoriler de sorun yaratır. Eğitim setinde hiç görülmemiş bir kategori test setinde ortaya çıktığında encoder bu değeri bilmez. scikit-learn'ün handle_unknown='ignore' seçeneği bu durumu yöneterek bilinmeyen kategoriler için sıfır vektörü atar.

Alternatif Yöntemlerle Karşılaştırma

  • check_circle Label encoding, her kategoriye bir tam sayı atar (0, 1, 2...). Ordinal (doğal sırası olan) kategorik değişkenler için — örneğin 'düşük, orta, yüksek' eğitim düzeyi — uygun bir seçimdir. Ancak nominal kategorilerde yapay sıralama yarattığından genellikle tercih edilmez.
  • check_circle Ordinal encoding, kullanıcının belirlediği bir sıraya göre kategorilere tam sayı atar. Label encoding'den farkı sıralamanın veri tarafından değil kullanıcı tarafından tanımlanmasıdır. 'Küçük < Orta < Büyük' gibi gerçek bir sırası olan değişkenler için idealdir.
  • check_circle Hedef kodlama (target encoding), her kategoriye o kategorideki hedef değişkenin ortalamasını atar. Yüksek kardinaliteli değişkenlerde boyut patlamasını önler; ancak veri sızıntısı (data leakage) riskine karşı dikkatli uygulanmalıdır.
  • check_circle Embedding katmanları, özellikle derin öğrenme modellerinde, kategorileri düşük boyutlu yoğun vektörlere dönüştürür. Çok sayıda kategori içeren değişkenlerde (ürün ID'leri, kullanıcı ID'leri) one-hot encoding'e kıyasla çok daha verimli temsiller öğrenebilir. PyTorch'un nn.Embedding ve Keras'ın Embedding katmanı bu amaçla yaygın biçimde kullanılır.

Makine Öğrenmesi Pipeline'larında Kullanım

  • check_circle One-hot encoding tipik olarak veri ön işleme aşamasında, model eğitiminden önce uygulanır. scikit-learn'deki ColumnTransformer ile sayısal ve kategorik değişkenler paralel olarak işlenebilir; OneHotEncoder yalnızca kategorik sütunlara uygulanırken StandardScaler sayısal sütunlara ayrıca uygulanır.
  • check_circle Üretim ortamlarında encoder'ın fit() yöntemi yalnızca eğitim verisi üzerinde çağrılmalıdır. Eğitim ve test setine transform() uygulanırken encoder nesnesinin kendisi saklanmalı ve serileştirilmelidir (joblib veya pickle). Bu kural ihlal edilirse test verisindeki bilgi eğitim sürecine sızdırılmış olur.
  • check_circle Zaman serisi verilerinde ve çevrimiçi öğrenme senaryolarında kategorilerin zamanla değişebileceği göz önünde bulundurulmalıdır. Yeni kategorilerle karşılaşıldığında pipeline'ın nasıl davranacağı önceden tasarlanmalıdır.

Sık Sorulan Sorular

  • check_circle S: One-hot encoding ile label encoding arasındaki temel fark nedir? C: Label encoding, kategorilere 0, 1, 2 gibi tam sayılar atayarak aralarında yapay bir büyüklük sırası oluşturur. One-hot encoding ise her kategoriyi ayrı bir ikili sütunla temsil eder ve bu sıra yanılsamasını ortadan kaldırır. Nominal kategorik değişkenlerde one-hot encoding, sıralı (ordinal) değişkenlerde ise label veya ordinal encoding tercih edilir.
  • check_circle S: Kukla değişken tuzağı nedir ve nasıl önlenir? C: N kategorili bir değişken one-hot encoding ile N sütuna dönüştürüldüğünde bu sütunlar mükemmel doğrusal bağımlılık içindedir (hepsi bilinirse sonuncusu otomatik hesaplanır). Bu multicollinearity problemi, özellikle lineer modellerde matris tekilliliğine yol açar. Çözüm olarak drop='first' veya drop='if_binary' parametresiyle bir referans sütunu atılır.
  • check_circle S: Yüksek kardinaliteli değişkenlerde one-hot encoding uygulanmalı mı? C: Genellikle uygulanmamalıdır. Onlarca veya yüzlerce benzersiz değer içeren değişkenlerde (örneğin posta kodu, ürün ID'si) hedef kodlama, frekans kodlama veya embedding katmanları çok daha verimli alternatifler sunar. Pratik eşik olarak 10-15'ten fazla benzersiz kategori içeren değişkenlerde alternatifleri değerlendirmek önerilir.
  • check_circle S: One-hot encoding seyrek matrislerle nasıl verimli kullanılır? C: scikit-learn'ün OneHotEncoder sınıfı varsayılan olarak scipy seyrek matrisi döndürür. Bu matrisler yalnızca sıfır olmayan değerleri saklar; dolayısıyla büyük veri kümelerinde bellek kullanımı dramatik biçimde azalır. sparse_output=False parametresiyle yoğun (dense) numpy dizisi de elde edilebilir.
  • check_circle S: Test setinde eğitim setinde görülmemiş bir kategori çıkarsa ne olur? C: scikit-learn'ün OneHotEncoder sınıfında handle_unknown='ignore' parametresi kullanılırsa bilinmeyen kategoriler için tüm sütunlar sıfır olan bir vektör üretilir. handle_unknown='infrequent_if_exist' seçeneği ise nadir kategorileri tek bir 'diğer' sütununda toplar. Bu parametre belirlenmezse varsayılan davranış hata fırlatmaktır.
  • check_circle S: One-hot encoding ağaç tabanlı modellerde de gerekli midir? C: Karar ağaçları, rastgele ormanlar ve gradient boosting (XGBoost, LightGBM) gibi ağaç tabanlı modeller kategorik değişkenleri doğrudan ya da label encoding ile işleyebilir. LightGBM ve CatBoost gibi modern kütüphaneler yerleşik kategorik değişken desteği sunar. Bu nedenle ağaç tabanlı modellerde one-hot encoding zorunlu değildir; hatta çok sayıda kategori içeren değişkenlerde performansı düşürebilir.