From c9f8a025733fc229d490dc958a3b65274458a75f Mon Sep 17 00:00:00 2001 From: Evelyn Sucitro Date: Sat, 19 Sep 2026 13:21:34 +0700 Subject: [PATCH] feat: add model selection --- model_selection.md | 23 ++++++++++++++++++ model_selection_examples.py | 47 +++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 model_selection.md create mode 100644 model_selection_examples.py diff --git a/model_selection.md b/model_selection.md new file mode 100644 index 0000000..cac6d5b --- /dev/null +++ b/model_selection.md @@ -0,0 +1,23 @@ +(a) Prediksi stok barang dari 12 bulan historis penjualan + +Arsitektur: LSTM (atau ML Klasik seperti XGBoost / SARIMA sebagai alternatif kuat). + +Justifikasi: Data penjualan historis merupakan deret waktu (time-series) yang memiliki dependensi temporal, tren, dan pola musiman antar-bulan. LSTM dirancang khusus untuk memproses data sekuensial dengan mempertahankan informasi masa lalu melalui mekanisme cell state dan gates, sehingga mampu menangkap dinamika tren penjualan tanpa kehilangan memori jangka panjang. + +(b) Klasifikasi foto produk rusak vs normal di lini produksi + +Arsitektur: CNN (Convolutional Neural Network). + +Justifikasi: Data citra memerlukan ekstraksi pola visual lokal seperti goresan, retakan, atau perbedaan warna yang terikat pada korelasi spasial antarpiksel. Operasi konvolusi pada CNN mampu mengekstraksi hierarki fitur visual (dari garis tepi hingga tekstur utuh) serta memiliki sifat translation invariance, sehingga cacat produk tetap terdeteksi meskipun posisinya bergeser. + +(c) Analisis sentimen review Google Play Store + +Arsitektur: LSTM (atau variannya seperti Bi-LSTM / model berbasis Transformer). + +Justifikasi: Ulasan teks adalah data sekuensial linguistik di mana arti suatu kalimat sangat bergantung pada urutan dan konteks kata di sekitarnya. LSTM secara efektif menangani panjang kalimat yang bervariasi dan mampu mempertahankan konteks makna dari awal hingga akhir ulasan untuk menentukan polaritas sentimen positif atau negatif secara akurat. + +(d) Prediksi churn pelanggan dari 15 kolom tabular + +Arsitektur: ML Klasik (seperti XGBoost, LightGBM, atau Random Forest). + +Justifikasi: Pada data tabular berdimensi kecil (15 fitur), model gradient boosted decision trees secara konsisten mengungguli deep learning dalam hal performa generalisasi, kecepatan latih, dan interpretasi fitur (feature importance). Jaringan saraf seperti ANN cenderung membutuhkan volume sampel yang jauh lebih besar dan rentan overfitting pada batas keputusan data tabular yang tidak terstruktur secara spasial. \ No newline at end of file diff --git a/model_selection_examples.py b/model_selection_examples.py new file mode 100644 index 0000000..2ddf858 --- /dev/null +++ b/model_selection_examples.py @@ -0,0 +1,47 @@ +import numpy as np +import tensorflow as tf +from tensorflow import keras +from keras.layers import Conv2D, Dense, Embedding, Flatten, LSTM, MaxPooling2D +from keras.models import Sequential +from xgboost import XGBClassifier + +# (a) Prediksi Stok Barang (LSTM) +# Input shape: (samples, time_steps=12, features=1) +model_a = Sequential([ + LSTM(32, input_shape=(12, 1)), + Dense(1) +]) +model_a.compile(optimizer='adam', loss='mse') + +# (b) Klasifikasi Foto Produk Rusak vs Normal (CNN) +# Input shape contoh citra RGB 128x128 +model_b = Sequential([ + Conv2D(32, (3, 3), activation='relu', input_shape=(128, 128, 3)), + MaxPooling2D((2, 2)), + Flatten(), + Dense(64, activation='relu'), + Dense(1, activation='sigmoid') # binary: rusak vs normal +]) +model_b.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) + +# (c) Analisis Sentimen Ulasan Play Store (LSTM + Embedding) +vocab_size = 5000 +max_length = 100 + +model_c = Sequential([ + Embedding(input_dim=vocab_size, output_dim=64, input_length=max_length), + LSTM(64), + Dense(32, activation='relu'), + Dense(1, activation='sigmoid') # binary: positif vs negatif +]) +model_c.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) + +# (d) Prediksi Churn Pelanggan Tabular (ML Klasik - XGBoost) +# X_train memiliki dimensi (n_samples, 15) +model_d = XGBClassifier( + n_estimators=100, + max_depth=4, + learning_rate=0.1, + random_state=42 +) +# model_d.fit(X_train, y_train) \ No newline at end of file