CodeBlanks Logo Icon CodeBlanks

Model eğitimi

Seçilen özelliklerle model eğitirsin.

Model eğitimi

Seçimi ve modeli tek pipeline'da birleştirip k'yı MAE'ye göre arıyoruz. Karşılaştırma için türetilmiş özellikler olmadan aynı hattı da eğitiriz:

gs = GridSearchCV(pipe, {"selectkbest__k": [3, 5, 7, 9, 12]}, cv=5,
                  scoring="neg_mean_absolute_error").fit(X_train, y_train)

Proje boyunca test kümesine dokunulmaz; tüm kararlar eğitim verisindeki CV ile verilir.

Seçilen sütunları okumak

En iyi modelin hangi sütunları kullandığını görmek, seçimin mantıklı olup olmadığını denetler:

sec = gs.best_estimator_["selectkbest"]
print(sec.get_support(indices=True))

Bu veride CV tüm 12 sütunu seçer: Ridge'in cezası gürültü sütunlarının katsayılarını zaten küçük tuttuğu için onları atmak skoru iyileştirmez, gerçek ama zayıf görünen sütunları atmak ise kötüleştirir. Seçimin değeri çok sayıda gürültü sütununda ya da KNN gibi gürültüye duyarlı modellerde ortaya çıkar. Bu projede asıl kazanç türetilmiş özelliklerden gelecek.

Uygulama Ara ve incele

make_pipeline(StandardScaler(), SelectKBest(f_regression), Ridge(alpha=1.0)) için selectkbest__k değerlerini [3, 5, 7, 9, 12] arasında GridSearchCV(..., cv=5, scoring="neg_mean_absolute_error") ile ara. best_params_, CV MAE'si (round(-gs.best_score_, 1)) ve seçilen sütun indekslerini alt alta yazdır.

Başlangıç kodu

model.py
import numpy as np

rng = np.random.default_rng(11)
n = 500
m2 = rng.uniform(40, 200, n)
oda = np.clip(np.round(m2 / 35 + rng.normal(0, 0.7, n)), 1, 6)
yas = rng.uniform(0, 40, n)
kat = rng.integers(0, 15, n)
merkez_km = rng.uniform(0.5, 25, n)
gurultu = rng.normal(size=(n, 5))
fiyat = 20 * m2 + 150 * m2 / oda - 2500 * np.log1p(merkez_km) - 40 * yas + 60 * kat + rng.normal(0, 300, n)
X = np.column_stack([m2, oda, yas, kat, merkez_km, gurultu])
X2 = np.column_stack([X, m2 / oda, np.log1p(merkez_km)])
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X2, fiyat, test_size=0.25, random_state=0)
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.feature_selection import SelectKBest, f_regression
from sklearn.linear_model import Ridge
from sklearn.model_selection import GridSearchCV

# buraya yaz

Örnek çözüm

model.py
import numpy as np

rng = np.random.default_rng(11)
n = 500
m2 = rng.uniform(40, 200, n)
oda = np.clip(np.round(m2 / 35 + rng.normal(0, 0.7, n)), 1, 6)
yas = rng.uniform(0, 40, n)
kat = rng.integers(0, 15, n)
merkez_km = rng.uniform(0.5, 25, n)
gurultu = rng.normal(size=(n, 5))
fiyat = 20 * m2 + 150 * m2 / oda - 2500 * np.log1p(merkez_km) - 40 * yas + 60 * kat + rng.normal(0, 300, n)
X = np.column_stack([m2, oda, yas, kat, merkez_km, gurultu])
X2 = np.column_stack([X, m2 / oda, np.log1p(merkez_km)])
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X2, fiyat, test_size=0.25, random_state=0)
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.feature_selection import SelectKBest, f_regression
from sklearn.linear_model import Ridge
from sklearn.model_selection import GridSearchCV

pipe = make_pipeline(StandardScaler(), SelectKBest(f_regression), Ridge(alpha=1.0))
gs = GridSearchCV(pipe, {"selectkbest__k": [3, 5, 7, 9, 12]}, cv=5, scoring="neg_mean_absolute_error").fit(X_train, y_train)
print(gs.best_params_)
print(round(-gs.best_score_, 1))
print(gs.best_estimator_["selectkbest"].get_support(indices=True))

Beklenen çıktı

{'selectkbest__k': 12}
255.0
[ 0  1  2  3  4  5  6  7  8  9 10 11]

Soru ve cevaplar

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

1 Neden <code>scoring="neg_mean_absolute_error"</code> yazılır, "mean_absolute_error" değil?

  • scikit-learn büyük skoru iyi sayar; hata eksiyle çevrilir Doğru cevap
  • MAE hesaplanamaz
  • Daha hızlıdır
  • Fark yoktur

Açıklama: best_score_ negatif MAE'dir; raporlarken işaret çevrilir.

2 En iyi modeldeki seçici adımı al.

Soru
sec = gs.best_estimator_[____]
Cevap
sec = gs.best_estimator_["selectkbest"]

Açıklama: Adım adı make_pipeline'da küçük harfli sınıf adıdır.

3 Kararları eşleştir.

Kavram Anlamı
k CV ile seçilir
MAE Seçim ölçütü
test kümesi En sona kadar dokunulmaz
seçilen sütunlar Mantık denetimi

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