Spaces:
Running
Running
File size: 4,697 Bytes
bbf5602 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | import pandas as pd
import numpy as np
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
import joblib
import io
import warnings
warnings.filterwarnings('ignore')
print("π MEMULAI PROSES TRAINING AI LEVEL ADVANCED (ECO-TWIN PRO)...\n")
# ==========================================
# 1. DATA INGESTION & AUGMENTATION (2 TAHUN)
# ==========================================
print("π₯ 1. Menarik & Memproses Data Historis (2023 - 2024)...")
# Baseline Sampah (Diambil dari SIPSN DKI 2025)
base_sampah = 1050.50
mrt_harian_avg = 85000
hujan_mean = 10.5
# Data Event
data_event_csv = """Tanggal,Nama_Event,Ada_Event
2023-01-01,Tahun Baru 2023,1
2023-03-11,Konser BLACKPINK,1
2023-03-12,Konser BLACKPINK,1
2023-05-26,Java Jazz,1
2023-06-19,Timnas Argentina,1
2023-11-15,Coldplay,1
2023-12-31,Tahun Baru 2024,1
2024-01-01,Tahun Baru 2024,1
2024-03-02,Ed Sheeran,1
2024-05-24,Java Jazz 2024,1
2024-12-31,Malam Tahun Baru 2025,1"""
df_event = pd.read_csv(io.StringIO(data_event_csv))
df_event['Tanggal'] = pd.to_datetime(df_event['Tanggal'])
# Bikin Master Kalender 2 Tahun (Lebih banyak data, AI makin pintar)
df = pd.DataFrame({'Tanggal': pd.date_range(start="2023-01-01", end="2024-12-31")})
df = pd.merge(df, df_event[['Tanggal', 'Ada_Event']], on='Tanggal', how='left').fillna({'Ada_Event': 0})
# Simulasi Pola Realistis
df['Penumpang_MRT'] = np.random.normal(loc=mrt_harian_avg, scale=mrt_harian_avg*0.15, size=len(df)).astype(int)
df['Curah_Hujan_mm'] = np.random.exponential(scale=hujan_mean, size=len(df))
df.loc[df['Curah_Hujan_mm'] < 2, 'Curah_Hujan_mm'] = 0
# ==========================================
# 2. ADVANCED FEATURE ENGINEERING (MIND-BLOWING)
# ==========================================
print("π§ 2. Melakukan Feature Engineering (Ekstraksi Pola Waktu)...")
# Ekstraksi Siklus Waktu
df['Hari_Dalam_Minggu'] = df['Tanggal'].dt.dayofweek # 0=Senin, 6=Minggu
df['Bulan'] = df['Tanggal'].dt.month
df['Is_Weekend'] = df['Hari_Dalam_Minggu'].apply(lambda x: 1 if x >= 5 else 0)
# Lag Features (Mengingat masa lalu)
# "Hujan kemarin bikin sampah hari ini lebih berat (menyerap air)"
df['Hujan_Kemarin'] = df['Curah_Hujan_mm'].shift(1).fillna(0)
# Target Variable Generation (Rumus Super Kompleks)
df['Volume_Sampah_Ton'] = base_sampah + \
(df['Ada_Event'] * base_sampah * np.random.uniform(0.15, 0.30, size=len(df))) + \
(df['Is_Weekend'] * base_sampah * 0.08) + \
(df['Curah_Hujan_mm'] / 50 * base_sampah * 0.03) + \
(df['Hujan_Kemarin'] / 50 * base_sampah * 0.05) + \
((df['Penumpang_MRT'] - mrt_harian_avg) / mrt_harian_avg * base_sampah * 0.02)
# Noise (Fluktuasi harian)
df['Volume_Sampah_Ton'] += np.random.normal(0, base_sampah*0.02, size=len(df))
df['Volume_Sampah_Ton'] = df['Volume_Sampah_Ton'].round(2)
# Simpan dataset
df.to_csv('dataset_advanced_eco_twin.csv', index=False)
# ==========================================
# 3. CHRONOLOGICAL SPLIT & TRAINING
# ==========================================
print("βοΈ 3. Melatih Model AI dengan Algoritma Gradient Boosting...")
# Fitur yang dipakai AI buat mikir
fitur = ['Penumpang_MRT', 'Ada_Event', 'Curah_Hujan_mm', 'Hujan_Kemarin', 'Hari_Dalam_Minggu', 'Bulan', 'Is_Weekend']
X = df[fitur]
y = df['Volume_Sampah_Ton']
# Memisahkan masa lalu (2023) buat belajar, masa depan (2024) buat ujian
train_size = int(len(df) * 0.75) # 75% data awal
X_train, X_test = X.iloc[:train_size], X.iloc[train_size:]
y_train, y_test = y.iloc[:train_size], y.iloc[train_size:]
# Menggunakan Gradient Boosting (State-of-the-Art)
model = GradientBoostingRegressor(
n_estimators=200,
learning_rate=0.1,
max_depth=4,
random_state=42
)
model.fit(X_train, y_train)
# ==========================================
# 4. EVALUASI AKURASI (BUAT DIPAMERIN KE JURI)
# ==========================================
prediksi = model.predict(X_test)
rmse = mean_squared_error(y_test, prediksi) ** 0.5
mae = mean_absolute_error(y_test, prediksi)
r2 = r2_score(y_test, prediksi)
print("\nπ HASIL EVALUASI MODEL (METRICS):")
print(f" β
Root Mean Squared Error (RMSE) : {rmse:.2f} Ton")
print(f" β
Mean Absolute Error (MAE) : {mae:.2f} Ton")
print(f" β
R-Squared (R2 Score) : {r2 * 100:.2f}% (Tingkat Kepercayaan AI)")
# Cek Fitur Paling Berpengaruh
importances = model.feature_importances_
print("\nπ FITUR PALING BERPENGARUH PADA TIMBULAN SAMPAH:")
for name, importance in zip(fitur, importances):
print(f" - {name}: {importance*100:.1f}%")
# Simpan Model
joblib.dump(model, 'model_sampah_advanced.pkl')
print("\nπΎ SUCCESS! 'model_sampah_advanced.pkl' berhasil di-generate!")
|