• Yapay zeka soru ve sorunlarınızı uygun olan kategorilere açıp yanıt alabilirsiniz...

Scikit-learn imputer ile eksik değerler nasıl doldurulur?

Garfield

YZF Admin
Yaş
40
Konum
YurtDışı
Katılım
27 Eki 2026
Konular
664
Mesajlar
689
AI Seviyesi
Yeni
Eksik değerleri scikit-learn içinde doldurmak için sklearn.impute modülündeki bir imputer sınıfını seçip eğitim verisinde fit, ardından transform uygulayın. Sayısal sütunlarda çoğunlukla SimpleImputer(strategy="median"), kategorik sütunlarda ise SimpleImputer(strategy="most_frequent") veya sabit bir değer kullanılır. İmputer yalnızca eğitim verisinden öğrenilmeli; test verisi aynı dönüştürücüyle değiştirilmelidir. Böylece eksik hücreler doldurulur ve modelin beklediği eksiksiz girdi matrisi elde edilir.

Hangi imputer seçilmeli?​


SimpleImputer, her sütundaki eksik değerleri belirlediğiniz tek bir kurala göre doldurur. Sayısal verilerde ortalama uç değerlerden etkilenebilir; medyan genellikle daha dayanıklıdır. Kategorik verilerde en sık görülen değer veya açıkça belirlenmiş bir "Bilinmiyor" etiketi kullanılabilir.
Veri türüÖnerilen yöntemNe zaman tercih edilir?
SayısalmedianUç değerler varsa veya dağılım simetrik değilse
SayısalmeanDeğerler yaklaşık simetrik dağılıyorsa
Kategorikmost_frequentEksik değerin en yaygın kategoriyle temsil edilmesi uygunsa
Kategorik veya metinconstantEksikliği ayrı bir kategori olarak korumak istiyorsanız
Seçilen yöntem gerçek değeri geri getirmez; yalnızca modelin çalışabilmesi için kontrollü bir tahmin üretir. Eksiklik başlı başına anlam taşıyorsa add_indicator=True ile değerin başlangıçta eksik olup olmadığını gösteren ek sütunlar da oluşturabilirsiniz.

Sayısal sütunları medyanla doldurma​


Ön koşul olarak Python ortamında pandas ve scikit-learn kurulu olmalıdır. Aşağıdaki varsayımsal örnekte yas ve gelir sütunlarındaki NaN değerleri eğitim verisinin sütun medyanıyla doldurulur.
  1. Veriyi ve imputer sınıfını içe aktarın. Veri çerçevesindeki sayısal sütunları seçin ve SimpleImputer sınıfını kullanın.
  2. Imputer'ı yalnızca eğitim verisinde eğitin. fit_transform çağrısı medyanları hesaplar ve aynı verideki eksik hücreleri doldurur.
  3. Test verisini aynı imputer ile dönüştürün. Test verisinde yeniden fit çağırmayın; aksi hâlde test dağılımından bilgi sızabilir.
  4. Dönüşümü kontrol edin. Doldurma sonrasında ilgili sütunlarda eksik değer kalmadığını isna().sum() ile doğrulayın.
Python:
import numpy as np
import pandas as pd
from sklearn.impute import SimpleImputer

X_train = pd.DataFrame({
    "yas": [21, np.nan, 35, 42],
    "gelir": [30000, 42000, np.nan, 51000]
})

X_test = pd.DataFrame({
    "yas": [np.nan, 28],
    "gelir": [39000, np.nan]
})

sayisal_sutunlar = ["yas", "gelir"]
imputer = SimpleImputer(strategy="median")

X_train[sayisal_sutunlar] = imputer.fit_transform(X_train[sayisal_sutunlar])
X_test[sayisal_sutunlar] = imputer.transform(X_test[sayisal_sutunlar])

print(X_train)
print(X_train[sayisal_sutunlar].isna().sum())

Bu örnekte eğitim verisindeki yas medyanı 35, gelir medyanı ise 42.000 olur. Test verisindeki eksik değerler de bu eğitim medyanlarıyla doldurulur. Son kontrolde her iki sütun için sonuç 0 olmalıdır; bu, eksik hücre kalmadığını gösterir, ancak doldurulan değerlerin gerçek gözlem olduğunu kanıtlamaz.

Kategorik sütunları doldurma​


Metin içeren sütunlarda ortalama veya medyan kullanılamaz. Eksik kategoriyi en sık değerle doldurmak için most_frequent, eksikliği ayrı bir sınıf olarak korumak için constant seçin.

Python:
from sklearn.impute import SimpleImputer

sehirler = [["Ankara"], [None], ["İstanbul"], ["Ankara"]]

imputer = SimpleImputer(
    missing_values=None,
    strategy="constant",
    fill_value="Bilinmiyor"
)

doldurulmus = imputer.fit_transform(sehirler)
print(doldurulmus)

Beklenen çıktı, eksik satırın Bilinmiyor ile değiştirilmesidir. Bu seçenek, eksik olma durumunun model için ayrıca anlamlı olabileceği durumlarda most_frequent yönteminden daha açıklayıcıdır.

Model eğitiminde güvenli kullanım​


İmputer'ı modelden önce bir Pipeline içine koymak, eğitim ve tahmin sırasında aynı dönüşümün uygulanmasını kolaylaştırır. Özellikle çapraz doğrulamada her eğitim katmanında imputer'ın yalnızca o katmanın eğitim bölümünden öğrenilmesi veri sızıntısını önler.

Python:
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.linear_model import LogisticRegression

model = Pipeline([
    ("imputer", SimpleImputer(strategy="median")),
    ("classifier", LogisticRegression(max_iter=1000))
])

model.fit(X_train, y_train)
tahminler = model.predict(X_test)

Burada y_train hedef değişkeni, X_train ve X_test ise aynı sütun yapısına sahip özellik verileridir. Pipeline modeli yeni veriyle çalıştırırken önce imputation adımını, sonra sınıflandırıcıyı uygular. Sütunlar sayısal ve kategorik olarak birlikte bulunuyorsa her grup için ayrı imputer kullanıp bunları ColumnTransformer içinde birleştirmek gerekir; tek bir sayısal imputer metin sütunlarını doğru işleyemez.

Yaygın hatalar​


Eğitim ve test verisini birleştirip medyan hesaplamak, test bilgisini eğitim aşamasına taşır. Test verisinde yeniden fit_transform kullanmak da aynı soruna yol açar. Ayrıca imputer sonrasında sütun adlarının veya veri türlerinin değişip değişmediğini kontrol edin; modelin eğitimde gördüğü sütun sırası tahmin sırasında korunmalıdır. Eğitimde tamamen boş bir sütun varsa SimpleImputer(strategy="median") varsayılan olarak o sütunu çıktıdan düşürür; sonucu aynı sayıdaki DataFrame sütununa atamak boyut hatası doğurabilir. Sütunu korumak gerekiyorsa keep_empty_features=True kullanın; bu durumda tamamen boş sayısal sütun medyanla değil 0 ile doldurulur.

Eksik değer oranı çok yüksekse doldurma işlemi tek başına yeterli olmayabilir. Böyle bir durumda sütunun iş açısından gerekli olup olmadığını, eksikliğin ayrı bir anlam taşıyıp taşımadığını ve ek eksiklik göstergesinin modele katılıp katılmayacağını ayrıca değerlendirin.
 
Son düzenleme:

Sen de şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic
Geri
Üst