<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Hendra cung</title>
    <description>The latest articles on DEV Community by Hendra cung (@hendra_cung).</description>
    <link>https://dev.to/hendra_cung</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4151507%2Fe9c42303-7444-4e21-af3c-07812d8322ff.png</url>
      <title>DEV Community: Hendra cung</title>
      <link>https://dev.to/hendra_cung</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hendra_cung"/>
    <language>en</language>
    <item>
      <title>Prediksi Dropout Mahasiswa Menggunakan Ensemble Learning dan Hyperparameter Tuning</title>
      <dc:creator>Hendra cung</dc:creator>
      <pubDate>Wed, 30 Sep 2026 07:41:02 +0000</pubDate>
      <link>https://dev.to/hendra_cung/prediksi-dropout-mahasiswa-menggunakan-ensemble-learning-dan-hyperparameter-tuning-41nc</link>
      <guid>https://dev.to/hendra_cung/prediksi-dropout-mahasiswa-menggunakan-ensemble-learning-dan-hyperparameter-tuning-41nc</guid>
      <description>&lt;p&gt;Setiap tahun ada mahasiswa yang berhenti kuliah sebelum lulus. Di artikel ini kami membangun model &lt;em&gt;machine learning&lt;/em&gt; untuk memprediksi apakah seorang mahasiswa akan &lt;strong&gt;dropout&lt;/strong&gt;, &lt;strong&gt;masih terdaftar (enrolled)&lt;/strong&gt;, atau &lt;strong&gt;lulus (graduate)&lt;/strong&gt;. Kami membandingkan dua model baseline dengan beberapa metode &lt;strong&gt;Ensemble Learning&lt;/strong&gt; (Bagging, Random Forest, Soft Voting, AdaBoost, Gradient Boosting, dan Stacking), lalu mengoptimasi model dengan &lt;strong&gt;hyperparameter tuning&lt;/strong&gt; memakai GridSearchCV.&lt;/p&gt;

&lt;p&gt;Seluruh eksperimen dijalankan di Google Colab: &lt;strong&gt;&lt;a href="https://colab.research.google.com/drive/1JF6VieRSYcE72Dp49FVNyb9wadaA8P_8" rel="noopener noreferrer"&gt;buka notebook di Google Colab&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Permasalahan dan Tujuan
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Tujuan eksperimen ini:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Membuat model klasifikasi 3 kelas: Dropout, Enrolled, dan Graduate.&lt;/li&gt;
&lt;li&gt;Membandingkan model baseline dengan beberapa metode ensemble.&lt;/li&gt;
&lt;li&gt;Mengoptimasi model dengan hyperparameter tuning.&lt;/li&gt;
&lt;li&gt;Mencari faktor yang paling berhubungan dengan dropout.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  2. Dataset
&lt;/h2&gt;

&lt;p&gt;Kami memakai dataset &lt;strong&gt;Predict Students' Dropout and Academic Success&lt;/strong&gt; dari UCI Machine Learning Repository:&lt;br&gt;
&lt;a href="https://archive.ics.uci.edu/dataset/697/predict+students+dropout+and+academic+success" rel="noopener noreferrer"&gt;https://archive.ics.uci.edu/dataset/697/predict+students+dropout+and+academic+success&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Keterangan&lt;/th&gt;
&lt;th&gt;Isi&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Asal data&lt;/td&gt;
&lt;td&gt;Polytechnic Institute of Portalegre, Portugal (angkatan 2008/2009 sampai 2018/2019)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jumlah data&lt;/td&gt;
&lt;td&gt;4424 mahasiswa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fitur&lt;/td&gt;
&lt;td&gt;36 (data pendaftaran, latar belakang keluarga, kondisi ekonomi, nilai semester 1 dan 2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Target&lt;/td&gt;
&lt;td&gt;Dropout, Enrolled, Graduate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lisensi&lt;/td&gt;
&lt;td&gt;CC BY 4.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Dataset bisa dibaca langsung dari link download UCI, jadi tidak perlu upload file ke Colab. Pemisah kolomnya titik koma (&lt;code&gt;;&lt;/code&gt;).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://archive.ics.uci.edu/static/public/697/predict+students+dropout+and+academic+success.zip&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sep&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Shape:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# (4424, 37)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hasil pengecekan awal: &lt;strong&gt;tidak ada missing value&lt;/strong&gt; dan &lt;strong&gt;tidak ada data duplikat&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Eksplorasi Data (EDA)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Distribusi target
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F35ng3ww1p0hul78jthlv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F35ng3ww1p0hul78jthlv.png" alt="Jumlah mahasiswa per status" width="591" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;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 &lt;strong&gt;F1-macro&lt;/strong&gt; sebagai metrik utama.&lt;/p&gt;

&lt;h3&gt;
  
  
  Jumlah mata kuliah yang lulus di semester 2
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4pudzrt6dc3hwxh2xszc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4pudzrt6dc3hwxh2xszc.png" alt="Jumlah mata kuliah lulus di semester 2" width="586" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mahasiswa yang dropout lulus jauh lebih sedikit mata kuliah. Nilai tengahnya (median) 0 mata kuliah, sedangkan Enrolled 4 dan Graduate 6.&lt;/p&gt;

&lt;h3&gt;
  
  
  Status pembayaran uang kuliah
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxwyta9kbmagep1cxwmwt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxwyta9kbmagep1cxwmwt.png" alt="Status mahasiswa berdasarkan pembayaran uang kuliah" width="577" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dari mahasiswa yang uang kuliahnya &lt;strong&gt;tidak&lt;/strong&gt; lunas, 86.6% berakhir dropout. Pada mahasiswa yang uang kuliahnya lunas, angka dropout hanya 24.7%.&lt;/p&gt;

&lt;h3&gt;
  
  
  Korelasi fitur dengan dropout
&lt;/h3&gt;

&lt;p&gt;Untuk melihat korelasi, kami membuat kolom bantu &lt;code&gt;Dropout&lt;/code&gt; (1 = dropout, 0 = tidak dropout).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqyya45b0igypswfcegpw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqyya45b0igypswfcegpw.png" alt="Korelasi fitur dengan status dropout" width="800" height="723"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Preprocessing
&lt;/h2&gt;

&lt;p&gt;Langkah preprocessing yang kami lakukan:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Merapikan nama kolom, karena ada satu nama kolom yang mengandung karakter tab di ujungnya.&lt;/li&gt;
&lt;li&gt;Mengubah target menjadi angka: Dropout = 0, Enrolled = 1, Graduate = 2.&lt;/li&gt;
&lt;li&gt;Memisahkan fitur (&lt;code&gt;X&lt;/code&gt;) dan target (&lt;code&gt;y&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Membagi data menjadi 80% data latih dan 20% data uji. &lt;code&gt;stratify=y&lt;/code&gt; menjaga proporsi ketiga kelas tetap sama di data latih dan data uji.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;columns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;columns&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Target&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Target&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Dropout&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Enrolled&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Graduate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="n"&gt;X&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;drop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;columns&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Target&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Target&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;X_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;X_test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_test&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;train_test_split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;test_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;random_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;RANDOM_STATE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;stratify&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hasilnya 3539 data latih dan 885 data uji. Semua fitur sudah berbentuk angka dan tidak ada missing value, jadi model bisa langsung dilatih tanpa encoding atau imputasi. Standarisasi (&lt;code&gt;StandardScaler&lt;/code&gt;) hanya dipakai untuk Logistic Regression, karena model berbasis pohon tidak terpengaruh skala fitur.&lt;/p&gt;

&lt;p&gt;Ada tiga keputusan lain yang kami ambil di tahap ini:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Outlier tidak kami hapus.&lt;/strong&gt; Di bagian EDA, boxplot jumlah mata kuliah yang lulus di semester 2 memperlihatkan beberapa outlier pada ketiga kelas, yaitu titik-titik kecil di luar garis &lt;em&gt;whisker&lt;/em&gt;. Outlier ini masih masuk akal, misalnya mahasiswa yang memang lulus banyak mata kuliah, atau mahasiswa Graduate yang tidak mengambil mata kuliah sama sekali di semester 2 (titik-titik di angka 0). Selain itu, model berbasis pohon tidak terlalu sensitif terhadap outlier.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kode kategori dibiarkan berupa angka.&lt;/strong&gt; Walaupun semua fitur berbentuk angka, beberapa kolom sebenarnya adalah kode kategori, misalnya &lt;code&gt;Course&lt;/code&gt; (program studi) dengan kode seperti 171 atau 9254. Model berbasis pohon tetap bisa memisahkan kode-kode ini lewat percabangan, jadi kami tidak melakukan encoding. Logistic Regression berbeda: model ini membaca kode sebagai angka biasa, padahal kode 9254 tidak berarti lebih besar dari kode 171. Untuk model ini, &lt;em&gt;one-hot encoding&lt;/em&gt; mungkin lebih baik.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data leakage kami cegah.&lt;/strong&gt; Data leakage adalah bocornya informasi dari data uji ke proses pelatihan, sehingga skor model terlihat lebih bagus dari yang sebenarnya. &lt;code&gt;StandardScaler&lt;/code&gt; kami letakkan di dalam &lt;code&gt;Pipeline&lt;/code&gt;. Dengan begitu, saat cross validation (lihat bagian 5), scaler hanya menghitung rata-rata dan simpangan baku dari bagian yang dipakai untuk melatih, bukan dari bagian yang dipakai untuk menguji. Data uji tidak disentuh selama pelatihan dan tuning, dan baru dipakai di akhir untuk menilai model yang sudah jadi.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Model Baseline dan Cross Validation
&lt;/h2&gt;

&lt;p&gt;Baseline adalah model sederhana sebagai pembanding. Kami memakai &lt;strong&gt;Logistic Regression&lt;/strong&gt; (dengan &lt;code&gt;StandardScaler&lt;/code&gt; di dalam &lt;code&gt;Pipeline&lt;/code&gt;) dan satu &lt;strong&gt;Decision Tree&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;logistic&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Pipeline&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;scaler&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;StandardScaler&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;LogisticRegression&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_iter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;DecisionTreeClassifier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;random_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;RANDOM_STATE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Akurasi train&lt;/th&gt;
&lt;th&gt;Akurasi test&lt;/th&gt;
&lt;th&gt;F1-macro test&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Logistic Regression&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;0.768&lt;/td&gt;
&lt;td&gt;0.683&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Decision Tree&lt;/td&gt;
&lt;td&gt;1.000&lt;/td&gt;
&lt;td&gt;0.697&lt;/td&gt;
&lt;td&gt;0.639&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Decision Tree mendapat akurasi 1.0 di data latih tetapi hanya 0.697 di data uji. Satu pohon keputusan menghafal data latih (&lt;em&gt;overfitting&lt;/em&gt;).&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;cv_lr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;cross_val_score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logistic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;X_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cv&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;scoring&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;f1_macro&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;cv_tree&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;cross_val_score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;X_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cv&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;scoring&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;f1_macro&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;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
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  6. Ensemble Learning
&lt;/h2&gt;

&lt;p&gt;Ensemble learning menggabungkan banyak model supaya prediksinya lebih baik dan lebih stabil dibanding satu model saja.&lt;/p&gt;

&lt;h3&gt;
  
  
  6.1 Bagging dan Random Forest
&lt;/h3&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;bagging&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;BaggingClassifier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;estimator&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;DecisionTreeClassifier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;random_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;RANDOM_STATE&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;n_estimators&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;random_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;RANDOM_STATE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;n_jobs&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;rf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;RandomForestClassifier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;n_estimators&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;random_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;RANDOM_STATE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;n_jobs&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;
  
  
  6.2 Soft Voting
&lt;/h3&gt;

&lt;p&gt;Voting menggabungkan beberapa model yang &lt;strong&gt;berbeda jenis&lt;/strong&gt;. Pada soft voting, probabilitas prediksi dari setiap model dirata-rata, lalu kelas dengan probabilitas tertinggi dipilih.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;voting&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;VotingClassifier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;estimators&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;lr&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;logistic&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rf&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bagging&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bagging&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;voting&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;soft&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Soft Voting mendapat akurasi test 0.772 (tertinggi dari semua model) dan F1-macro test 0.688.&lt;/p&gt;

&lt;h3&gt;
  
  
  6.3 Boosting: AdaBoost dan Gradient Boosting
&lt;/h3&gt;

&lt;p&gt;Boosting melatih model secara &lt;strong&gt;berurutan&lt;/strong&gt;. Model berikutnya fokus memperbaiki kesalahan model sebelumnya.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;ada&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AdaBoostClassifier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;n_estimators&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;random_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;RANDOM_STATE&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;gb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;GradientBoostingClassifier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;random_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;RANDOM_STATE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;AdaBoost mendapat F1-macro test 0.664, justru lebih rendah dari baseline Logistic Regression. Gradient Boosting lebih baik dengan F1-macro test 0.690.&lt;/p&gt;

&lt;h3&gt;
  
  
  6.4 Stacking
&lt;/h3&gt;

&lt;p&gt;Stacking memakai prediksi beberapa model (&lt;em&gt;base model&lt;/em&gt;) sebagai input untuk satu model terakhir (&lt;em&gt;meta-model&lt;/em&gt;). Kami memakai Random Forest, Gradient Boosting, dan AdaBoost sebagai base model, dengan Logistic Regression sebagai meta-model.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;stacking&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;StackingClassifier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;estimators&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rf&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gb&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ada&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ada&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;final_estimator&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;LogisticRegression&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_iter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Stacking mendapat akurasi test 0.765 dan F1-macro test &lt;strong&gt;0.701&lt;/strong&gt;, tertinggi di antara semua model.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Hyperparameter Tuning dengan GridSearchCV
&lt;/h2&gt;

&lt;p&gt;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).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;param_rf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;n_estimators&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;max_depth&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;min_samples_leaf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;grid_rf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;GridSearchCV&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nc"&gt;RandomForestClassifier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;random_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;RANDOM_STATE&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;param_rf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;cv&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;scoring&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;f1_macro&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;n_jobs&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;grid_rf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_train&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Parameter terbaik&lt;/th&gt;
&lt;th&gt;F1-macro CV&lt;/th&gt;
&lt;th&gt;F1-macro test&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Random Forest (tuned)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;n_estimators=100&lt;/code&gt;, &lt;code&gt;max_depth=None&lt;/code&gt;, &lt;code&gt;min_samples_leaf=1&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;0.698&lt;/td&gt;
&lt;td&gt;0.692&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gradient Boosting (tuned)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;learning_rate=0.05&lt;/code&gt;, &lt;code&gt;max_depth=3&lt;/code&gt;, &lt;code&gt;n_estimators=200&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;0.703&lt;/td&gt;
&lt;td&gt;0.689&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Parameter terbaik Random Forest hampir sama dengan parameter bawaan scikit-learn, jadi kenaikannya kecil.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Perbandingan Semua Model
&lt;/h2&gt;

&lt;p&gt;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.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;cv_score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;cross_val_score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;X_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cv&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;scoring&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;f1_macro&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n_jobs&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;pred&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;predict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X_test&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;F1 CV&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cv_score&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Accuracy Test&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;accuracy_score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pred&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;F1 Test&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;f1_score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pred&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;average&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;macro&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;F1 CV&lt;/th&gt;
&lt;th&gt;Akurasi test&lt;/th&gt;
&lt;th&gt;F1 test&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Stacking&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.714&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.765&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.701&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gradient Boosting (tuned)&lt;/td&gt;
&lt;td&gt;0.703&lt;/td&gt;
&lt;td&gt;0.759&lt;/td&gt;
&lt;td&gt;0.689&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Soft Voting&lt;/td&gt;
&lt;td&gt;0.701&lt;/td&gt;
&lt;td&gt;0.772&lt;/td&gt;
&lt;td&gt;0.688&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gradient Boosting&lt;/td&gt;
&lt;td&gt;0.701&lt;/td&gt;
&lt;td&gt;0.759&lt;/td&gt;
&lt;td&gt;0.690&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bagging&lt;/td&gt;
&lt;td&gt;0.699&lt;/td&gt;
&lt;td&gt;0.749&lt;/td&gt;
&lt;td&gt;0.677&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Random Forest (tuned)&lt;/td&gt;
&lt;td&gt;0.698&lt;/td&gt;
&lt;td&gt;0.767&lt;/td&gt;
&lt;td&gt;0.692&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Random Forest&lt;/td&gt;
&lt;td&gt;0.693&lt;/td&gt;
&lt;td&gt;0.765&lt;/td&gt;
&lt;td&gt;0.682&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Logistic Regression (baseline)&lt;/td&gt;
&lt;td&gt;0.678&lt;/td&gt;
&lt;td&gt;0.768&lt;/td&gt;
&lt;td&gt;0.683&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AdaBoost&lt;/td&gt;
&lt;td&gt;0.672&lt;/td&gt;
&lt;td&gt;0.744&lt;/td&gt;
&lt;td&gt;0.664&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Decision Tree (baseline)&lt;/td&gt;
&lt;td&gt;0.618&lt;/td&gt;
&lt;td&gt;0.697&lt;/td&gt;
&lt;td&gt;0.639&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flq6i9mjkvjed1zi8ebwf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flq6i9mjkvjed1zi8ebwf.png" alt="Perbandingan F1-macro cross validation dan data uji" width="800" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Evaluasi Model Final
&lt;/h2&gt;

&lt;p&gt;Model final dipilih berdasarkan &lt;strong&gt;F1 CV tertinggi&lt;/strong&gt;, bukan skor data uji, supaya data uji tetap menjadi penilaian akhir yang netral. Model terpilih adalah &lt;strong&gt;Stacking&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;              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
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fttw70o8ihd36vzmc516e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fttw70o8ihd36vzmc516e.png" alt="Confusion matrix model Stacking" width="554" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cara membaca confusion matrix: baris adalah kelas asli, kolom adalah hasil prediksi, dan angka di diagonal adalah prediksi yang benar.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Graduate&lt;/strong&gt; dikenali dengan sangat baik: 398 dari 442 benar (recall 0.90).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dropout&lt;/strong&gt; cukup baik: 209 dari 284 benar (recall 0.74).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enrolled&lt;/strong&gt; paling sulit: hanya 70 dari 159 benar (recall 0.44). Sebanyak 39 mahasiswa Enrolled diprediksi Dropout dan 50 diprediksi Graduate.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  10. Fitur Paling Berpengaruh
&lt;/h2&gt;

&lt;p&gt;Stacking tidak punya atribut &lt;code&gt;feature_importances_&lt;/code&gt;, jadi kami memakai Random Forest hasil tuning untuk melihat fitur yang paling berpengaruh.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8muiuv37jb355aq56xh2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8muiuv37jb355aq56xh2.png" alt="10 fitur paling berpengaruh" width="800" height="470"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  11. Analisis Hasil
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Ensemble lebih baik dari baseline.&lt;/strong&gt; 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.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tidak semua ensemble otomatis lebih baik.&lt;/strong&gt; 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.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Efek hyperparameter tuning kecil.&lt;/strong&gt; 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.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kelas Enrolled paling sulit.&lt;/strong&gt; Datanya paling sedikit (17.9%) dan kondisinya berada di antara Dropout dan Graduate, sehingga sering tertukar dengan dua kelas lainnya.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Faktor akademik paling penting.&lt;/strong&gt; 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.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  12. Kesimpulan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Ensemble learning berhasil meningkatkan performa prediksi dropout dibanding model baseline. Model terbaik adalah &lt;strong&gt;Stacking&lt;/strong&gt; (Random Forest + Gradient Boosting + AdaBoost dengan meta-model Logistic Regression) dengan &lt;strong&gt;F1-macro 0.701&lt;/strong&gt; dan &lt;strong&gt;akurasi 0.765&lt;/strong&gt; di data uji.&lt;/li&gt;
&lt;li&gt;Hyperparameter tuning dengan GridSearchCV hanya memberi kenaikan kecil (sekitar 0.002 sampai 0.005 F1-macro CV).&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  13. Keterbatasan
&lt;/h2&gt;

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

&lt;h2&gt;
  
  
  Notebook
&lt;/h2&gt;

&lt;p&gt;Kode lengkap beserta semua output bisa dilihat dan dijalankan ulang di Google Colab: &lt;a href="https://colab.research.google.com/drive/1JF6VieRSYcE72Dp49FVNyb9wadaA8P_8" rel="noopener noreferrer"&gt;https://colab.research.google.com/drive/1JF6VieRSYcE72Dp49FVNyb9wadaA8P_8&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Anggota Kelompok
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;No&lt;/th&gt;
&lt;th&gt;Nama&lt;/th&gt;
&lt;th&gt;NIM&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Priskila Novaulin Tulangouw&lt;/td&gt;
&lt;td&gt;2432084&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Selia Emeline&lt;/td&gt;
&lt;td&gt;2432035&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Hendra Cung&lt;/td&gt;
&lt;td&gt;2432065&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Shinta Natalia&lt;/td&gt;
&lt;td&gt;2432020&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Firman&lt;/td&gt;
&lt;td&gt;2432063&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Mata kuliah Penerapan Kecerdasan Buatan, Program Studi Teknologi Informasi.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referensi
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Realinho, V., Machado, J., Baptista, L., &amp;amp; Martins, M. V. (2022). Predicting Student Dropout and Academic Success. &lt;em&gt;Data&lt;/em&gt;, 7(11), 146. &lt;a href="https://doi.org/10.3390/data7110146" rel="noopener noreferrer"&gt;https://doi.org/10.3390/data7110146&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;UCI Machine Learning Repository: Predict Students' Dropout and Academic Success. &lt;a href="https://archive.ics.uci.edu/dataset/697/predict+students+dropout+and+academic+success" rel="noopener noreferrer"&gt;https://archive.ics.uci.edu/dataset/697/predict+students+dropout+and+academic+success&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dokumentasi scikit-learn: Ensemble methods. &lt;a href="https://scikit-learn.org/stable/modules/ensemble.html" rel="noopener noreferrer"&gt;https://scikit-learn.org/stable/modules/ensemble.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>machinelearning</category>
      <category>python</category>
      <category>datascience</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
