kmi_Dashboard1 / src /inverse_model_forward.py
Delima1's picture
Upload dashbord terbaru
6c260ef verified
import streamlit as st
import pandas as pd
import numpy as np
import joblib
import os
# --- KONFIGURASI PATH ---
BASE_MODEL_FOLDER = r"C:\Dokumen\One To Many_17_10_2025\MMBTU\DASHBOARD\One To Many\MODEL CHECKPOINT FOR INVERSE MODEL"
AVAILABLE_PRODUCTS = ["BMR BASE", "CKP BASE", "CKR BASE", "CMR BASE", "MORIGRO BASE"]
INPUT_FEATURES = [
"D101330TT", "D102260TIC_CV", "D102265TIC_PV",
"D102265TIC_CV", "D102266TIC", "D101264FTSCL"
]
@st.cache_resource(show_spinner="Memuat model...")
def load_model_artifacts(product_name, base_folder):
file_name = f"model_checkpoint_xgb_{product_name}.joblib"
model_path = os.path.join(base_folder, file_name)
if not os.path.exists(model_path):
st.error(f"File model tidak ditemukan untuk **{product_name}** di: **{model_path}**")
return None, None, None, None
try:
deployment_bundle = joblib.load(model_path)
# Mengambil artefak sesuai dengan struktur kode awal Anda
model = deployment_bundle.get('model')
poly_transformer = deployment_bundle.get('poly_transformer')
input_features = deployment_bundle.get('input_features')
poly_feature_names = deployment_bundle.get('poly_feature_names')
# Validasi sederhana
if model is None or poly_transformer is None or input_features is None or poly_feature_names is None:
st.error(f"Salah satu artefak (model, poly_transformer, input_features, poly_feature_names) hilang dalam file joblib **{product_name}**.")
return None, None, None, None
return model, poly_transformer, input_features, poly_feature_names
except Exception as e:
st.error(f"Gagal memuat atau membaca file joblib. Error: {e}")
return None, None, None, None
# --- TAMPILAN (UI) STREAMLIT ---
st.set_page_config(page_title="Dashboard Prediksi GAS MMBTU", layout="wide")
with st.sidebar:
st.header("⚙️ Konfigurasi Model")
# Dropdown untuk memilih produk
selected_product = st.selectbox(
"Pilih Produk Target:",
AVAILABLE_PRODUCTS,
index=AVAILABLE_PRODUCTS.index("CKR BASE") if "CKR BASE" in AVAILABLE_PRODUCTS else 0
)
st.markdown(f"**Folder Model:** `{BASE_MODEL_FOLDER}`")
st.title(f"🔥 Dashboard Prediksi GAS MMBTU: **{selected_product}**")
st.markdown("Dashboard ini menggunakan model **XGBoost** dan transformasi **Polinomial**.")
st.markdown("---")
model, poly_transformer, input_features_loaded, poly_feature_names = load_model_artifacts(
selected_product, BASE_MODEL_FOLDER
)
if model is None:
st.stop() # Berhenti jika model gagal dimuat
# Cek apakah fitur input konsisten
if set(input_features_loaded) != set(INPUT_FEATURES):
st.warning("Fitur Input yang dimuat dari joblib berbeda dengan daftar fitur default. Menggunakan fitur dari joblib.")
INPUT_FEATURES = input_features_loaded
st.subheader("🧪 Masukkan Nilai Input Mentah")
st.markdown("Harap masukkan nilai numerik untuk 6 fitur di bawah:")
# Membuat kolom input untuk 6 fitur
cols = st.columns(len(INPUT_FEATURES))
user_raw_data = {}
for i, feature in enumerate(INPUT_FEATURES):
# Menggunakan nilai default untuk contoh
default_value = 0.0
if feature == "D101330TT": default_value = 95.0
elif feature == "D102260TIC_CV": default_value = 45.0
elif feature == "D102265TIC_PV": default_value = 185.0
elif feature == "D102265TIC_CV": default_value = 17.0
elif feature == "D102266TIC": default_value = 16.0
elif feature == "D101264FTSCL": default_value = 3800.0
# Input nilai per fitur
user_raw_data[feature] = cols[i].number_input(
feature,
value=default_value,
format="%.4f",
key=f"input_{feature}"
)
st.markdown("---")
# Tombol prediksi
if st.button("🔮 Prediksi GAS MMBTU Sekarang", type="primary", use_container_width=True):
# Membuat DataFrame dari input mentah (sesuai urutan fitur input)
sim_input_df = pd.DataFrame([user_raw_data])[INPUT_FEATURES]
st.subheader("⚙️ Proses Transformasi & Prediksi")
# 1. Transformasi Polinomial
with st.spinner("1. Menerapkan transformasi polinomial..."):
transformed_input_np = poly_transformer.transform(sim_input_df)
transformed_input_df = pd.DataFrame(
transformed_input_np,
columns=poly_feature_names,
index=sim_input_df.index
)
# 2. Prediksi
with st.spinner("2. Melakukan prediksi dengan model..."):
predictions = model.predict(transformed_input_df)
prediksi_final = predictions[0]
st.markdown("### ✅ Hasil Prediksi")
st.metric(
f"Prediksi Kebutuhan **GAS MMBTU** untuk {selected_product}",
f"{prediksi_final:.6f}MMBTU"
)
st.markdown("---")