2026’da Makine Öğreniminde Özellik Mühendisliği

ÖZET

Makine Öğreniminde Özellik Mühendisliği Rehberi: Veri Setinizi Modeller İçin Optimize Edin 2026

Makine öğrenimi projelerinde başarı için kritik olan özellik mühendisliğini öğrenin ve veri setinizi modeller için nasıl hazırlayacağınızı keşfedin.

Keywords: Makine Öğrenimi, Özellik Mühendisliği, Veri Optimizasyonu


İÇİNDEKİLER

1. Giriş: Özellik Mühendisliği Neden Kritik?

2. Temel Özellik Mühendisliği Teknikleri

3. Gelişmiş Özellik Mühendisliği Stratejileri

4. Özellik Seçimi Teknikleri: Doğru Özellikleri Belirleme

5. Pratik Uygulama: Bir Ev Fiyatı Tahmin Senaryosu

6. Karşılaşılan Problemler ve Çözümleri

7. Sıkça Sorulan Sorular (SSS)


GİRİŞ

Giriş: Özellik Mühendisliği Neden Kritik?


2026 yılında yapay zeka ve makine öğrenimi projelerinin sayısı hızla artmaya devam ederken, bu projelerin başarısında veri kalitesi ve modelin doğru bilgiyi alması her zamankinden daha önemli hale gelmiştir. “Çöp giren, çöp çıkar” (garbage in, garbage out) prensibi, makine öğrenimi dünyasında özellik mühendisliğinin neden bu kadar kritik olduğunu en iyi şekilde açıklar. Özellik mühendisliği (Feature Engineering), ham veriyi alıp makine öğrenimi modellerinin daha iyi öğrenebileceği, daha anlamlı ve yapılandırılmış özelliklere dönüştürme sanatıdır. Bu süreç, sadece veriyi temizlemekten veya dönüştürmekten ibaret değildir; aynı zamanda alan bilgisi, yaratıcılık ve modelin beklentilerini anlama yeteneğini bir araya getirir.

Bir örnekle açıklayalım: Bir evin fiyatını tahmin etmeye çalışan bir modeliniz olduğunu düşünün. Ham veride evin büyüklüğü (metrekare), oda sayısı, banyo sayısı gibi bilgiler olabilir. Ancak, doğrudan bu özelliklerle çalışmak yerine, “metrekare başına oda sayısı” veya “banyo başına düşen kişi sayısı” gibi yeni, türetilmiş özellikler oluşturabilirsiniz. Bu yeni özellikler, modelin evin değeri üzerindeki daha karmaşık ilişkileri anlamasına yardımcı olabilir. Örneğin, iki evin metrekareleri aynı olsa bile, birinin 3 oda, diğerinin 5 oda olması, metrekare başına oda sayısını değiştirerek modelin daha doğru bir değerlendirme yapmasını sağlayabilir.

Özellik mühendisliği, makine öğrenimi modelinin tahmin doğruluğunu ve performansını doğrudan etkileyen en önemli adımlardan biridir. İyi tasarlanmış özellikler, basit bir modelin bile karmaşık bir modelden daha iyi performans göstermesini sağlayabilir. Bu rehberde, 2026 itibarıyla en güncel ve etkili özellik mühendisliği tekniklerini, pratik Python örnekleriyle birlikte ele alacağız. Amacımız, veri setinizi makine öğrenimi modelleri için nasıl optimize edeceğinizi adım adım göstermek ve projelerinizde başarıyı yakalamanıza yardımcı olmaktır.

ÖNEMLİ NOKTA

Özellik mühendisliği, bir makine öğrenimi projesinin toplam süresinin %60-70’ini kaplayabilir ve model performansını artırmada algoritma seçiminden veya hiperparametre ayarlamasından daha büyük bir etkiye sahip olabilir.


TEMEL TEKNİKLER

Temel Özellik Mühendisliği Teknikleri


Ham veriler genellikle doğrudan makine öğrenimi modellerine beslenemeyecek formatlardadır. Bu bölümde, veri setinizi modeller için daha anlaşılır hale getirecek temel özellik mühendisliği tekniklerini inceleyeceğiz.

1. Kategorik Veri İşleme

Kategorik veriler, sınırlı sayıda olası değere sahip olan ve genellikle metin formatında olan verilerdir (örn. “Kırmızı”, “Mavi”, “Yeşil” veya “Kadın”, “Erkek”). Modellerin çoğu sayısal girdi beklediğinden, bu verileri sayısal formata dönüştürmemiz gerekir.

One-Hot Encoding

Bu teknik, her kategorik değer için yeni bir ikili (0 veya 1) özellik sütunu oluşturur. Eğer bir gözlem belirli bir kategoriye aitse, o kategoriye karşılık gelen sütunda 1, diğerlerinde 0 olur. Bu yöntem, kategoriler arasında doğal bir sıralama (ordinalite) olmadığında tercih edilir ve modelin yanlış bir sıralama varsaymasını engeller. Örneğin, “Şehir” özelliği için “İstanbul”, “Ankara”, “İzmir” değerleri varsa, One-Hot Encoding sonrası üç yeni sütun oluşur: “Şehir_İstanbul”, “Şehir_Ankara”, “Şehir_İzmir”.

KOD AÇIKLAMASI

Pandas kütüphanesinin get_dummies() fonksiyonunu kullanarak bir DataFrame’deki ‘Renk’ sütununu One-Hot Encoding işlemine tabi tutuyoruz. Bu, her bir renk değeri için yeni, ikili sütunlar oluşturacaktır.

import pandas as pd

# Örnek veri seti
data = {'ID': [1, 2, 3, 4],
        'Renk': ['Kırmızı', 'Mavi', 'Kırmızı', 'Yeşil'],
        'Değer': [10, 20, 15, 25]}
df = pd.DataFrame(data)

print("Orijinal DataFrame:")
print(df)
print("\n")

# 'Renk' sütununa One-Hot Encoding uygulama
df_encoded = pd.get_dummies(df, columns=['Renk'], prefix='Renk')

print("One-Hot Encoded DataFrame:")
print(df_encoded)

Yukarıdaki çıktıya baktığınızda, ‘Renk’ sütununun yerine ‘Renk_Kırmızı’, ‘Renk_Mavi’ ve ‘Renk_Yeşil’ adında üç yeni sütun oluştuğunu göreceksiniz. Bu, modelin kategorik bilgileri sayısal olarak işlemesini sağlar.

Label Encoding

Label Encoding, her kategoriye benzersiz bir tam sayı değeri atar (örn. “Küçük”: 0, “Orta”: 1, “Büyük”: 2). Bu yöntem, kategoriler arasında doğal bir sıralama olduğunda (ordinal veriler) kullanışlıdır. Ancak, kategoriler arasında sıralama yoksa (nominal veriler) kullanılması, modelin bu sayılar arasında yanlış bir sıralama ilişkisi olduğunu varsaymasına neden olabilir, bu da performansı düşürebilir. Örneğin, “Eğitim Seviyesi” (İlk, Orta, Lisans, Yüksek Lisans) gibi sıralı verilerde tercih edilebilir.

KOD AÇIKLAMASI

Scikit-learn kütüphanesinin LabelEncoder sınıfını kullanarak ‘Boyut’ sütunundaki kategorik değerleri sayısal değerlere dönüştürüyoruz. Burada ‘Küçük’, ‘Orta’, ‘Büyük’ arasında doğal bir sıralama varsayımı yapıyoruz.

from sklearn.preprocessing import LabelEncoder
import pandas as pd

data = {'ID': [1, 2, 3, 4],
        'Boyut': ['Küçük', 'Orta', 'Büyük', 'Orta'],
        'Fiyat': [100, 200, 300, 250]}
df = pd.DataFrame(data)

print("Orijinal DataFrame:")
print(df)
print("\n")

le = LabelEncoder()
df['Boyut_Encoded'] = le.fit_transform(df['Boyut'])

print("Label Encoded DataFrame:")
print(df)

2. Sayısal Veri İşleme

Sayısal veriler genellikle farklı ölçeklerde ve dağılımlarda olabilir. Bu durum, bazı makine öğrenimi algoritmalarının (özellikle mesafe tabanlı algoritmalar) performansını olumsuz etkileyebilir.

Normalizasyon (Min-Max Scaling) ve Standardizasyon (Z-score Scaling)

Normalizasyon (Min-Max Scaling): Veriyi belirli bir aralığa (genellikle 0 ile 1 arasına) ölçekler. Formülü: (x - min) / (max - min). Aykırı değerlere karşı hassastır.

Standardizasyon (Z-score Scaling): Veriyi ortalama 0 ve standart sapma 1 olacak şekilde ölçekler. Formülü: (x - mean) / std_dev. Aykırı değerlere karşı daha dayanıklıdır ve normal dağılıma sahip veriler için uygundur. Destek Vektör Makineleri (SVM), Lojistik Regresyon ve Sinir Ağları gibi algoritmalar genellikle standardize edilmiş verilerle daha iyi performans gösterir.

KOD AÇIKLAMASI

Bir örnek sayısal sütunu hem Min-Max Normalizasyonu hem de Standardizasyon teknikleriyle dönüştürüyoruz. MinMaxScaler ve StandardScaler sınıflarını kullanıyoruz.

from sklearn.preprocessing import MinMaxScaler, StandardScaler
import pandas as pd

data = {'ID': [1, 2, 3, 4, 5],
        'Gelir': [20000, 35000, 100000, 15000, 50000]}
df = pd.DataFrame(data)

print("Orijinal DataFrame:")
print(df)
print("\n")

# Min-Max Normalizasyonu
scaler_minmax = MinMaxScaler()
df['Gelir_MinMax'] = scaler_minmax.fit_transform(df[['Gelir']])

# Standardizasyon
scaler_std = StandardScaler()
df['Gelir_Std'] = scaler_std.fit_transform(df[['Gelir']])

print("Normalleştirilmiş ve Standardize Edilmiş DataFrame:")
print(df)

Binning (Kovalamaca)

Sayısal bir özelliği belirli aralıklara (bin’lere) bölerek kategorik bir özelliğe dönüştürme işlemidir. Örneğin, “Yaş” özelliğini “Genç”, “Orta Yaşlı”, “Yaşlı” gibi gruplara ayırabiliriz. Bu, aykırı değerlerin etkisini azaltmaya ve doğrusal olmayan ilişkileri yakalamaya yardımcı olabilir. pd.cut() veya pd.qcut() fonksiyonları bu işlem için kullanılır.

3. Tarih-Saat Veri İşleme

Tarih ve saat bilgileri, genellikle bir model için doğrudan kullanılamaz ancak birçok önemli deseni barındırır. Bu verilerden yeni özellikler türetmek, modelin zamana bağlı eğilimleri veya mevsimsellikleri öğrenmesine yardımcı olabilir.

Yıl, Ay, Gün, Hafta Günü Çıkarma

Bir tarih sütunundan yıl, ay, gün, hafta günü, günün saati gibi bileşenleri ayrı ayrı özelliklere dönüştürmek yaygın bir tekniktir. Bu, modelin belirli zaman periyotlarındaki davranışları öğrenmesine olanak tanır. Örneğin, bir satış verisinde, ay ve hafta günü özellikleri, ayın belirli dönemlerinde veya haftanın belirli günlerinde satışların nasıl değiştiğini gösterebilir.

KOD AÇIKLAMASI

Pandas datetime fonksiyonelliğini kullanarak bir ‘Tarih’ sütunundan yıl, ay, gün, hafta günü ve günün saati gibi bilgileri çıkarıyoruz. Bu, zaman serisi analizlerinde oldukça önemlidir.

import pandas as pd

data = {'IslemID': [1, 2, 3, 4],
        'Tarih': ['2026-01-15 10:30:00', '2026-02-20 14:00:00', '2026-03-25 08:15:00', '2026-04-10 17:45:00'],
        'Tutar': [150, 200, 120, 300]}
df = pd.DataFrame(data)

print("Orijinal DataFrame:")
print(df)
print("\n")

# 'Tarih' sütununu datetime objesine dönüştürme
df['Tarih'] = pd.to_datetime(df['Tarih'])

# Yeni özellikler türetme
df['Yıl'] = df['Tarih'].dt.year
df['Ay'] = df['Tarih'].dt.month
df['Gün'] = df['Tarih'].dt.day
df['HaftaGünü'] = df['Tarih'].dt.dayofweek # Pazartesi=0, Pazar=6
df['Saat'] = df['Tarih'].dt.hour

print("Tarih-Saat Özellikleri Çıkarılmış DataFrame:")
print(df)

ÖNEMLİ NOKTA

Tarih-saat özelliklerini türetirken, mevsimsellik veya döngüsellik içeren veriler için sinüs ve kosinüs dönüşümleri kullanmak, modelin bu döngüsel ilişkileri daha iyi yakalamasına yardımcı olabilir.

Farklı veri türlerinin özelliklere dönüştürülmesi diyagramı


GELİŞMİŞ STRATEJİLER

Gelişmiş Özellik Mühendisliği Stratejileri


Veri setinizdeki gizli ilişkileri ve karmaşık desenleri ortaya çıkarmak için daha gelişmiş özellik mühendisliği tekniklerine ihtiyaç duyabiliriz. Bu stratejiler, modelin öğrenme kapasitesini önemli ölçüde artırabilir.

1. Etkileşim Özellikleri (Interaction Features)

Etkileşim özellikleri, iki veya daha fazla mevcut özelliğin birleştirilmesiyle oluşturulur. Bu birleşim genellikle çarpma, toplama veya bölme işlemleriyle yapılır. Amaç, tek tek özelliklerin açıklayamadığı, ancak bir araya geldiklerinde anlam kazanan ilişkileri yakalamaktır. Örneğin, ev fiyatı tahmininde “metrekare” ve “oda sayısı” özelliklerinin çarpımıyla “metrekare başına oda” gibi bir özellik oluşturmak, evin yoğunluğunu veya ferahlığını daha iyi temsil edebilir.

KOD AÇIKLAMASI

‘Metrekare’ ve ‘OdaSayısı’ sütunlarını çarparak yeni bir ‘Metrekare_x_OdaSayısı’ etkileşim özelliği oluşturuyoruz. Bu, modelin evin büyüklüğü ve oda sayısı arasındaki kombinasyonel etkiyi anlamasına yardımcı olabilir.

import pandas as pd

data = {'ID': [1, 2, 3],
        'Metrekare': [100, 150, 80],
        'OdaSayısı': [2, 3, 1],
        'BanyoSayısı': [1, 2, 1]}
df = pd.DataFrame(data)

print("Orijinal DataFrame:")
print(df)
print("\n")

# Etkileşim özelliği oluşturma
df['Metrekare_x_OdaSayısı'] = df['Metrekare'] * df['OdaSayısı']
df['Metrekare_Bol_Banyo'] = df['Metrekare'] / df['BanyoSayısı']

print("Etkileşim Özellikleri Eklenmiş DataFrame:")
print(df)

2. Polinomsal Özellikler (Polynomial Features)

Polinomsal özellikler, mevcut özelliklerin üstel formlarını (örn. x^2, x^3) veya mevcut özelliklerin çarpımlarını (örn. x*y) oluşturarak doğrusal olmayan ilişkileri yakalamaya yardımcı olur. Bu, özellikle doğrusal modellerin karmaşık ilişkileri modellemesini sağlar. Örneğin, bir ürünün yaşa bağlı olarak satışları doğrusal değil, parabolik bir eğri izliyorsa, yaşın karesini bir özellik olarak eklemek modeli iyileştirebilir.

KOD AÇIKLAMASI

PolynomialFeatures kullanarak ‘Yaş’ sütunundan ikinci dereceden (degree=2) polinom özellikleri türetiyoruz. Bu, yaşın karesi ve orijinal yaş gibi yeni özellikler oluşturur.

from sklearn.preprocessing import PolynomialFeatures
import pandas as pd

data = {'ID': [1, 2, 3],
        'Yaş': [25, 40, 60],
        'Gelir': [50000, 75000, 40000]}
df = pd.DataFrame(data)

print("Orijinal DataFrame:")
print(df)
print("\n")

# Polinomsal özellikler oluşturma (degree=2)
poly = PolynomialFeatures(degree=2, include_bias=False)
poly_features = poly.fit_transform(df[['Yaş', 'Gelir']])
poly_df = pd.DataFrame(poly_features, columns=poly.get_feature_names_out(['Yaş', 'Gelir']))

df_poly = pd.concat([df, poly_df], axis=1)

print("Polinomsal Özellikler Eklenmiş DataFrame:")
print(df_poly)

3. Zaman Serisi Özellikleri

Zaman serisi verileri, doğal olarak zamana bağlı desenler içerir. Bu desenleri yakalamak için özel özellikler türetmek gerekir.

Gecikmeli Değerler (Lag Features)

Bir zaman serisindeki bir gözlemin önceki zaman adımlarındaki değerlerini yeni özellikler olarak kullanmaktır. Örneğin, bugünün satışlarını tahmin etmek için dünkü veya geçen haftaki satış değerlerini kullanmak. Bu, modelin zaman içindeki bağımlılıkları öğrenmesine yardımcı olur ve birçok zaman serisi tahmin modelinde temel bir özelliktir. Örneğin, 2026 yılındaki bir hisse senedinin fiyatını tahmin ederken, önceki 5 günün kapanış fiyatlarını gecikmeli özellikler olarak eklemek, modelin piyasa dinamiklerini daha iyi anlamasını sağlayabilir.

Hareketli Ortalamalar (Moving Averages)

Belirli bir pencere içindeki gözlemlerin ortalamasını alarak yeni bir özellik oluşturmaktır. Bu, kısa vadeli dalgalanmaları düzeltir ve uzun vadeli eğilimleri ortaya çıkarır. Hareketli ortalamalar, zaman serisi verilerindeki gürültüyü azaltarak temel deseni daha belirgin hale getirir.

KOD AÇIKLAMASI

Bir ‘Satış’ sütunu için 1 ve 7 günlük gecikmeli değerler ile 3 günlük hareketli ortalama özelliklerini oluşturuyoruz. Bu, zaman serisi analizlerinde modelin geçmiş verilerden öğrenmesini sağlar.

import pandas as pd

data = {'Tarih': pd.to_datetime(['2026-01-01', '2026-01-02', '2026-01-03', '2026-01-04', '2026-01-05', '2026-01-06', '2026-01-07', '2026-01-08', '2026-01-09']),
        'Satış': [10, 12, 15, 13, 18, 20, 22, 19, 25]}
df = pd.DataFrame(data)
df = df.set_index('Tarih')

print("Orijinal DataFrame:")
print(df)
print("\n")

# 1 gün gecikmeli satış
df['Satış_Lag1'] = df['Satış'].shift(1)

# 7 gün gecikmeli satış
df['Satış_Lag7'] = df['Satış'].shift(7)

# 3 günlük hareketli ortalama
df['Satış_MA3'] = df['Satış'].rolling(window=3).mean()

print("Zaman Serisi Özellikleri Eklenmiş DataFrame:")
print(df)

4. Boyut Azaltma Teknikleri (Dimensionality Reduction)

Çok sayıda özelliğe sahip olmak, “boyut laneti”ne (curse of dimensionality) yol açabilir. Bu durum, modelin genelleme yeteneğini azaltabilir ve eğitim süresini uzatabilir. Boyut azaltma teknikleri, veri setindeki önemli bilgiyi koruyarak özellik sayısını düşürmeyi amaçlar.

Temel Bileşen Analizi (PCA – Principal Component Analysis)

PCA, bir veri setindeki en büyük varyansı açıklayan yeni, ortogonal (ilişkisiz) özellikler (temel bileşenler) oluşturur. Bu, orijinal özelliklerin doğrusal bir kombinasyonudur. PCA, verinin yapısını anlamak, gürültüyü azaltmak ve aşırı uydurmayı önlemek için güçlü bir tekniktir. Örneğin, 100 farklı sensörden gelen veriyi, PCA kullanarak birkaç temel bileşene indirgeyebilir ve hala önemli bilgiyi koruyabiliriz. Bu, özellikle görüntü işleme veya genetik veriler gibi yüksek boyutlu veri setlerinde yaygın olarak kullanılır.

KOD AÇIKLAMASI

Scikit-learn’den PCA kullanarak bir veri setinin boyutunu iki temel bileşene indirgiyoruz. Bu, daha az özellik ile verinin ana varyansını korumayı hedefler.

from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
import pandas as pd
import numpy as np

# Örnek veri seti (yüksek boyutlu)
np.random.seed(42)
data = np.random.rand(100, 10) # 100 gözlem, 10 özellik
df = pd.DataFrame(data, columns=[f'feature_{i}' for i in range(10)])

print("Orijinal DataFrame boyutu:", df.shape)
print("\n")

# Veriyi standardize etme (PCA öncesi önemli)
scaler = StandardScaler()
scaled_data = scaler.fit_transform(df)

# PCA uygulama, 2 ana bileşenle
pca = PCA(n_components=2)
principal_components = pca.fit_transform(scaled_data)

# Yeni DataFrame oluşturma
df_pca = pd.DataFrame(data=principal_components, columns=['PC1', 'PC2'])

print("PCA sonrası DataFrame boyutu:", df_pca.shape)
print("İlk 5 satır:")
print(df_pca.head())
print("\nAçıklanan varyans oranı:", pca.explained_variance_ratio_)
print("Toplam açıklanan varyans:", sum(pca.explained_variance_ratio_))

Yukarıdaki örnekte, 10 özellikli bir veri setini 2 temel bileşene indirgedik. pca.explained_variance_ratio_, her bir temel bileşenin orijinal veri setindeki varyansın ne kadarını açıkladığını gösterir. Toplam açıklanan varyans, boyut azaltma işleminden sonra ne kadar bilgi kaybettiğimizi anlamamıza yardımcı olur.

ÖNEMLİ NOKTA

PCA uygulamadan önce verilerinizi standardize etmek kritik öneme sahiptir. Aksi takdirde, daha büyük ölçekli özellikler, varyansa orantısız şekilde etki ederek PCA’nın sonuçlarını yanıltabilir.

PCA görselleştirmesi: Veri noktaları ve temel bileşenlere projeksiyonu


ÖZELLİK SEÇİMİ

Özellik Seçimi Teknikleri: Doğru Özellikleri Belirleme


Özellik mühendisliği ile birçok yeni özellik oluşturduktan sonra, tüm bu özelliklerin model için faydalı olup olmadığını değerlendirmemiz gerekir. Gereksiz veya gürültülü özellikler, modelin performansını düşürebilir, eğitim süresini uzatabilir ve aşırı uydurmaya yol açabilir. Özellik seçimi, en alakalı ve bilgilendirici özellikleri belirleyerek bu sorunları çözmeyi amaçlar.

1. Filtre Yöntemleri (Filter Methods)

Filtre yöntemleri, modelden bağımsız olarak özelliklerin hedef değişkenle olan istatistiksel ilişkisine göre puanlanmasına dayanır. Genellikle hızlıdır ve hesaplama açısından daha ucuzdur. En yaygın kullanılanları korelasyon ve Ki-kare testidir.

Korelasyon

Sayısal özellikler ile hedef değişken arasındaki doğrusal ilişkiyi ölçer. Yüksek korelasyonlu özellikler genellikle daha bilgilendiricidir. Ancak, özellikler arası yüksek korelasyon (multicollinearity) modeller için sorun yaratabilir, bu nedenle bazen yüksek korelasyonlu özelliklerden birini elemek gerekebilir.

Ki-Kare Testi (Chi-squared Test)

Kategorik özellikler ile kategorik hedef değişken arasındaki bağımsızlığı test eder. Yüksek Ki-kare değeri, özelliğin hedef değişkenle daha güçlü bir ilişkisi olduğunu gösterir.

KOD AÇIKLAMASI

Bir veri setindeki özelliklerin hedef değişkenle olan korelasyonunu hesaplıyoruz. Bu, hangi özelliklerin hedefi tahmin etmede daha güçlü doğrusal bir ilişkiye sahip olduğunu gösterir.

import pandas as pd
import numpy as np

# Örnek veri seti
np.random.seed(42)
data = {'feature_1': np.random.rand(100),
        'feature_2': np.random.rand(100) * 10,
        'feature_3': np.random.randint(0, 2, 100), # Kategorik gibi
        'target': np.random.rand(100) * 5 + np.random.rand(100) * 2}
df = pd.DataFrame(data)

# 'target' ile korelasyonları hesaplama
correlations = df.corr()['target'].sort_values(ascending=False)

print("Hedef değişken ile özellik korelasyonları:")
print(correlations)

2. Sarmalayıcı Yöntemler (Wrapper Methods)

Sarmalayıcı yöntemler, belirli bir makine öğrenimi modelini kullanarak özellik alt kümelerinin performansını değerlendirir. Bu yöntemler, model performansına doğrudan odaklandığı için filtre yöntemlerinden daha iyi sonuçlar verebilir ancak hesaplama açısından daha yoğundur.

Geriye Doğru Eleme (Backward Elimination)

Tüm özelliklerle başlar ve her adımda en az anlamlı özelliği (modelin performansını en az etkileyen) çıkarır, ta ki belirli bir kriter karşılanana kadar. Örneğin, bir regresyon modelinde p-değeri en yüksek olan özelliği eleyebiliriz.

İleriye Doğru Seçim (Forward Selection)

Boş bir özellik kümesiyle başlar ve her adımda model performansını en çok artıran özelliği ekler, ta ki belirli bir kriter karşılanana kadar.

3. Gömülü Yöntemler (Embedded Methods)

Gömülü yöntemler, özellik seçimini model eğitim sürecinin bir parçası olarak entegre eder. Bu yöntemler, hem filtre hem de sarmalayıcı yöntemlerin avantajlarını birleştirir: modelin doğruluğunu optimize etmeye çalışırken hesaplama açısından verimlidirler. Karar ağacı tabanlı modeller (Random Forest, Gradient Boosting) ve düzenlileştirilmiş doğrusal modeller (Lasso, Ridge) bu kategoriye girer.

Lasso Regresyonu (L1 Düzenlileştirme)

Lasso (Least Absolute Shrinkage and Selection Operator), bazı özelliklerin katsayılarını sıfıra indirme eğilimindedir. Bu, etkili bir özellik seçimi mekanizması sağlar; katsayısı sıfır olan özellikler modelden çıkarılmış olur. Örneğin, 50 özellikli bir veri setinde Lasso regresyonu uyguladığımızda, model 20 özelliğin katsayısını sıfır yapabilir ve böylece en önemli 30 özelliği otomatik olarak seçmiş olur.

KOD AÇIKLAMASI

Scikit-learn’den SelectFromModel ve LassoCV kullanarak en önemli özellikleri seçiyoruz. Lasso, katsayıları sıfıra yaklaştırarak etkili bir özellik seçimi yapar.

from sklearn.linear_model import LassoCV
from sklearn.feature_selection import SelectFromModel
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
import pandas as pd
import numpy as np

# Örnek veri seti oluşturma
np.random.seed(42)
X = np.random.rand(100, 10) # 10 özellik
y = X[:, 0] * 2 + X[:, 3] * 5 - X[:, 7] * 3 + np.random.randn(100) * 0.5 # Sadece bazı özellikler önemli

df_X = pd.DataFrame(X, columns=[f'feature_{i}' for i in range(10)])
df_y = pd.Series(y, name='target')

# Veriyi ölçekleme
scaler = StandardScaler()
X_scaled = scaler.fit_transform(df_X)

# LassoCV modelini eğitme
lasso = LassoCV(cv=5, random_state=42).fit(X_scaled, df_y)

# Özellik seçimi için bir eşik belirleme (örn. ortalama katsayıdan daha büyük olanlar)
model = SelectFromModel(lasso, prefit=True, threshold='mean')
X_selected = model.transform(X_scaled)

selected_features_indices = model.get_support(indices=True)
selected_feature_names = df_X.columns[selected_features_indices]

print("Orijinal özellik sayısı:", df_X.shape[1])
print("Seçilen özellik sayısı:", X_selected.shape[1])
print("Seçilen özellikler:", selected_feature_names.tolist())
print("Lasso katsayıları:")
print(pd.Series(lasso.coef_, index=df_X.columns).sort_values(key=abs, ascending=False))

Yukarıdaki çıktıdan, Lasso regresyonunun hangi özelliklerin katsayılarını sıfıra yaklaştırdığını ve dolayısıyla hangi özelliklerin model için daha az önemli olduğunu görebilirsiniz. SelectFromModel ile belirli bir eşiğe göre en önemli özellikleri otomatik olarak seçebiliriz.

ÖNEMLİ NOKTA

Özellik seçimi, modelin yorumlanabilirliğini artırır, eğitim süresini kısaltır ve aşırı uydurmayı azaltarak genelleme yeteneğini geliştirir. Her zaman tüm özellikleri kullanmak en iyi çözüm değildir.

Özellik önemi sıralama grafiği


PRATİK UYGULAMA

Pratik Uygulama: Bir Ev Fiyatı Tahmin Senaryosu


Şimdiye kadar öğrendiğimiz özellikleri bir araya getirerek, gerçek dünya benzeri bir senaryoda özellik mühendisliğinin nasıl uygulandığını görelim: Ev Fiyatı Tahmini. Amacımız, mevcut ham verilerden anlamlı özellikler türeterek bir regresyon modelinin tahmin performansını artırmaktır.

Senaryo: Ev Fiyatı Tahmini

Problem — Bir emlak şirketinin elindeki ev verilerini kullanarak yeni evlerin satış fiyatlarını doğru bir şekilde tahmin etmek.

Ham Veri — Metrekare, Oda Sayısı, Banyo Sayısı, Yapım Yılı, Mahalle, Isıtma Tipi gibi özellikler.

Adım 1: Veri Yükleme ve Ön İşleme

İlk olarak, örnek bir veri seti oluşturalım ve temel ön işlemeleri yapalım.

KOD AÇIKLAMASI

Örnek bir ev fiyatı veri seti oluşturuyoruz. Bu veri seti, ‘Metrekare’, ‘OdaSayısı’, ‘BanyoSayısı’, ‘YapımYılı’, ‘Mahalle’ ve ‘Fiyat’ sütunlarını içeriyor.

import pandas as pd
import numpy as np

# Örnek veri seti oluşturma
data = {
    'Metrekare': [100, 120, 80, 150, 90, 110, 130, 70, 140, 105],
    'OdaSayısı': [2, 3, 1, 4, 2, 3, 3, 1, 4, 2],
    'BanyoSayısı': [1, 2, 1, 2, 1, 1, 2, 1, 2, 1],
    'YapımYılı': [2000, 1995, 2010, 2005, 2015, 1998, 2003, 2012, 1990, 2008],
    'Mahalle': ['A', 'B', 'A', 'C', 'B', 'A', 'C', 'B', 'A', 'C'],
    'Fiyat': [300000, 450000, 250000, 600000, 380000, 320000, 500000, 220000, 550000, 400000]
}
df = pd.DataFrame(data)

print("Orijinal Veri Seti:")
print(df.head())
print("\n")

Adım 2: Özellik Mühendisliği Uygulaması

Şimdi, bu veri seti üzerinde çeşitli özellik mühendisliği tekniklerini uygulayalım:

Uygulama Örneği Açıklaması

Bu adımda, yaş, yenileme durumu, metrekare başına oda sayısı gibi yeni özellikler oluşturacağız. Ayrıca kategorik ‘Mahalle’ özelliğini One-Hot Encoding ile dönüştüreceğiz.

KOD AÇIKLAMASI

Mevcut ‘YapımYılı’ özelliğinden ‘EvYaşı’ ve ‘YenilenmeDurumu’ gibi yeni özellikler türetiyoruz. Ayrıca, ‘Metrekare’ ve ‘OdaSayısı’ ile ‘Metrekare_x_OdaSayısı’ etkileşim özelliğini oluşturup ‘Mahalle’ sütununa One-Hot Encoding uyguluyoruz.

# 1. Ev Yaşı ve Yenilenme Durumu
current_year = 2026
df['EvYaşı'] = current_year - df['YapımYılı']
df['YenilenmeDurumu'] = np.where(df['YapımYılı'] > (current_year - 10), 1, 0) # Son 10 yılda yapıldıysa yeni kabul et

# 2. Etkileşim Özellikleri
df['Metrekare_x_OdaSayısı'] = df['Metrekare'] * df['OdaSayısı']
df['Metrekare_Bol_Oda'] = df['Metrekare'] / df['OdaSayısı']

# 3. Kategorik Özellik İşleme (One-Hot Encoding)
df = pd.get_dummies(df, columns=['Mahalle'], prefix='Mahalle')

print("Özellik Mühendisliği Uygulanmış Veri Seti:")
print(df.head())
print("\n")

Adım 3: Model Eğitimi ve Değerlendirme

Özellik mühendisliği uygulanmış veri setimizle bir model eğitelim ve performansını değerlendirelim. Basitlik adına bir Doğrusal Regresyon modeli kullanacağız.

KOD AÇIKLAMASI

Özellik mühendisliği uygulanmış veri setini eğitim ve test kümelerine ayırıyoruz, ardından bir LinearRegression modeli eğitiyor ve R-kare skorunu hesaplayarak model performansını değerlendiriyoruz.

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score, mean_absolute_error

# Hedef ve özellik değişkenlerini ayırma
X = df.drop(['Fiyat', 'YapımYılı'], axis=1) # YapımYılı'nı çıkardık çünkü EvYaşı'nı türettik
y = df['Fiyat']

# Veriyi eğitim ve test kümelerine ayırma
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Modeli eğitme
model = LinearRegression()
model.fit(X_train, y_train)

# Tahmin yapma
y_pred = model.predict(X_test)

# Performansı değerlendirme
r2 = r2_score(y_test, y_pred)
mae = mean_absolute_error(y_test, y_pred)

print(f"Model R-kare Skoru: {r2:.2f}")
print(f"Model Ortalama Mutlak Hata (MAE): {mae:.2f}")

Bu örnek, özellik mühendisliğinin ham veriden nasıl daha anlamlı bilgiler çıkarabildiğini ve model performansını potansiyel olarak nasıl artırabildiğini göstermektedir. Gerçek bir projede, bu adımlar daha karmaşık veri setleri ve daha gelişmiş modellerle tekrarlanır ve farklı özellik mühendisliği yaklaşımları denenerek en iyi performans elde edilmeye çalışılır.

ÖNEMLİ NOKTA

Model performansını değerlendirirken sadece R-kare gibi tek bir metrike odaklanmayın. Ortalama Mutlak Hata (MAE) veya Ortalama Kare Hata (RMSE) gibi farklı metrikler, modelin tahminlerindeki hata büyüklüğü hakkında daha fazla bilgi sağlayabilir.

Veri işlem hattı diyagramı: Ham veri, özellik mühendisliği, model eğitimi ve değerlendirme


PROBLEMLER & ÇÖZÜMLER

Karşılaşılan Problemler ve Çözümleri


Özellik mühendisliği süreci, birçok fayda sağlasa da, beraberinde bazı zorlukları da getirir. Bu zorlukları anlamak ve doğru çözümleri uygulamak, projelerinizin başarısı için hayati öneme sahiptir.

SORUN 01

Aşırı Uydurma (Overfitting)

Çok fazla özellik oluşturmak veya gereksiz özellikler eklemek, modelin eğitim verisine aşırı derecede uyum sağlamasına ve yeni, görünmeyen verilere genelleme yapma yeteneğini kaybetmesine neden olabilir. Bu, modelin test verilerinde düşük performans göstermesiyle sonuçlanır.

ÇÖZÜM — Özellik Seçimi ve Düzenlileştirme

Özellik seçimi teknikleri (filtre, sarmalayıcı, gömülü yöntemler) kullanarak en alakalı özellikleri belirleyin ve gereksiz olanları eleyin. Ayrıca, Lasso (L1) veya Ridge (L2) gibi düzenlileştirme teknikleri içeren modeller kullanmak, modelin karmaşıklığını azaltarak aşırı uydurmayı önleyebilir. Bu teknikler, modelin katsayılarını küçülterek veya sıfırlayarak özelliklerin etkisini sınırlar.


SORUN 02

Eksik Veri (Missing Data)

Veri setlerinde eksik değerler olması yaygın bir durumdur ve birçok makine öğrenimi algoritması eksik değerleri doğrudan işleyemez. Eksik veriler, özellik mühendisliği sürecini de karmaşıklaştırır.

ÇÖZÜM — Doldurma (Imputation) Stratejileri

Eksik değerleri, ilgili sütunun ortalaması, medyanı veya modu ile doldurmak en basit yöntemlerdendir. Daha gelişmiş yaklaşımlar arasında k-NN (k-En Yakın Komşu) doldurma, regresyon ile doldurma veya makine öğrenimi modelleri kullanarak eksik değerleri tahmin etme bulunur. Eğer eksik veri oranı çok yüksekse (%70’ten fazla gibi), o özelliğin tamamen çıkarılması da bir seçenek olabilir.


SORUN 03

Aykırı Değerler (Outliers)

Aykırı değerler, veri setindeki diğer gözlemlerden önemli ölçüde farklı olan veri noktalarıdır. Bunlar, modelin eğitimini bozabilir, istatistiksel analizleri çarpıtabilir ve özellik mühendisliği tekniklerinin (örn. normalizasyon) etkinliğini azaltabilir.

ÇÖZÜM — Tespit ve İşleme

Aykırı değerleri tespit etmek için kutu grafikleri (boxplot), dağılım grafikleri (scatterplot), Z-skoru veya IQR (Interquartile Range) yöntemleri kullanılabilir. İşleme stratejileri arasında aykırı değerleri kaldırma, belirli bir eşiğe kırpma (capping/winsorization) veya logaritmik dönüşüm gibi veri dönüşümleri yer alır. Örneğin, geliri 1.000.000 TL olan bir kişiyi, ortalama geliri 50.000 TL olan bir veri setinden çıkarmak veya gelirini 200.000 TL ile sınırlamak gerekebilir.


SORUN 04

Ölçekleme Sorunları (Scaling Issues)

Farklı özelliklerin çok farklı ölçeklerde olması (örn. bir özellik 0-100 arasında, diğeri 1000-100000 arasında), bazı algoritmaların (mesafe tabanlı algoritmalar, gradyan iniş kullananlar) daha büyük ölçekli özelliklere orantısız şekilde odaklanmasına neden olabilir.

ÇÖZÜM — Normalizasyon ve Standardizasyon

Daha önce bahsettiğimiz gibi, Min-Max Normalizasyonu veya Standardizasyon gibi ölçekleme teknikleri bu sorunu çözer. Bu işlemler, tüm özelliklerin benzer bir ölçekte olmasını sağlayarak modelin tüm özelliklere adil bir şekilde odaklanmasına yardımcı olur. Hangi ölçekleme yönteminin kullanılacağı, verinin dağılımına ve kullanılacak makine öğrenimi algoritmasına bağlıdır.

ÖNEMLİ NOKTA

Herhangi bir özellik mühendisliği tekniğini uygularken, eğitim verisi üzerinde fit() metodunu kullanmalı ve test verisine sadece transform() metodunu uygulamalısınız. Bu, veri sızıntısını (data leakage) önler ve modelin genelleme yeteneğini korur.

Veri sorunları ve çözüm yöntemleri görseli


Sıkça Sorulan Sorular (SSS)

Q. Özellik mühendisliği neden bu kadar önemli?

Özellik mühendisliği, ham veriyi makine öğrenimi modellerinin daha iyi öğrenebileceği ve daha doğru tahminler yapabileceği anlamlı özelliklere dönüştürdüğü için kritiktir. Model performansını doğrudan etkiler ve bazen algoritma seçiminden daha büyük bir etkiye sahip olabilir.

Q. Hangi özellik mühendisliği tekniğini ne zaman kullanmalıyım?

Teknik seçimi, veri tipinize (kategorik, sayısal, tarih-saat) ve modelinize bağlıdır. Kategorik veriler için One-Hot Encoding veya Label Encoding, sayısal veriler için normalizasyon/standardizasyon yaygındır. Zaman serileri için gecikmeli değerler ve hareketli ortalamalar etkili olabilir. En iyi teknik genellikle deneme yanılma ve alan bilgisiyle bulunur.

Q. Özellik mühendisliği aşırı uydurmaya yol açar mı?

Evet, çok fazla veya gereksiz özellik oluşturmak aşırı uydurmaya neden olabilir. Bu nedenle, özellik seçimi ve düzenlileştirme tekniklerini kullanarak en alakalı özellikleri belirlemek ve modelin karmaşıklığını kontrol altında tutmak önemlidir.

Q. Özellik mühendisliği için hangi Python kütüphaneleri önerilir?

Pandas veri manipülasyonu için vazgeçilmezdir. Scikit-learn, preprocessing modülüyle normalizasyon, standardizasyon, kategorik encoding gibi birçok araç sunar. Ayrıca feature_selection modülü de özellik seçimi için faydalıdır.


Okuduğunuz için teşekkürler!

Umarız bu rehber, makine öğrenimi projelerinizde özellik mühendisliğinin gücünü anlamanıza ve uygulamanıza yardımcı olmuştur. Veri setinizi optimize etmek, her zaman model performansını artırmanın anahtarıdır.

Sorularınız mı var? Yorum bırakın veya Kwontrol.com adresini ziyaret edin!