Garfield
YZF Admin
One-hot encoding, kategorik sütunlardaki metin değerlerini 0 ve 1’lerden oluşan ayrı sütunlara dönüştürür. pandas kullanırken en pratik yöntem
Ön koşul olarak Python ortamında pandas kurulu olmalı ve veri kümesini bir
Kod, yalnızca
Tüm DataFrame’i doğrudan dönüştürmek istemiyorsanız önce seçilecek kategorik sütunları ayırabilirsiniz:
Bu yöntem,
Bir sütunda iki kategori varsa iki ayrı sütun oluşturmak yerine bir kategoriyi referans kabul edip tek sütun oluşturabilirsiniz. Bunun için
Bu örnekte
Önemli:
Eğitim ve test DataFrame’lerine ayrı ayrı
Basit bir pandas çözümünde test sütunlarını eğitim sütunlarına hizalayabilirsiniz:
Dönüştürme sonrasında şu kontrolleri yapabilirsiniz:
Yeni sütunların adları genellikle
One-hot encoding, kategorik değerleri sayısal sütunlara çevirir; kategoriler arasında doğal bir büyüklük veya sıralama olduğunu kanıtlamaz. Örneğin
pd.get_dummies() fonksiyonudur. Örneğin renk sütunundaki kırmızı, mavi ve yeşil değerleri ayrı sütunlara çevrilir; her satırda yalnız ilgili kategori 1, diğerleri 0 olur.pd.get_dummies() ile temel kullanım
Ön koşul olarak Python ortamında pandas kurulu olmalı ve veri kümesini bir
DataFrame olarak yüklemelisiniz. Aşağıdaki örnekte varsayımsal bir veri kümesi kullanılıyor:
Python:
import pandas as pd
df = pd.DataFrame({
"renk": ["kırmızı", "mavi", "yeşil", "mavi"],
"boyut": ["küçük", "büyük", "orta", "küçük"],
"fiyat": [10, 20, 15, 12]
})
encoded_df = pd.get_dummies(df, columns=["renk", "boyut"], dtype=int)
print(encoded_df)
Kod, yalnızca
renk ve boyut sütunlarını dönüştürür; fiyat sütununu olduğu gibi bırakır. Beklenen çıktı şu yapıya benzer:
Kod:
fiyat renk_kırmızı renk_mavi renk_yeşil boyut_büyük boyut_küçük boyut_orta
0 10 1 0 0 0 1 0
1 20 0 1 0 1 0 0
2 15 0 0 1 0 0 1
3 12 0 1 0 0 1 0
dtype=int seçeneği, doğru ve yanlış değerlerin True/False yerine 1/0 olarak oluşturulmasını sağlar. Makine öğrenmesi kütüphanelerinin çoğu True/False değerleriyle de çalışabilir; ancak sayı biçimi çıktıyı incelemeyi kolaylaştırır.Mevcut DataFrame’e dönüştürülmüş sütunları ekleme
Tüm DataFrame’i doğrudan dönüştürmek istemiyorsanız önce seçilecek kategorik sütunları ayırabilirsiniz:
- Kategorik sütunları belirleyin. Örneğin
renkveboyutsütunlarını seçin; sayısalfiyatsütununu dönüştürmeyin. - Seçilen sütunlara
pd.get_dummies()uygulayın.columns=["renk", "boyut"]parametresi yalnızca bu sütunları one-hot sütunlarına çevirir. - Dönüştürülmüş DataFrame’i kontrol edin.
encoded_df.dtypesveencoded_df.head()komutlarıyla yeni sütunların oluştuğunu ve sayısal değerler içerdiğini doğrulayın.
Python:
categorical_columns = df.select_dtypes(include=["object", "string", "category"]).columns
encoded_df = pd.get_dummies(
df,
columns=categorical_columns,
dtype=int
)
print(encoded_df.head())
Bu yöntem,
object, pandas metin türleri (string/str) veya category türündeki sütunları seçer. Ancak sayısal olarak kodlanmış kategoriler, örneğin 1, 2 ve 3 değerlerinden oluşan bir şehir_kodu sütunu, otomatik olarak kategorik kabul edilmez. Böyle bir sütunu açıkça columns listesine eklemeniz gerekir.İkili kategori ve referans sütunu seçimi
Bir sütunda iki kategori varsa iki ayrı sütun oluşturmak yerine bir kategoriyi referans kabul edip tek sütun oluşturabilirsiniz. Bunun için
drop_first=True kullanılır:
Python:
df = pd.DataFrame({
"abonelik": ["var", "yok", "var", "yok"]
})
encoded_df = pd.get_dummies(
df,
columns=["abonelik"],
drop_first=True,
dtype=int
)
print(encoded_df)
Bu örnekte
var ilk kategori olarak düşürülür ve abonelik_yok adlı tek sütun oluşur. Değerin 1 olması yok, 0 olması ise referans kategori olan var anlamına gelir. Referansın hangisi olduğunu tahmin etmek yerine çıktı sütunlarını kontrol edin.Önemli:
drop_first=True her durumda zorunlu değildir. Ağaç tabanlı modellerde veya yalnızca dönüştürülmüş veriyi saklamak istediğinizde tüm kategorileri korumak daha anlaşılır olabilir. Doğrusal modellerde gereksiz doğrusal bağımlılığı önlemek için bir kategoriyi düşürmek tercih edilebilir.Eğitim ve test verilerinde kategori uyumsuzluğu
Eğitim ve test DataFrame’lerine ayrı ayrı
pd.get_dummies() uygulandığında kategoriler farklıysa sütun adları da farklı olabilir. Örneğin eğitim verisinde mavi kategorisi bulunurken test verisinde yalnız kırmızı bulunabilir. Bu durumda model girdilerinin sütunları eşleşmez.Basit bir pandas çözümünde test sütunlarını eğitim sütunlarına hizalayabilirsiniz:
Python:
train_encoded = pd.get_dummies(train_df, columns=["renk"], dtype=int)
test_encoded = pd.get_dummies(test_df, columns=["renk"], dtype=int)
test_encoded = test_encoded.reindex(
columns=train_encoded.columns,
fill_value=0
)
reindex() işlemi test verisinde eksik olan eğitim sütunlarını 0 ile ekler ve fazladan sütunları çıkarır. Böylece iki DataFrame’in sütunları aynı sıraya gelir. Eğitimde görülmeyen bir test kategorisinin sütunu bu işlemle çıkarılır; o kategori grubu tamamen sıfır kalır. Bu durum bilinmeyen kategorinin öğrenildiği anlamına gelmez. Eğitim ve test verilerini kategori öğrenmek için birleştirmeyin; gerçek bir makine öğrenmesi akışında yalnız eğitim verisine uydurulan ve bilinmeyen kategorileri nasıl işleyeceği belirlenmiş bir dönüştürücü veya işlem hattı kullanın.Sonucu nasıl kontrol edilir?
Dönüştürme sonrasında şu kontrolleri yapabilirsiniz:
Python:
print(encoded_df.columns.tolist())
print(encoded_df.dtypes)
print(encoded_df.isna().sum())
Yeni sütunların adları genellikle
sütun_adı_kategori biçimindedir. Tüm kategoriler korunmuşsa ve eksik ya da bilinmeyen kategori yoksa her kategori grubunda bir sütun 1, diğerleri 0 olur. Varsayılan dummy_na=False davranışında eksik değerler o grupta tamamen sıfır kodlanır; dummy_na=True ile ayrı bir eksiklik göstergesi oluşturabilirsiniz. drop_first=True kullanıldığında referans kategori de tamamen sıfırdır; bu nedenle sıfırları eksik veya bilinmeyen kategoriyle karıştırmayın.One-hot encoding, kategorik değerleri sayısal sütunlara çevirir; kategoriler arasında doğal bir büyüklük veya sıralama olduğunu kanıtlamaz. Örneğin
küçük, orta ve büyük değerlerini one-hot encoding ile dönüştürmek, bunların sıralı olduğu bilgisini modele vermez. Sıralamanın anlamlı olduğu durumlarda farklı bir kodlama yaklaşımı gerekebilir.