Garfield
YZF Admin
Eksik değerleri scikit-learn içinde doldurmak için
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
Ön koşul olarak Python ortamında
Bu örnekte eğitim verisindeki
Metin içeren sütunlarda ortalama veya medyan kullanılamaz. Eksik kategoriyi en sık değerle doldurmak için
Beklenen çıktı, eksik satırın
İmputer'ı modelden önce bir
Burada
Eğitim ve test verisini birleştirip medyan hesaplamak, test bilgisini eğitim aşamasına taşır. Test verisinde yeniden
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.
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öntem | Ne zaman tercih edilir? |
|---|---|---|
| Sayısal | median | Uç değerler varsa veya dağılım simetrik değilse |
| Sayısal | mean | Değerler yaklaşık simetrik dağılıyorsa |
| Kategorik | most_frequent | Eksik değerin en yaygın kategoriyle temsil edilmesi uygunsa |
| Kategorik veya metin | constant | Eksikliği ayrı bir kategori olarak korumak istiyorsanız |
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.- Veriyi ve imputer sınıfını içe aktarın. Veri çerçevesindeki sayısal sütunları seçin ve
SimpleImputersınıfını kullanın. - Imputer'ı yalnızca eğitim verisinde eğitin.
fit_transformçağrısı medyanları hesaplar ve aynı verideki eksik hücreleri doldurur. - 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. - 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: