DEV Community

Hendra cung
Hendra cung

Posted on AI-assisted

Prediksi Dropout Mahasiswa Menggunakan Ensemble Learning dan Hyperparameter Tuning

Setiap tahun ada mahasiswa yang berhenti kuliah sebelum lulus. Di artikel ini kami membangun model machine learning untuk memprediksi apakah seorang mahasiswa akan dropout, masih terdaftar (enrolled), atau lulus (graduate). Kami membandingkan dua model baseline dengan beberapa metode Ensemble Learning (Bagging, Random Forest, Soft Voting, AdaBoost, Gradient Boosting, dan Stacking), lalu mengoptimasi model dengan hyperparameter tuning memakai GridSearchCV.

Seluruh eksperimen dijalankan di Google Colab: buka notebook di Google Colab

1. Permasalahan dan Tujuan

Dropout merugikan mahasiswa (waktu dan biaya) dan juga kampus. Kalau mahasiswa yang berisiko bisa dikenali lebih awal, kampus bisa memberi pendampingan akademik atau bantuan keuangan sebelum terlambat.

Tujuan eksperimen ini:

  1. Membuat model klasifikasi 3 kelas: Dropout, Enrolled, dan Graduate.
  2. Membandingkan model baseline dengan beberapa metode ensemble.
  3. Mengoptimasi model dengan hyperparameter tuning.
  4. Mencari faktor yang paling berhubungan dengan dropout.

2. Dataset

Kami memakai dataset Predict Students' Dropout and Academic Success dari UCI Machine Learning Repository:
https://archive.ics.uci.edu/dataset/697/predict+students+dropout+and+academic+success

Keterangan Isi
Asal data Polytechnic Institute of Portalegre, Portugal (angkatan 2008/2009 sampai 2018/2019)
Jumlah data 4424 mahasiswa
Fitur 36 (data pendaftaran, latar belakang keluarga, kondisi ekonomi, nilai semester 1 dan 2)
Target Dropout, Enrolled, Graduate
Lisensi CC BY 4.0

Dataset bisa dibaca langsung dari link download UCI, jadi tidak perlu upload file ke Colab. Pemisah kolomnya titik koma (;).

url = "https://archive.ics.uci.edu/static/public/697/predict+students+dropout+and+academic+success.zip"
df = pd.read_csv(url, sep=";")

print("Shape:", df.shape)   # (4424, 37)
Enter fullscreen mode Exit fullscreen mode

Hasil pengecekan awal: tidak ada missing value dan tidak ada data duplikat.

3. Eksplorasi Data (EDA)

Distribusi target

Jumlah mahasiswa per status

Jumlah data tiap kelas tidak seimbang: Graduate 2209 (49.9%), Dropout 1421 (32.1%), dan Enrolled 794 (17.9%). Karena itu kami tidak hanya melihat akurasi, tetapi memakai F1-macro sebagai metrik utama.

Jumlah mata kuliah yang lulus di semester 2

Jumlah mata kuliah lulus di semester 2

Mahasiswa yang dropout lulus jauh lebih sedikit mata kuliah. Nilai tengahnya (median) 0 mata kuliah, sedangkan Enrolled 4 dan Graduate 6.

Status pembayaran uang kuliah

Status mahasiswa berdasarkan pembayaran uang kuliah

Dari mahasiswa yang uang kuliahnya tidak lunas, 86.6% berakhir dropout. Pada mahasiswa yang uang kuliahnya lunas, angka dropout hanya 24.7%.

Korelasi fitur dengan dropout

Untuk melihat korelasi, kami membuat kolom bantu Dropout (1 = dropout, 0 = tidak dropout).

Korelasi fitur dengan status dropout

Fitur yang paling berhubungan dengan dropout adalah jumlah mata kuliah lulus dan nilai semester 2 (korelasi -0.57), lalu semester 1 (-0.48) dan status uang kuliah lunas (-0.43). Tanda minus artinya semakin tinggi nilainya, semakin kecil kemungkinan dropout.

4. Preprocessing

Langkah preprocessing yang kami lakukan:

  1. Merapikan nama kolom, karena ada satu nama kolom yang mengandung karakter tab di ujungnya.
  2. Mengubah target menjadi angka: Dropout = 0, Enrolled = 1, Graduate = 2.
  3. Memisahkan fitur (X) dan target (y).
  4. Membagi data menjadi 80% data latih dan 20% data uji. stratify=y menjaga proporsi ketiga kelas tetap sama di data latih dan data uji.
df.columns = df.columns.str.strip()
df["Target"] = df["Target"].map({"Dropout": 0, "Enrolled": 1, "Graduate": 2})

X = df.drop(columns="Target")
y = df["Target"]

X_train, X_test, y_train, y_test = train_test_split(
    X, y,
    test_size=0.20,
    random_state=RANDOM_STATE,
    stratify=y
)
Enter fullscreen mode Exit fullscreen mode

Hasilnya 3539 data latih dan 885 data uji. Semua fitur sudah berbentuk angka dan tidak ada missing value, jadi tidak perlu encoding atau imputasi. Standarisasi (StandardScaler) hanya dipakai untuk Logistic Regression, karena model berbasis pohon tidak terpengaruh skala fitur.

5. Model Baseline dan Cross Validation

Baseline adalah model sederhana sebagai pembanding. Kami memakai Logistic Regression (dengan StandardScaler di dalam Pipeline) dan satu Decision Tree.

logistic = Pipeline([
    ("scaler", StandardScaler()),
    ("model", LogisticRegression(max_iter=1000))
])

tree = DecisionTreeClassifier(random_state=RANDOM_STATE)
Enter fullscreen mode Exit fullscreen mode
Model Akurasi train Akurasi test F1-macro test
Logistic Regression - 0.768 0.683
Decision Tree 1.000 0.697 0.639

Decision Tree mendapat akurasi 1.0 di data latih tetapi hanya 0.697 di data uji. Satu pohon keputusan menghafal data latih (overfitting).

Skor dari satu kali pembagian data bisa kebetulan bagus atau jelek. Karena itu kami memakai cross validation 5-fold: data latih dibagi menjadi 5 bagian, model dilatih di 4 bagian dan diuji di 1 bagian sisanya, diulang 5 kali, lalu skornya dirata-rata.

cv_lr = cross_val_score(logistic, X_train, y_train, cv=5, scoring="f1_macro")
cv_tree = cross_val_score(tree, X_train, y_train, cv=5, scoring="f1_macro")
Enter fullscreen mode Exit fullscreen mode
F1-macro CV Logistic Regression: [0.668 0.693 0.681 0.666 0.681] rata-rata: 0.6779
F1-macro CV Decision Tree      : [0.631 0.606 0.606 0.646 0.601] rata-rata: 0.618
Enter fullscreen mode Exit fullscreen mode

6. Ensemble Learning

Ensemble learning menggabungkan banyak model supaya prediksinya lebih baik dan lebih stabil dibanding satu model saja.

6.1 Bagging dan Random Forest

Bagging (Bootstrap Aggregating) melatih banyak Decision Tree pada sampel data yang diambil acak dengan pengembalian, lalu menggabungkan hasil prediksinya. Random Forest adalah bagging yang di setiap percabangan pohon hanya memakai sebagian fitur secara acak, sehingga pohon-pohonnya lebih beragam.

bagging = BaggingClassifier(
    estimator=DecisionTreeClassifier(random_state=RANDOM_STATE),
    n_estimators=100,
    random_state=RANDOM_STATE,
    n_jobs=-1
)

rf = RandomForestClassifier(
    n_estimators=200,
    random_state=RANDOM_STATE,
    n_jobs=-1
)
Enter fullscreen mode Exit fullscreen mode

Bagging menaikkan F1-macro test dari 0.639 (satu Decision Tree) menjadi 0.677, dan Random Forest mendapat 0.682. Menggabungkan banyak pohon membuat prediksi lebih stabil.

6.2 Soft Voting

Voting menggabungkan beberapa model yang berbeda jenis. Pada soft voting, probabilitas prediksi dari setiap model dirata-rata, lalu kelas dengan probabilitas tertinggi dipilih.

voting = VotingClassifier(
    estimators=[
        ("lr", logistic),
        ("rf", rf),
        ("bagging", bagging)
    ],
    voting="soft"
)
Enter fullscreen mode Exit fullscreen mode

Soft Voting mendapat akurasi test 0.772 (tertinggi dari semua model) dan F1-macro test 0.688.

6.3 Boosting: AdaBoost dan Gradient Boosting

Boosting melatih model secara berurutan. Model berikutnya fokus memperbaiki kesalahan model sebelumnya.

ada = AdaBoostClassifier(
    n_estimators=200,
    random_state=RANDOM_STATE
)

gb = GradientBoostingClassifier(random_state=RANDOM_STATE)
Enter fullscreen mode Exit fullscreen mode

AdaBoost mendapat F1-macro test 0.664, justru lebih rendah dari baseline Logistic Regression. Gradient Boosting lebih baik dengan F1-macro test 0.690.

6.4 Stacking

Stacking memakai prediksi beberapa model (base model) sebagai input untuk satu model terakhir (meta-model). Kami memakai Random Forest, Gradient Boosting, dan AdaBoost sebagai base model, dengan Logistic Regression sebagai meta-model.

stacking = StackingClassifier(
    estimators=[
        ("rf", rf),
        ("gb", gb),
        ("ada", ada)
    ],
    final_estimator=LogisticRegression(max_iter=1000)
)
Enter fullscreen mode Exit fullscreen mode

Stacking mendapat akurasi test 0.765 dan F1-macro test 0.701, tertinggi di antara semua model.

7. Hyperparameter Tuning dengan GridSearchCV

GridSearchCV mencoba semua kombinasi parameter yang kami tentukan. Setiap kombinasi dinilai dengan cross validation 5-fold di data latih, lalu dipilih kombinasi dengan F1-macro tertinggi. Kami melakukan tuning pada Random Forest (27 kombinasi) dan Gradient Boosting (8 kombinasi).

param_rf = {
    "n_estimators": [100, 200, 300],
    "max_depth": [None, 10, 20],
    "min_samples_leaf": [1, 2, 4]
}

grid_rf = GridSearchCV(
    RandomForestClassifier(random_state=RANDOM_STATE),
    param_rf,
    cv=5,
    scoring="f1_macro",
    n_jobs=-1
)
grid_rf.fit(X_train, y_train)
Enter fullscreen mode Exit fullscreen mode
Model Parameter terbaik F1-macro CV F1-macro test
Random Forest (tuned) n_estimators=100, max_depth=None, min_samples_leaf=1 0.698 0.692
Gradient Boosting (tuned) learning_rate=0.05, max_depth=3, n_estimators=200 0.703 0.689

Parameter terbaik Random Forest hampir sama dengan parameter bawaan scikit-learn, jadi kenaikannya kecil.

8. Perbandingan Semua Model

Semua model dibandingkan dengan cara yang sama: F1-macro cross validation 5-fold di data latih (F1 CV), lalu akurasi dan F1-macro di data uji.

for name, model in models.items():
    cv_score = cross_val_score(model, X_train, y_train, cv=5, scoring="f1_macro", n_jobs=-1)
    pred = model.predict(X_test)
    results.append({
        "Model": name,
        "F1 CV": cv_score.mean(),
        "Accuracy Test": accuracy_score(y_test, pred),
        "F1 Test": f1_score(y_test, pred, average="macro")
    })
Enter fullscreen mode Exit fullscreen mode
Model F1 CV Akurasi test F1 test
Stacking 0.714 0.765 0.701
Gradient Boosting (tuned) 0.703 0.759 0.689
Soft Voting 0.701 0.772 0.688
Gradient Boosting 0.701 0.759 0.690
Bagging 0.699 0.749 0.677
Random Forest (tuned) 0.698 0.767 0.692
Random Forest 0.693 0.765 0.682
Logistic Regression (baseline) 0.678 0.768 0.683
AdaBoost 0.672 0.744 0.664
Decision Tree (baseline) 0.618 0.697 0.639

Perbandingan F1-macro cross validation dan data uji

9. Evaluasi Model Final

Model final dipilih berdasarkan F1 CV tertinggi, bukan skor data uji, supaya data uji tetap menjadi penilaian akhir yang netral. Model terpilih adalah Stacking.

              precision    recall  f1-score   support

     Dropout       0.79      0.74      0.76       284
    Enrolled       0.55      0.44      0.49       159
    Graduate       0.81      0.90      0.85       442

    accuracy                           0.76       885
   macro avg       0.72      0.69      0.70       885
weighted avg       0.76      0.76      0.76       885
Enter fullscreen mode Exit fullscreen mode

Confusion matrix model Stacking

Cara membaca confusion matrix: baris adalah kelas asli, kolom adalah hasil prediksi, dan angka di diagonal adalah prediksi yang benar.

  • Graduate dikenali dengan sangat baik: 398 dari 442 benar (recall 0.90).
  • Dropout cukup baik: 209 dari 284 benar (recall 0.74).
  • Enrolled paling sulit: hanya 70 dari 159 benar (recall 0.44). Sebanyak 39 mahasiswa Enrolled diprediksi Dropout dan 50 diprediksi Graduate.

10. Fitur Paling Berpengaruh

Stacking tidak punya atribut feature_importances_, jadi kami memakai Random Forest hasil tuning untuk melihat fitur yang paling berpengaruh.

10 fitur paling berpengaruh

Empat fitur teratas adalah jumlah mata kuliah lulus dan nilai di semester 2 dan semester 1. Ini sesuai dengan temuan EDA. Status uang kuliah lunas juga masuk 10 fitur terpenting.

11. Analisis Hasil

  1. Ensemble lebih baik dari baseline. Stacking memberikan F1-macro CV 0.714 dan F1-macro test 0.701. Dibanding Logistic Regression (CV 0.678, test 0.683), F1-macro naik sekitar 0.02 sampai 0.04. Dibanding Decision Tree (CV 0.618, test 0.639), naik sekitar 0.06 sampai 0.10.
  2. Tidak semua ensemble otomatis lebih baik. AdaBoost (CV 0.672) masih di bawah Logistic Regression. Soft Voting punya akurasi test tertinggi (0.772), tetapi F1-macro-nya (0.688) di bawah Stacking. Inilah alasan kami memakai F1-macro sebagai metrik utama: akurasi bisa tinggi walaupun kelas kecil (Enrolled) sering salah.
  3. Efek hyperparameter tuning kecil. Tuning menaikkan F1-macro CV Random Forest dari 0.693 menjadi 0.698 dan Gradient Boosting dari 0.701 menjadi 0.703. Parameter bawaan scikit-learn ternyata sudah cukup baik untuk dataset ini.
  4. Kelas Enrolled paling sulit. Datanya paling sedikit (17.9%) dan kondisinya berada di antara Dropout dan Graduate, sehingga sering tertukar dengan dua kelas lainnya.
  5. Faktor akademik paling penting. Jumlah mata kuliah lulus dan nilai di semester 1 dan 2 adalah fitur terpenting, diikuti faktor lain seperti nilai masuk, usia, dan status uang kuliah.

12. Kesimpulan

  • Ensemble learning berhasil meningkatkan performa prediksi dropout dibanding model baseline. Model terbaik adalah Stacking (Random Forest + Gradient Boosting + AdaBoost dengan meta-model Logistic Regression) dengan F1-macro 0.701 dan akurasi 0.765 di data uji.
  • Hyperparameter tuning dengan GridSearchCV hanya memberi kenaikan kecil (sekitar 0.002 sampai 0.005 F1-macro CV).
  • Prestasi akademik di semester 1 dan 2 serta status pembayaran uang kuliah adalah faktor yang paling berhubungan dengan dropout. Kampus dapat memakai faktor-faktor ini sebagai tanda awal untuk memberi pendampingan.

13. Keterbatasan

  • Data hanya berasal dari satu institusi di Portugal, jadi hasilnya belum tentu sama untuk kampus lain, termasuk di Indonesia.
  • Model memakai nilai semester 1 dan 2, sehingga prediksi baru bisa dibuat setelah semester 2 selesai, bukan saat mahasiswa baru masuk.
  • Kelas Enrolled masih sulit diprediksi (recall 0.44).
  • Tuning hanya dilakukan pada dua model dengan jumlah kombinasi parameter yang sedikit. Grid yang lebih luas mungkin memberi hasil berbeda.
  • Data uji hanya dibagi satu kali (random_state=42), jadi skor test bisa sedikit berbeda jika pembagian datanya diubah.

Notebook

Kode lengkap beserta semua output bisa dilihat dan dijalankan ulang di Google Colab: https://colab.research.google.com/drive/1JF6VieRSYcE72Dp49FVNyb9wadaA8P_8

Anggota Kelompok

No Nama NIM
1 Priskila Novaulin Tulangouw 2432084
2 Selia Emeline 2432035
3 Hendra Cung 2432065
4 Shinta Natalia 2432020
5 Firman 2432063

Mata kuliah Penerapan Kecerdasan Buatan, Program Studi Teknologi Informasi.

Referensi

  1. Realinho, V., Machado, J., Baptista, L., & Martins, M. V. (2022). Predicting Student Dropout and Academic Success. Data, 7(11), 146. https://doi.org/10.3390/data7110146
  2. UCI Machine Learning Repository: Predict Students' Dropout and Academic Success. https://archive.ics.uci.edu/dataset/697/predict+students+dropout+and+academic+success
  3. Dokumentasi scikit-learn: Ensemble methods. https://scikit-learn.org/stable/modules/ensemble.html

Top comments (0)