CodeBlanks Logo Icon CodeBlanks

Tahmin

SVM ile tahmin yaparsın.

Tahmin ve eşik

Seçilen modelle test müşterileri için karar skorları alınır. SVC'de decision_function > 0 sınıf 1 demektir. İş birimi daha çok müşteriyi yakalamak isterse eşik 0'ın altına çekilebilir:

skor = gs.decision_function(X_test)
varsayilan = (skor > 0).astype(int)        # predict ile aynı
hassas = (skor > -0.5).astype(int)         # daha çok alarm

Eşik değiştirmek modeli yeniden eğitmeden kesinlik-duyarlılık dengesini kaydırır.

Öncelik listesi

İş ekibine çoğu zaman "en riskli 20 müşteri" gibi sıralı bir liste gerekir. Skorlar azalan sırada dizilip ilk k müşteri seçilir; bu listede gerçekten ayrılanların oranına precision@k denir:

sira = np.argsort(-skor)[:20]
print(y_test[sira].mean())   # ilk 20'de gerçek ayrılanların oranı

Kampanya bütçesi sınırlıysa bu metrik F1'den daha doğrudan bir iş ölçüsüdür.

Uygulama En riskli müşteriler

Hazır gs ile test karar skorlarını al. Varsayılan ve -0.5 eşikleriyle kaç müşterinin işaretlendiğini aynı satırda yazdır. Ardından en riskli 20 müşteride gerçekten ayrılanların oranını round(..., 2) ile 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
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0, stratify=y)
from sklearn.pipeline import make_pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV

pipe = make_pipeline(SimpleImputer(strategy="median"), StandardScaler(), SVC(class_weight="balanced"))
gs = GridSearchCV(pipe, {"svc__C": [0.1, 1, 10], "svc__gamma": ["scale", 0.1]}, cv=5, scoring="f1").fit(X_train, y_train)

# 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
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0, stratify=y)
from sklearn.pipeline import make_pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV

pipe = make_pipeline(SimpleImputer(strategy="median"), StandardScaler(), SVC(class_weight="balanced"))
gs = GridSearchCV(pipe, {"svc__C": [0.1, 1, 10], "svc__gamma": ["scale", 0.1]}, cv=5, scoring="f1").fit(X_train, y_train)

skor = gs.decision_function(X_test)
print((skor > 0).sum(), (skor > -0.5).sum())
sira = np.argsort(-skor)[:20]
print(round(y_test[sira].mean(), 2))

Beklenen çıktı

29 41
0.95

Soru ve cevaplar

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

1 Eşiği 0'dan -0.5'e çekmek duyarlılığı nasıl etkiler?

  • Sıfırlar
  • Etkilemez, her zaman
  • Artırır (ya da aynı bırakır) Doğru cevap
  • Azaltır

Açıklama: Daha çok örnek pozitif sayıldığı için kaçırılan pozitifler azalır.

2 Skorları büyükten küçüğe sıralayan indeksleri al.

Soru
sira = np.argsort(____)[:20]
Cevap
sira = np.argsort(-skor)[:20]

Açıklama: Negatif değerlerin argsort'u azalan sıra verir.

3 İfadeleri eşleştir.

Kavram Anlamı
skor > 0 Varsayılan karar
skor > -0.5 Hassas karar
np.argsort(-skor) Riskten güvenliye
y_test[sira].mean() precision@k

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