Özellik mühendisliği, tablo verileriyle çalışırken model doğruluğunu artırmanın en etkili yollarından biridir. Doğal dil işleme ve bilgisayar görüsü gibi alanlarda, sinir ağları ham girdilerden zengin desenler çıkarabilirken, en iyi performansa sahip tabular modeller – özellikle gradient-boosted karar ağaçları – baştan sona iyi tasarlanmış özelliklerden büyük ölçüde yararlanmaktadır. Ancak, potansiyel yararlı özelliklerin sayısının fazlalığı, bunları ayrıntılı bir şekilde araştırmayı genellikle hesaplamalı olarak çetrefil bir hale getirir. Standart pandas kullanarak yüzlerce veya binlerce özellik fikrini üretip doğrulamaya çalışmak, gerçekleşmesi pratik açıdan çok yavaş olmaktadır.
Burada, GPU hızlandırması devreye giriyor. NVIDIA cuDF-pandas kullanarak, pandas işlemlerini GPU’da sıfır kod değişikliği ile hızlandırarak, Kaggle’ın Şubat oyun alanı yarışmasında 10,000’den fazla mühendislik özelliğini hızla üretebilme imkanına kavuştum. Bu hızlandırılmış keşif süreci, önemli bir farklılaştırıcı oldu. Günler içinde, potansiyel olarak aylar sürebilecek bir zaman diliminde, keşfedilen en iyi 500 özelliğin, XGBoost modelimin doğruluğunu önemli ölçüde artırarak, sırt çantası fiyatlarını tahmin etme yarışmasında 1. sırayı almamı sağladı. Aşağıda, cuDF-pandas ile hızlandırılan, bu sonuca yol açan temel özellik mühendisliği tekniklerini paylaşıyorum.
Gruplama ve İstatistik Hesaplama Yöntemi
En güçlü özellik mühendisliği tekniği, gruplama ve toplama (groupby) aggregasyonlarıdır. Özellikle, groupby(COL1)[COL2].agg(STAT)
kodunu kullanıyoruz. Burada, COL1
sütununa göre gruplandırıyoruz ve başka bir sütun olan COL2
üzerinde STAT
istatistiğini hesaplıyoruz. NVIDIA cuDF-pandas’ın hızını kullanarak, binlerce COL1
, COL2
, STAT
kombinasyonunu keşfedebiliyoruz. Ortalama, standart sapma, sayım, min, max, nunique, skew gibi istatistikleri deniyoruz. COL1
ve COL2
‘yi mevcut sütunlarımızdan seçiyoruz. Eğer COL2
hedef sütunu ise, bu durumda nested cross-validation kullanarak doğrulama hesaplamamızda sızıntıyı önlüyoruz. Bu operasyon, hedef kodlama (Target Encoding) olarak adlandırılmaktadır.
Histogram Kullanarak Gruplama
Gruplama yaptığımızda, her grup için bir sayı dağılımı elde ediyoruz. Tek bir istatistik hesaplamak yerine, bu sayıların dağılımını tanımlayan herhangi bir sayı topluluğunu hesaplayabilir ve birden fazla yeni sütun oluşturabiliriz. Örneğin, Weight Capacity = 21.067673
grubu için histogram gösterimi yaparak, eşit aralıklı yedi kutucuktaki fiyat dağılımını inceleyebiliriz.
Aşağıda yedi kutu için bir histogram örneği gösterilmektedir, ancak kutu sayısını bir hiperparametre olarak değerlendirebiliriz.
result = X_train2.groupby("WC")["Price"].apply(make_histogram)
X_valid2 = X_valid2.merge(result, on="WC", how="left")
Uç Değerleri Hesaplamak için Gruplama
Aynı şekilde, grup bazında QUANTILES = [5,10,40,45,55,60,90,95]
değerlerini hesaplayarak sekiz yeni sütun oluşturabiliriz.
for k in QUANTILES:
result = X_train2.groupby('Weight Capacity (kg)').
agg({'Price': lambda x: x.quantile(k/100)})
NaN Değerleri Tek Sütunda Toplama
Birden fazla sütun üzerindeki tüm NaN değerlerini tek bir sütunda toplayarak yeni bir sütun oluşturabiliriz. Bu güçlü sütun, ardından grup toplama işlemleri veya diğer sütunlarla kombinasyon için kullanılabilir.
train["NaNs"] = np.float32(0)
for i,c in enumerate(CATS):
train["NaNs"] += train[c].isna()*2**i
Sayısal Sütunu Kutulara Ayırma
Bu yarışmadaki en güçlü (tahmin edici) sütun Ağırlık Kapasitesi. Bu sütunu, yuvarlama ile kesme işlemi yaparak daha güçlü sütunlar oluşturabiliriz.
for k in range(7,10):
n = f"round{k}"
train[n] = train["Weight Capacity (kg)"].round(k)
Float32 Sayıların Sayısal Değerlerini Ayrıştırma
Yine bu yarışmadaki en güçlü sütunumuz Ağırlık Kapasitesi. Bu sütundan sayıları çıkararak daha güçlü sütunlar oluşturabiliriz. Kulağa garip gelse de, bu teknik sıklıkla bir ürün kimlik numarasından bilgi çıkartmak için kullanılır. Ürün kimliği içindeki her bir rakam, marka, renk gibi ürün hakkında bilgi verebilir.
for k in range(1,10):
train[f'digit{k}'] = ((train['Weight Capacity (kg)'] * 10**k) % 10).fillna(-1).astype("int8")
Kategorik Sütunların Kombinasyonu
Veri setimizde sekiz kategorik sütun bulunmaktadır (Ağırlık Kapasitesi dışındaki sütunlar). Tüm kategorik sütunların kombinasyonları ile 28 yeni kategorik sütun yaratabiliriz. İlk olarak, orijinal kategorik sütunu etiket kodlaması ile -1 NaN olacak şekilde tam sayılara dönüştürdük. Sonrasında bu tam sayıları birleştiriyoruz:
for i,c1 in enumerate(CATS[:-1]):
for j,c2 in enumerate(CATS[i+1:]):
n = f"{c1}_{c2}"
m1 = train[c1].max()+1
m2 = train[c2].max()+1
train[n] = ((train[c1]+1 + (train[c2]+1)
/(m2+1))*(m2+1)).astype("int8")
Orijinal Veri Seti Kullanma
Bu yarışmadaki yapay verilerin üretildiği orijinal veri setini önerilen perakende fiyatı olarak değerlendirebiliriz. Yarışmadaki verileri ise bireysel mağazaların fiyatları olarak düşünebiliriz. Bu şekilde her satıra MSRP bilgisi vererek tahminleri destekleyebiliriz:
tmp = orig.groupby("Weight Capacity (kg)").Price.mean()
tmp.name = "orig_price"
train = train.merge(tmp, on="Weight Capacity (kg)", how="left")
Bölme Özellikleri
Gruplama ile oluşturduğumuz yeni sütunları birleştirerek daha fazla yeni sütun oluşturabiliriz. Örneğin:
# COUNT PER NUNIQUE
X_train['TE1_wc_count_per_nunique'] =
X_train['TE1_wc_count']/X_train['TE1_wc_nunique']
# STD PER COUNT
X_train['TE1_wc_std_per_count'] =
X_train['TE1_wc_std']/X_train['TE1_wc_count']
Sonuç ve Değerlendirme
Bu Kaggle yarışmasında elde edilen birinci sıradaki sonuç yalnızca doğru özellikleri bulmakla ilgili değildi – bulma hızının önemli bir rolü vardı. Özellik mühendisliği, tabular model performansını maksimize etmek için hala çok önemlidir; ancak, CPU’lar kullanılarak yapılan geleneksel yaklaşım genellikle bir sınırla karşılaşmakta ve kapsamlı özellik keşfi pratikte çok yavaş kalmaktadır.
NVIDIA cuDF-pandas, bunun mümkün olanı değiştiriyor. Pandas işlemlerini GPU’da hızlandırarak, yeni özelliklerin kütüphane keşfini ve üretimini drastik olarak azaltılan zaman dilimlerinde gerçekleştirebilmeyi sağlıyor. Bu da en iyi özellikleri bulmamıza ve önceki modellere kıyasla daha doğru modeller oluşturmamıza olanak tanıyor. Bu çözümün kaynak kodunu ve ilgili Kaggle tartışma gönderilerini burada ve burada bulabilirsiniz.
Daha fazla bilgi almak isterseniz, 2025 GTC atölyemizi Özellik Mühendisliği veya Python’da Hızlandırılmış Hesaplamayı Veri Bilimine Taşımak konularında izleyebilirsiniz veya DLI Öğrenim Yolu kurslarına kaydolabilirsiniz.