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.
-
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
log1p untuk menangani distribusi permintaan yang miring
-
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
-
Validasi Time Series
- Menggunakan TimeSeriesSplit untuk validasi yang sadar waktu
- 3 pembagian waktu untuk validasi yang kuat
Total 37 fitur digunakan dalam model, termasuk 11 fitur dasar dan 26 fitur lanjutan:
1base_features = [
2 'Year', 'Month', 'Quarter', 'WeekNumber', 'IsHoliday',
3 'UnitPrice', 'ProductCategory_encoded',
4 'TotalDemand', 'AvgDemand', 'TotalRevenue', 'UniqueCustomers'
5]
6
7lag_features = ['Demand_lag_1', 'Demand_lag_2', 'Demand_lag_3', 'Demand_lag_4']
8rolling_features = ['Demand_rolling_mean_2', 'Demand_rolling_mean_4', ...]
9trend_features = ['Demand_trend_2w', 'Demand_trend_4w']
10seasonal_features = ['Month_sin', 'Month_cos', 'Week_sin', 'Week_cos']
11interaction_features = ['Price_Category_Interaction', 'Holiday_Category_Interaction', 'Price_Holiday_Interaction']
12relative_features = ['Demand_vs_AvgDemand', 'Price_vs_Category_Mean']
13demand_level_features = ['Is_Zero_Demand', 'Is_Low_Demand']
1import joblib
2import json
3
4# Load model
5model_path = 'models/xgboost_weekly_demand_hf'
6model = joblib.load(f'{model_path}/xgboost_model.joblib')
7
8# Load feature names
9with open(f'{model_path}/feature_names.json', 'r') as f:
10 feature_names = json.load(f)
11
12# Load model metadata
13with open(f'{model_path}/model_metadata.json', 'r') as f:
14 model_metadata = json.load(f)
1import numpy as np
2
3def transform_target(y, method='log1p'):
4 if method == 'log1p':
5 return np.log1p(y)
6 elif method == 'sqrt':
7 return np.sqrt(y)
8 return y
9
10def inverse_transform_target(y_transformed, method='log1p'):
11 if method == 'log1p':
12 return np.expm1(y_transformed)
13 elif method == 'sqrt':
14 return np.square(y_transformed)
15 return y_transformed
16
17# Prediksi dengan data baru
18X_new = df[feature_names].fillna(0)
19y_pred_transformed = model.predict(X_new)
20y_pred = inverse_transform_target(y_pred_transformed, 'log1p')
21y_pred = np.maximum(y_pred, 0) # Pastikan permintaan non-negatif
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.