Kurs
Makine öğreniminde yaygın zorluklardan biri, algoritmaların genellikle sayısal girdi gerektirmesi nedeniyle kategorik değişkenlerle (renkler, ürün türleri veya konumlar gibi) çalışmaktır. Bu soruna çözümlerden biri one-hot encoding yöntemidir.
One-hot encoding, her benzersiz kategorinin, varlığını 1 ve yokluğunu 0 ile gösteren ikili bir sütunla temsil edildiği sayısal vektörler şeklinde kategorik verileri gösterme tekniğidir.
Bu yazıda, one-hot encoding kavramını, faydalarını ve Pandas ile Scikit-learn gibi kütüphaneleri kullanarak Python’da pratik uygulamasını inceleyeceğiz.
Makine öğrenimi için küratörlü bir müfredat arıyorsanız, şu dört derslik öğrenim yoluna göz atın: Python ile Makine Öğreniminin Temelleri.
One-Hot Encoding Nedir?
One-hot encoding, kategorik değişkenleri, tahmini iyileştirmek üzere makine öğrenimi algoritmalarına verilebilecek bir formata dönüştürme yöntemidir. Bir özellikteki her benzersiz kategori için yeni ikili sütunlar oluşturmayı içerir. Her sütun bir benzersiz kategoriyi temsil eder ve 1 veya 0 değeri, o kategorinin varlığını veya yokluğunu gösterir.
One-hot encoding’in nasıl çalıştığını göstermek için bir örnek düşünelim. Tek bir kategorik özelliğe, Color, sahip bir veri kümesi olduğunu ve bu özelliğin üç değer alabildiğini varsayalım: Red, Green ve Blue. One-hot encoding kullanarak bu özelliği şu şekilde dönüştürebiliriz:

Bu örnekte, orijinal "Color" sütunu, her biri bir rengi temsil eden üç yeni ikili sütunla değiştirilmiştir. 1 değeri, ilgili satırda o rengin var olduğunu, 0 ise olmadığını gösterir.
Neden One-Hot Encoding Kullanılır?
One-hot encoding, veri ön işleme için birkaç nedenle temel bir tekniktir. Kategorik verileri, makine öğrenimi modellerinin kolayca anlayıp kullanabileceği bir formata dönüştürür. Bu dönüşüm, kategoriler arasında gerçekte var olmayan sahte ilişkiler ima etmeden her kategorinin bağımsız olarak ele alınmasını sağlar.
Ayrıca, birçok veri işleme ve makine öğrenimi kütüphanesi one-hot encoding’i destekler. Veri ön işleme iş akışına sorunsuz şekilde oturur ve veri kümelerini çeşitli makine öğrenimi algoritmalarına hazırlamayı kolaylaştırır.
Makine öğrenimiyle uyumluluk
Çoğu makine öğrenimi algoritması, hesaplamalarını gerçekleştirmek için sayısal girdi gerektirir. Kategorik verilerin, bu algoritmaların etkili şekilde kullanabilmesi için sayısal bir formata dönüştürülmesi gerekir. One-hot encoding, bu dönüşümü sağlamak için yalın bir yol sunar ve kategorik değişkenlerin modellere entegre edilmesini mümkün kılar.
Sözde sıralılıktan kaçınma
Label encoding, her kategoriye benzersiz bir sayı atayarak kategorik verileri sayısala dönüştürmenin bir başka yöntemidir. Ancak bu yaklaşım, kategoriler arasında gerçekte var olmayan bir sıra veya derecelendirme varmış izlenimi yaratabileceği için sorunlara yol açabilir.
Örneğin, Red için 1, Green için 2 ve Blue için 3 atanması, modele Green’in Red’den büyük, Blue’nun ise ikisinden de büyük olduğu izlenimini verebilir. Bu yanlış anlama, modelin performansını olumsuz etkileyebilir.
One-hot encoding, her kategori için ayrı bir ikili sütun oluşturarak bu sorunu çözer. Böylece model, her kategorinin diğerlerinden farklı ve ilişkisiz olduğunu görebilir.
Label encoding, kategorik verilerin doğal bir sıralı ilişkisi olduğunda, yani kategorilerin anlamlı bir düzeni veya derecelendirmesi bulunduğunda faydalıdır. Bu gibi durumlarda, label encoding ile atanan sayısal değerler bu düzeni etkili biçimde temsil edebilir ve uygun bir seçim olur.
Eğitim düzeylerini temsil eden bir özelliğe sahip bir veri kümesini düşünün. Kategoriler şunlardır:
High SchoolBachelor's DegreeMaster's DegreePhD
Bu kategorilerin açık bir sıralaması vardır: PhD, Master's Degree’den; o da Bachelor's Degree’den yüksektir, vb. Bu durumda label encoding, verinin sıralı doğasını etkili biçimde yakalayabilir:
|
Eğitim Düzeyi |
Label Encoding |
|
High School |
0 |
|
Bachelor's Degree |
1 |
|
Master's Degree |
2 |
|
PhD |
3 |
Bu örnekte sayısal değerler, eğitim düzeylerindeki ilerlemeyi yansıtır ve label encoding’i uygun bir seçim hâline getirir. Model, daha yüksek sayıların daha yüksek eğitim düzeylerine karşılık geldiğini doğru şekilde yorumlayabilir.
Python’da One-Hot Encoding Uygulamak
Artık one-hot encoding’in ne olduğunu ve neden önemli olduğunu anladığımıza göre, bunu Python’da nasıl uygulayacağımıza geçelim.
Python, one-hot encoding’i gerçekleştirmek için kullanışlı ve verimli yollar sunan Pandas ve Scikit-learn gibi güçlü kütüphaneler sağlar.
Bu bölümde, bu kütüphaneleri kullanarak one-hot encoding uygulamasını adım adım inceleyeceğiz. Önce, basit kodlama görevleri için hızlı ve kolay olan Pandas’ın get_dummies() fonksiyonuyla başlayacağız. Ardından, özellikle daha karmaşık kodlama ihtiyaçları için daha fazla esneklik ve kontrol sunan Scikit-learn’ün OneHotEncoder sınıfını keşfedeceğiz.
Pandas get_dummies() kullanmak
Pandas, bir DataFrame’den doğrudan one-hot kodlanmış sütunlar oluşturmak için oldukça kullanışlı bir get_dummies() fonksiyonu sağlar.
Şöyle kullanabilirsiniz (aşağıda adım adım açıklıyoruz):
import pandas as pd
# Sample data
data = {'Color': ['Red', 'Green', 'Blue', 'Red']}
df = pd.DataFrame(data)
# Applying one-hot encoding
df_encoded = pd.get_dummies(df, dtype=int)
# Displaying the encoded DataFrame
print(df_encoded)

Önce Pandas kütüphanesini içe aktarıyoruz. Ardından, tek bir 'Color' anahtarına ve değer olarak bir renk listesine sahip bir data sözlüğü oluşturuyoruz. Bu sözlüğü bir Pandas DataFrame’i olan df’e dönüştürüyoruz. DataFrame şu şekildedir:
Color
0 Red
1 Green
2 Blue
3 Red
pd.get_dummies() fonksiyonunu kullanarak df DataFrame’ine one-hot encoding uyguluyoruz. Bu fonksiyon, kategorik sütun(lar)ı otomatik olarak algılar ve her benzersiz kategori için yeni ikili sütunlar oluşturur. dtype=int argümanı, varsayılan Boolean yerine 1 ve 0 ile kodlama yapılmasını sağlar. Ortaya çıkan df_encoded DataFrame’i şu şekildedir:
Color_Blue Color_Green Color_Red
0 0 0 1
1 0 1 0
2 1 0 0
3 0 0 1
Scikit-learn’ün OneHotEncoder sınıfını kullanmak
Kodlama süreci üzerinde daha fazla esneklik ve kontrol için Scikit-learn, OneHotEncoder sınıfını sunar. Bu sınıf, bilinmeyen kategorilerin ele alınması ve kodlayıcının eğitim verilerine uydurulması gibi gelişmiş seçenekler sağlar.
from sklearn.preprocessing import OneHotEncoder
import numpy as np
# Creating the encoder
enc = OneHotEncoder(handle_unknown='ignore')
# Sample data
X = [['Red'], ['Green'], ['Blue']]
# Fitting the encoder to the data
enc.fit(X)
# Transforming new data
result = enc.transform([['Red']]).toarray()
# Displaying the encoded result
print(result)
[[1. 0. 0.]]
sklearn.preprocessing modülünden OneHotEncoder sınıfını ve numpy’yi içe aktarıyoruz. Ardından bir OneHotEncoder örneği oluşturuyoruz. handle_unknown='ignore' parametresi, dönüştürme sırasında (uydurma sürecinde görülmeyen) bilinmeyen kategorileri yok saymasını söyler. Daha sonra, her iç listede tek bir renk bulunan listelerden oluşan X listesini oluşturuyoruz. Bu, kodlayıcıyı uydurmak için kullanacağımız veridir.
Kodlayıcıyı örnek veri X üzerine uyduruyoruz. Bu adımda kodlayıcı, verideki benzersiz kategorileri öğrenir. Uydurulan kodlayıcıyı yeni verileri dönüştürmek için kullanıyoruz. Bu örnekte tek bir rengi, 'Red', dönüştürüyoruz. .transform() yöntemi seyrek bir matris döndürür; bunu .toarray() ile yoğun bir diziye çeviriyoruz.
Sonuç [[1. 0. 0.]], 'Red'’in var olduğunu (1), 'Green' ve 'Blue'’nun ise olmadığını (0) gösterir.
Çok Sayıda Benzersiz Değere Sahip Kategorik Özelliklerle Başa Çıkma
One-hot encoding ile ilgili önemli bir zorluk “boyutsallığın laneti”dir. Bu, bir kategorik özellik çok sayıda benzersiz değer içerdiğinde, sütun sayısının patlayıcı biçimde artmasıyla ortaya çıkar. Bu durum veri kümesini seyrek hâle getirir ve işlemeyi hesaplama açısından maliyetli kılar. Bunu çözmek için uygulayabileceğimiz tekniklere bakalım.
Özellik karma (feature hashing)
Feature hashing, yani “hashing trick”, kategorileri sabit sayıda sütuna hash’leyerek boyutu azaltmaya yardımcı olabilir. Bu yaklaşım, özellik sayısını kontrol altında tutarken verimliliği korur. Bunu nasıl yapacağımıza dair bir örnek:
from sklearn.feature_extraction import FeatureHasher
import pandas as pd
# Sample data
data = {'Color': ['Red', 'Green', 'Blue', 'Red', 'Yellow']}
df = pd.DataFrame(data)
# Initialize FeatureHasher
hasher = FeatureHasher(n_features=3, input_type='string')
# Apply feature hashing
hashed_features = hasher.transform(df['Color'])
hashed_df = pd.DataFrame(hashed_features.toarray(), columns=['Feature1', 'Feature2', 'Feature3'])
# Display the hashed features DataFrame
print("Hashed Features DataFrame:")
print(hashed_df)

Gerekli kütüphaneleri, sklearn.feature_extraction içindeki FeatureHasher ve pandas dâhil, içe aktarıyoruz. Ardından, kategorik bir özellik olan 'Color' ile bir DataFrame oluşturuyoruz.
FeatureHasher’ı istenen çıktı özellik sayısıyla (n_features=3) başlatıyor ve girdi tipini 'string' olarak belirtiyoruz. Sonrasında, 'Color' sütununa transform metodunu uyguluyor, elde edilen seyrek matrisi yoğun diziye çeviriyor ve bunu bir DataFrame’e dönüştürüyoruz. Son olarak, hash’lenmiş özellikleri içeren DataFrame’i yazdırıyoruz.
Boyut indirgeme
One-hot encoding’den sonra, veri kümesindeki temel bilgiyi korurken boyut sayısını azaltmak için Temel Bileşen Analizi (PCA) gibi teknikler uygulanabilir.
PCA, yüksek boyutlu veriyi daha düşük boyutlu bir uzaya sıkıştırmaya yardımcı olur ve böylece makine öğrenimi algoritmaları için daha yönetilebilir hâle getirir.
from sklearn.preprocessing import OneHotEncoder
from sklearn.decomposition import PCA
import pandas as pd
# Sample data
data = {'Color': ['Red', 'Green', 'Blue', 'Red', 'Yellow']}
df = pd.DataFrame(data)
# Applying one-hot encoding
encoder = OneHotEncoder(sparse=False)
one_hot_encoded = encoder.fit_transform(df[['Color']])
# Creating a DataFrame with one-hot encoded columns
# Check if get_feature_names_out is available
if hasattr(encoder, 'get_feature_names_out'):
feature_names = encoder.get_feature_names_out(['Color'])
else:
feature_names = [f'Color_{cat}' for cat in encoder.categories_[0]]
df_encoded = pd.DataFrame(one_hot_encoded, columns=feature_names)
# Initialize PCA
pca = PCA(n_components=2) # Adjust the number of components based on your needs
# Apply PCA
pca_transformed = pca.fit_transform(df_encoded)
# Creating a DataFrame with PCA components
df_pca = pd.DataFrame(pca_transformed, columns=['PCA1', 'PCA2'])
# Display the PCA-transformed DataFrame
print("PCA-Transformed DataFrame:")
print(df_pca)

OneHotEncoder kullanarak kategorik özelliği one-hot kodlanmış biçime dönüştürüyoruz. Sonuç, her kategori için ikili sütunlar içeren bir DataFrame’dir.
Ardından, istenen bileşen sayısıyla (n_components=2) PCA’yı başlatıyor ve one-hot kodlanmış veriye uyguluyoruz. Sonuç, iki temel bileşene sahip dönüştürülmüş bir DataFrame’dir.
PCA, one-hot kodlanmış verinin boyutunu düşürerek, temel bilgiyi korurken daha yönetilebilir hâle getirir. Bu yaklaşım, one-hot encoding’den kaynaklanan yüksek boyutlu verilerle çalışırken özellikle kullanışlıdır.
En İyi Uygulamalar ve Dikkat Edilecekler
One-hot encoding güçlü bir araç olsa da, yanlış uygulanması çoklu doğrusal bağlantı veya yeni veriyi verimsiz işleme gibi sorunlara yol açabilir. Bazı en iyi uygulamalara ve dikkat edilmesi gerekenlere bakalım.
Bilinmeyen kategorileri ele alma
Makine öğrenimi modellerini üretime alırken, test setinde eğitim setinde bulunmayan kategorilere rastlamak yaygındır. Scikit-learn’ün OneHotEncoder sınıfı, bilinmeyen kategorileri yok sayarak veya onları ayrılmış bir sütuna atayarak ele alabilir ve modelin yeni veriyi etkili şekilde işlemesini sağlar.
Bu örnek, kodlayıcıyı eğitim verisi üzerinde uydurmayı ve ardından eğitim ve test verilerini dönüştürmeyi, eğitim setinde bulunmayan kategorilerin nasıl ele alındığını gösterir.
from sklearn.preprocessing import OneHotEncoder
import numpy as np
# Training data
X_train = [['Red'], ['Green'], ['Blue']]
# Creating the encoder with handle_unknown='ignore'
enc = OneHotEncoder(handle_unknown='ignore')
# Fitting the encoder to the training data
enc.fit(X_train)
# Transforming the training data
X_train_encoded = enc.transform(X_train).toarray()
print("Encoded training data:")
print(X_train_encoded)
# Test data with an unknown category 'Yellow'
X_test = [['Red'], ['Yellow'], ['Blue']]
# Transforming the test data
X_test_encoded = enc.transform(X_test).toarray()
print("Encoded test data:")
print(X_test_encoded)

Bu örnekte, kodlayıcı eğitim verisi üzerinde uydurulur ve 'Red', 'Green' ve 'Blue' kategorilerini öğrenir. Test verisini dönüştürürken, eğitimde görülmeyen 'Yellow' ile karşılaşır. handle_unknown='ignore' ayarlandığından, kodlayıcı 'Yellow' için tümü sıfır olan bir satır üretir ve bilinmeyen kategoriyi fiilen yok sayar.
Bilinmeyen kategorileri bu şekilde ele alarak, modelinizin daha önce görülmemiş kategoriler içerse bile yeni veriyi etkili şekilde işleyebilmesini sağlayabilirsiniz.
Orijinal sütunu düşürmek
One-hot encoding uygulandıktan sonra, veri setinden orijinal kategorik sütunun düşürülmesi kritiktir. Orijinal sütunun korunması, yinelenen bilgilerin model performansını etkilediği çoklu doğrusal bağlantıya yol açabilir. Veri setinin bütünlüğünü korumak için her kategorinin yalnızca bir kez temsil edildiğinden emin olun.
Aşağıda, one-hot encoding uygulandıktan sonra orijinal kategorik sütunu nasıl düşürebileceğinizi, çoklu doğrusal bağlantıdan kaçınıp her kategorinin yalnızca bir kez temsil edilmesini nasıl sağlayabileceğinizi görebilirsiniz.
import pandas as pd
# Sample data
data = {'Color': ['Red', 'Green', 'Blue', 'Red']}
df = pd.DataFrame(data)
# Applying one-hot encoding
df_encoded = pd.get_dummies(df, columns=['Color'])
# Displaying the encoded DataFrame
print("Encoded DataFrame:")
print(df_encoded)

Bu örnekte, 'Color' adlı kategorik bir sütun içeren bir DataFrame ile başlıyoruz. pd.get_dummies() fonksiyonunu, columns=['Color'] belirterek 'Color' sütununa one-hot encoding uygulamak için kullanıyoruz. Bu işlem, orijinal 'Color' sütununu otomatik olarak düşürür ve yerine one-hot kodlanmış sütunları koyar. Ortaya çıkan df_encoded DataFrame’i artık her benzersiz kategoriyi temsil eden ikili sütunlar içerir; böylece her kategori yalnızca bir kez temsil edilir ve çoklu doğrusal bağlantı riski ortadan kalkar.
Orijinal kategorik sütunu düşürmek, veri setinin bütünlüğünü korumanıza ve makine öğrenimi modelinin performansını artırmanıza olanak tanır.
OneHotEncoder ve get_dummies() karşılaştırması
Pandas’ın get_dummies() fonksiyonu ile Scikit-learn’ün OneHotEncoder sınıfı arasında seçim, ihtiyaçlarınıza bağlıdır. Hızlı ve doğrudan kodlama için get_dummies() kullanışlı ve kolaydır. Bilinmeyen kategorileri ele alma veya kodlayıcıyı belirli verilere uydurma gibi daha fazla kontrol ve esneklik gerektiren karmaşık senaryolar için ise OneHotEncoder daha iyi bir seçimdir.
Sonuç
One-hot encoding, kategorik verileri makine öğrenimi algoritmalarına uygun sayısal bir formata dönüştürmek için güçlü ve vazgeçilmez bir tekniktir. Sözde sıralılık tuzaklarından kaçınarak ve kategorik verilerin kullanımını kolaylaştırarak makine öğrenimi modellerinin doğruluğunu ve verimliliğini artırır.
Python’da one-hot encoding uygulamak, Pandas’ın get_dummies() fonksiyonu ve Scikit-learn’ün OneHotEncoder sınıfı gibi araçlarla son derece pratiktir. Verinizin boyutunu dikkate almayı ve bilinmeyen kategorileri etkili şekilde ele almayı unutmayın.
Bu konuda daha fazla bilgi edinmek isterseniz, şu dersi inceleyin: Python’da Makine Öğrenimi için Ön İşleme.
SSS
Kategorik verilerdeki eksik değerleri one-hot encoding işleyebilir mi?
Hayır, one-hot encoding doğrudan eksik değerleri işlemez. One-hot encoding uygulamadan önce, atama (imputation) ya da eksik veriye sahip satırların kaldırılması gibi yöntemlerle eksik değerleri ele almanız gerekir.
One-hot encoding tüm kategorik veri türleri için uygun mudur?
One-hot encoding, nominal kategorik veriler için iyi çalışır ancak kategorilerin anlamlı bir sırasının bulunduğu ordinal veriler için ideal olmayabilir. Bu gibi durumlarda, ordinal encoding daha uygun olabilir.
One-hot encoding, büyük veri kümeleriyle çalışan makine öğrenimi modellerinin performansını nasıl etkiler?
One-hot encoding, veri kümesinin boyutunu önemli ölçüde artırabilir; bu da hesaplama karmaşıklığının ve bellek kullanımının artmasına yol açabilir. Bu sorunu yönetmek için feature hashing veya boyut indirgeme gibi teknikler kullanılabilir.
One-hot encoding’i kelime veya cümle gibi metin verileri için kullanabilir miyim?
One-hot encoding metin verileri için kullanılabilir, ancak sözcükler arasındaki ilişkileri ve anlamı yakalamak için genellikle kelime gömme (word embedding) veya TF-IDF gibi teknikler daha pratiktir.
Belirli veri kümem için one-hot encoding ile diğer kodlama teknikleri arasında nasıl seçim yapmalıyım?
Seçim, kategorik verinizin doğasına ve makine öğrenimi modelinizin özel gereksinimlerine bağlıdır. Benzersiz kategori sayısı, sıralı ilişkilerin varlığı ve boyut üzerindeki etki gibi faktörleri göz önünde bulundurun.
Ana Rojo Echeburúa, Uygulamalı Matematik alanında doktora derecesine sahip bir yapay zeka ve veri uzmanıdır. Verileri eyleme dönüştürülebilir içgörülere çevirmeyi sever ve teknik ekipleri yönetme konusunda geniş deneyime sahiptir. Ana, müşterilerle yakın çalışarak onların iş sorunlarını çözmekten ve yenilikçi yapay zeka çözümleri geliştirmekten keyif alır. Sorun çözme becerileri ve açık iletişimiyle tanınan Ana, özellikle üretken yapay zeka olmak üzere yapay zekaya tutkuyla bağlıdır. Sürekli öğrenmeye ve etik yapay zeka geliştirmeye, ayrıca karmaşık sorunları basitleştirmeye ve teknolojiyi anlaşılır biçimde açıklamaya kendini adamıştır.
