“NVIDIA cuDF-pandas ile Kaggle Yarışmasında Birincilik Elde Etmek için Özellik Mühendisliği İpuçları”

Ö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.

Kaynak

Nvdia Blog

Exit mobile version