Stacking
- Makine Öğrenmesi kursu
- Orta seviye
- Ders 101/112
- 5 dk
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ğipassthrough=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
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
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.
p = cross_val_predict(m, X_train, y_train, cv=5, method=____)
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 |