XGBoost Weekly Demand Forecasting Model
Overview
Model ini dikembangkan untuk meramalkan permintaan produk mingguan menggunakan algoritma XGBoost dengan fitur yang ditingkatkan. Model ini menggunakan pendekatan time series forecasting dengan validasi yang tepat menggunakan TimeSeriesSplit untuk mencegah kebocoran data masa depan.
Performa Model
Model menunjukkan performa yang sangat baik dengan metrik sebagai berikut:
- R² Score: 0.9677
- RMSE: 15.06
- MAE: 1.33
- MAPE: 1.4%
Performa per Segmen
Model memberikan hasil yang konsisten di semua segmen permintaan:
| Segmen Permintaan | MAPE |
|---|---|
| Rendah (≤25%) | 0.6% |
| Sedang (25-75%) | 1.4% |
| Tinggi (>75%) | 2.3% |
Visualisasi Utama
Aktual vs Prediksi
Analisis Residual
Distribusi Error
Peningkatan yang Diimplementasikan
Feature Engineering Lanjutan
- Fitur lag (1, 2, 3, 4 minggu)
- Fitur rolling window (mean, std, max dengan jendela 2, 4, 8 minggu)
- Fitur tren (2 minggu, 4 minggu)
- Fitur musiman (sin/cos transformasi bulan dan minggu)
- Fitur interaksi (harga, kategori, hari libur)
- Fitur relatif (permintaan vs rata-rata, harga vs kategori)
- Fitur level permintaan (permintaan nol, permintaan rendah)
Transformasi Target
- Transformasi
log1puntuk menangani distribusi permintaan yang miring
- Transformasi
Optimasi Hyperparameter
- Parameter terbaik dari RandomizedSearchCV:
- n_estimators: 300
- max_depth: 7
- learning_rate: 0.12
- subsample: 1.0
- colsample_bytree: 1.0
- reg_alpha: 0.1
- reg_lambda: 1.0
- Parameter terbaik dari RandomizedSearchCV:
Validasi Time Series
- Menggunakan TimeSeriesSplit untuk validasi yang sadar waktu
- 3 pembagian waktu untuk validasi yang kuat
Fitur yang Digunakan
Total 37 fitur digunakan dalam model, termasuk 11 fitur dasar dan 26 fitur lanjutan:
base_features = [
'Year', 'Month', 'Quarter', 'WeekNumber', 'IsHoliday',
'UnitPrice', 'ProductCategory_encoded',
'TotalDemand', 'AvgDemand', 'TotalRevenue', 'UniqueCustomers'
]
lag_features = ['Demand_lag_1', 'Demand_lag_2', 'Demand_lag_3', 'Demand_lag_4']
rolling_features = ['Demand_rolling_mean_2', 'Demand_rolling_mean_4', ...]
trend_features = ['Demand_trend_2w', 'Demand_trend_4w']
seasonal_features = ['Month_sin', 'Month_cos', 'Week_sin', 'Week_cos']
interaction_features = ['Price_Category_Interaction', 'Holiday_Category_Interaction', 'Price_Holiday_Interaction']
relative_features = ['Demand_vs_AvgDemand', 'Price_vs_Category_Mean']
demand_level_features = ['Is_Zero_Demand', 'Is_Low_Demand']
Informasi Dataset
- Training: 70,954 sampel
- Validasi: 15,204 sampel
- Testing: 15,205 sampel
- Periode Training: 2010-W48 sampai 2011-W49
- Periode Testing: 2010-W48 sampai 2011-W49
Penggunaan Model
Loading Model
import joblib
import json
# Load model
model_path = 'models/xgboost_weekly_demand_hf'
model = joblib.load(f'{model_path}/xgboost_model.joblib')
# Load feature names
with open(f'{model_path}/feature_names.json', 'r') as f:
feature_names = json.load(f)
# Load model metadata
with open(f'{model_path}/model_metadata.json', 'r') as f:
model_metadata = json.load(f)
Membuat Prediksi
import numpy as np
def transform_target(y, method='log1p'):
if method == 'log1p':
return np.log1p(y)
elif method == 'sqrt':
return np.sqrt(y)
return y
def inverse_transform_target(y_transformed, method='log1p'):
if method == 'log1p':
return np.expm1(y_transformed)
elif method == 'sqrt':
return np.square(y_transformed)
return y_transformed
# Prediksi dengan data baru
X_new = df[feature_names].fillna(0)
y_pred_transformed = model.predict(X_new)
y_pred = inverse_transform_target(y_pred_transformed, 'log1p')
y_pred = np.maximum(y_pred, 0) # Pastikan permintaan non-negatif
Kesimpulan
Model XGBoost yang ditingkatkan ini menunjukkan performa yang sangat baik untuk peramalan permintaan mingguan. Dengan R² score 0.968 dan MAPE hanya 1.4%, model ini memberikan prediksi yang akurat di semua segmen permintaan.
Peningkatan utama dalam model ini meliputi feature engineering lanjutan, transformasi target, dan validasi time series yang tepat. Model siap untuk produksi dengan kemampuan monitoring yang komprehensif.
Dibuat oleh: Tim Katanya Circle
Tanggal: Juli 2025



