CodeBlanks Logo Icon CodeBlanks

Stacking

Stacking, modellerin tahminlerini meta-modelle birleştirir.

Stacking

Stacking, temel modellerin tahminlerini girdi olarak alan bir üst model eğitir. Üst model hangi temel modele ne zaman güveneceğini öğrenir. Sızıntıyı önlemek için üst model, temel modellerin katman dışı (out-of-fold) tahminleriyle eğitilir:

from sklearn.ensemble import StackingClassifier
st = StackingClassifier(modeller, final_estimator=LogisticRegression(), cv=5)
st.fit(X_train, y_train)
print(st.score(X_test, y_test))

cv=5, temel modellerin üst model için ürettiği tahminlerin içeride 5 katlı CV ile alınmasını sağlar.

Stacking'i elle kurmak

Mantığı cross_val_predict ile açıkça görebiliriz: her temel modelin katman dışı olasılıkları yeni özellikler olur, üst model bunlarla eğitilir:

Z = np.column_stack([
    cross_val_predict(m, X_train, y_train, cv=5, method="predict_proba")[:, 1]
    for _, m in modeller])
ust = LogisticRegression().fit(Z, y_train)
print(ust.coef_)   # hangi modele ne kadar güvenildiği

passthrough=True verilirse üst model özgün özellikleri de görür.

Uygulama Stacking

Üç temel model ve LogisticRegression() üst modeliyle StackingClassifier(..., cv=5) eğit. Test doğruluğunu round(..., 3) ile, ardından üst modelin katsayılarını np.round(st.final_estimator_.coef_, 2) ile yazdır.

Başlangıç kodu

model.py
import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier

X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=2, stratify=y)
modeller = [("lr", make_pipeline(StandardScaler(), LogisticRegression())), ("knn", make_pipeline(StandardScaler(), KNeighborsClassifier())), ("agac", DecisionTreeClassifier(max_depth=4, random_state=0))]
from sklearn.ensemble import StackingClassifier

# buraya yaz

Örnek çözüm

model.py
import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier

X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=2, stratify=y)
modeller = [("lr", make_pipeline(StandardScaler(), LogisticRegression())), ("knn", make_pipeline(StandardScaler(), KNeighborsClassifier())), ("agac", DecisionTreeClassifier(max_depth=4, random_state=0))]
from sklearn.ensemble import StackingClassifier

st = StackingClassifier(modeller, final_estimator=LogisticRegression(), cv=5).fit(X_train, y_train)
print(round(st.score(X_test, y_test), 3))
print(np.round(st.final_estimator_.coef_, 2))

Beklenen çıktı

0.971
[[4.06 2.74 1.07]]

Soru ve cevaplar

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

1 Üst model neden temel modellerin eğitim verisindeki tahminleriyle eğitilmez?

  • O tahminler aşırı iyimserdir; üst model ezberleyen modele güvenmeyi öğrenir Doğru cevap
  • Hesaplanamaz
  • Çok yavaştır
  • Eğitilir

Açıklama: Katman dışı tahminler, temel modellerin yeni verideki gerçek davranışını yansıtır.

2 Katman dışı olasılıkları al.

Soru
p = cross_val_predict(m, X_train, y_train, cv=5, method=____)
Cevap
p = cross_val_predict(m, X_train, y_train, cv=5, method="predict_proba")

Açıklama: method, cross_val_predict'in hangi yöntemi çağıracağını seçer.

3 Parçaları eşleştir.

Kavram Anlamı
temel modeller Birinci katman
final_estimator Üst model
katman dışı tahmin Sızıntısız girdi
passthrough Özgün özellikleri de ekle

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