Stacking adalah salah satu teknik ensemble yang paling banyak digunakan dan berkinerja terbaik yang digunakan dalam bidang pembelajaran mesin. Stacking sangat mirip dengan voting ensemble tetapi juga memberikan bobot pada algoritma pembelajaran mesin, di mana terdapat dua lapisan model: ground models dan meta models. Oleh karena itu, Stacking cenderung melakukan yang terbaik dari semua teknik ensemble lain yang digunakan dalam pembelajaran mesin.
Pada artikel ini, kita akan berbicara tentang teknik stacking ensemble. Kita akan mulai dengan berbicara tentang intuisi inti dari teknik-teknik ini, diikuti dengan matematika dan pendekatan berbeda di balik mekanisme kerjanya. Kami akan mengembangkan kode untuk teknik ini untuk menerapkan algoritma stacking ke data, diakhiri dengan kesimpulan dari teknik ini.
Hubungan Antara Voting Ensembles dan Stacking
Kami sebutkan di atas bahwa Stacking sangat mirip dengan voting. Dalam voting ensemble, beberapa algoritma pembelajaran mesin melakukan tugas yang sama. Di sini, kami melatih beberapa algoritma pembelajaran mesin pada data yang sama dan hasil dari setiap model diambil setelah kita menjalani pelatihan.
Keluaran akhir adalah rata-rata hasil ground model jika masalah regresi atau kategori paling sering dari masalah klasifikasi, dimana semua hasil dari ground model akan memiliki bobot yang sama.
Dalam stacking, hal yang sama terjadi. Hanya lapisan model baru yang dimasukkan ke dalam interpretasi. Dalam Stacking juga, beberapa algoritma pembelajaran mesin digunakan sebagai ground models. Tetapi di sini juga terdapat lapisan model lebih lanjut yang disebut meta models. Model ini akan menetapkan bobot yang berbeda ke ground models, tidak seperti voting ensemble, dan kemudian tugas prediksi dilakukan secara bertumpuk.
Misalkan kita memiliki dataset D, dan kita memiliki tiga model dasar pembelajaran mesin: Decision Tree, Random Forest, KNN, dan XGBoost, dan model meta di lapisan kedua adalah Regresi Logistik.
Sekarang kita akan memasukkan dataset D ke setiap model ground masing-masing. Kami akan melatih model dasar pada kumpulan data yang sama, dan model yang dilatih akan dapat memprediksi untuk kumpulan data pengujian kami.
Setelah kami memperkenalkan model dasar, kami akan mengambil data prediksi dari setiap model dasar dan menggunakan data tersebut untuk melatih pohon keputusan meta-model.
Jadi di sini, data pelatihan untuk pohon keputusan akan berbeda. Setelah kami memperkenalkan model-meta, itu akan menetapkan bobot ke model dasar, dan keluaran dari model-meta akan dianggap sebagai keluaran akhir dari algoritme susun.
Permasalahan Algoritma Stacking
Seperti yang kita ketahui, dalam Stacking, model dasar dilatih pada dataset, di mana kita menggunakan keluaran model dasar pada data uji sebagai data pelatihan untuk model meta. Di sini kita dapat melihat data yang sama digunakan berkali-kali oleh model. Artinya data keluaran dari model dasar sudah terbuka untuk keseluruhan model dan digunakan lagi untuk pelatihan model meta. Jadi jelas, akan ada kasus over-fitting di mana model akan bekerja sangat baik pada data pelatihan, tetapi akan bekerja buruk pada data pengujian.
Jadi dalam kasus ini, kami telah mengatasi masalah ini. Apakah kami dapat memvalidasi data, artinya kami tidak akan menampilkan beberapa sampel data ke model dasar, atau kami menggunakan teknik khusus seperti pengambilan sampel KNN untuk melakukan tugas tersebut. Dalam stacking, kami menggunakan pendekatan K-fold untuk menangani masalah terkait overfitting ini.
Pendekatan K Fold: Stacking seperti yang kita ketahui, ada potensi overfitting dalam ensemble dan kita dapat menggunakan pendekatan K-fold untuk mengatasi masalah ini. Pendekatan ini juga disebut Stacking atau Classical Stacking. Mari kita coba memahami K fold sampling dengan sebuah contoh.
Misalkan kita memiliki dataset regresi di mana kolom keluaran berupa nilai numerik. Jadi dalam pengambilan sampel K fold, langkahnya adalah membagi dataset menjadi set pelatihan dan pengujian. Jadi di sini, dengan menggunakan modul train_test_split, kumpulan data dapat dengan mudah dibagi menjadi kumpulan pelatihan dan pengujian. Misalkan kita memiliki pembagian 80 – 20 dalam kumpulan data.
Pada langkah kedua, kita menentukan nilai K, yang merupakan nilai yang dikenal sebagai pembagian data yang sama. Secara umum, kita mengambil nilai K sebagai 5, artinya kita akan membagi dataset menjadi lima bagian.
Pada langkah ke-3, kita akan melatih model dasar satu per satu pada dataset. Dikarenakan kita memiliki lima pembagian dataset yang sama, kita akan menggunakan empat pembagian sebagai kumpulan pelatihan dan pembagian terakhir akan digunakan sebagai kumpulan pengujian. Setelah dilatih, kita akan merekam prediksi pada pemisahan sebelumnya untuk semua algoritma. Hal yang sama akan berulang, dan kita akan merekam output dari model ground ke-1, ke-2, ke-3, dan ke-4.
Pada langkah ke-4, di mana kita akan memiliki kumpulan data prediksi untuk semua model ground, kita akan menggunakan data tersebut sebagai kumpulan pelatihan untuk model-meta. Setelah meta-model dilatih, sekarang pelatihan ground model, dataset yang sama tidak akan digunakan. Sebagai gantinya, data pelatihan dari langkah 1 akan digunakan sebagai set pelatihan untuk model dasar.
Jadi di sini, kita melatih meta-model terlebih dahulu, lalu model dasar diperkenalkan. Selain itu, masalah kebocoran data terpecahkan jika meta-model adalah model ground yang dilatih secara individual, dan masalah overfitting tidak akan terjadi.
Stacking: Contoh Code
Menerapkan Stacking sangat mudah, kita bisa menggunakan library seperti StackingClassifer dan StackingRegresor tersedia di Scikit-Learn.
Pertama kita import beberapa library yang akan digunakan.
from sklearn.ensemble import RandomForestClassifier from sklearn.neighbors import KNeighborsClassifier from sklearn.linear_model import LogisticRegression from sklearn.ensemble import GradientBoostingClassifier from sklearn.ensemble import StackingClassifier
Selanjutnya, kita buat list estimators.
estimators = [ ('rf', RandomForestClassifier(n_estimators=10, random_state=42)), ('knn', KNeighborsClassifier(n_neighbors=10)), ('gbdt',GradientBoostingClassifier()) ]
Terakhir, kita terapkan algoritma stacking dengan StackingClassifier.
clf = StackingClassifier( estimators=estimators, final_estimator=LogisticRegression(), cv=11 ) clf.fit(X_train, y_train) y_pred = clf.predict(X_test) from sklearn.metrics import accuracy_score accuracy_score(y_test,y_pred)