CodeBlanks Logo Icon CodeBlanks

Veri hazırlama

SVM için veriyi hazırlar ve ölçeklersin.

Proje: müşteri kaybı tahmini

Bu projede bir abonelik hizmetinin hangi müşterilerinin ayrılacağını tahmin edeceğiz. Veri yapaydır ama gerçek projelerin üç zorluğunu taşır: 8 özellik, %5 eksik değer ve dengesiz sınıflar (müşterilerin yaklaşık %20'si ayrılıyor).

X, y = make_classification(n_samples=600, n_features=8, n_informative=4,
                           weights=[0.8, 0.2], random_state=7)
X[rng.random(X.shape) < 0.05] = np.nan   # %5 eksik

Hedef: ayrılacak müşterileri (sınıf 1) mümkün olduğunca yakalamak. Bu yüzden ana metrik doğruluk değil F1 olacak.

Veriyi tanıma

İlk inceleme: sınıf dağılımı, sütun başına eksik sayısı ve katmanlı bölme. Eksik değerleri ön işleme adımında pipeline içinde dolduracağız:

print(np.bincount(y))              # sınıf dağılımı
print(np.isnan(X).sum(axis=0))     # sütun başına eksik
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.25, random_state=0, stratify=y)

stratify=y, azınlık sınıfının test kümesinde de aynı oranda bulunmasını sağlar.

Uygulama Sınıfları ve eksikleri say

Sınıf dağılımını np.bincount ile, toplam eksik değer sayısını np.isnan(X).sum() ile yazdır. Ardından test_size=0.25, random_state=0, stratify=y ile bölüp test kümesindeki sınıf dağılımını yazdır.

Başlangıç kodu

model.py
import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

X, y = make_classification(n_samples=600, n_features=8, n_informative=4, weights=[0.8, 0.2], random_state=7)
rng = np.random.default_rng(7)
X[rng.random(X.shape) < 0.05] = np.nan

# buraya yaz

Örnek çözüm

model.py
import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

X, y = make_classification(n_samples=600, n_features=8, n_informative=4, weights=[0.8, 0.2], random_state=7)
rng = np.random.default_rng(7)
X[rng.random(X.shape) < 0.05] = np.nan

print(np.bincount(y))
print(np.isnan(X).sum())
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0, stratify=y)
print(np.bincount(y_test))

Beklenen çıktı

[476 124]
232
[119  31]

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Bu projede neden doğruluk ana metrik değildir?

  • Herkese "kalır" diyen model bile %80 alır Doğru cevap
  • Hesaplanamaz
  • Eksik değer yüzünden
  • Regresyon olduğu için

Açıklama: Dengesiz sınıflarda doğruluk çoğunluk sınıfını ödüllendirir.

2 Sütun başına eksik değerleri say.

Soru
print(np.isnan(X).sum(____))
Cevap
print(np.isnan(X).sum(axis=0))

Açıklama: axis=0 satırlar boyunca toplar: sütun başına bir sayı.

3 Zorlukları çözümlerle eşleştir.

Kavram Anlamı
Eksik değer SimpleImputer
Dengesiz sınıf stratify ve F1
Farklı ölçekler StandardScaler
Ayar seçimi GridSearchCV

Orta seviye bölümündeki tüm dersler