Quick Start Guide#
Source Files
examples/forecaster.pyexamples/experiment.pytwiga/forecaster/core.pytwiga/core/config/base.py
This guide walks through a complete forecasting workflow: loading data, configuring models, training, predicting, and evaluating.
Minimal Example with ML Models#
import pandas as pd
from sklearn.preprocessing import RobustScaler, StandardScaler
from twiga.core.config import DataPipelineConfig, ForecasterConfig
from twiga.forecaster.core import TwigaForecaster
from twiga.models.ml.xgboost_model import XGBOOSTConfig
from twiga.models.ml.lightgbm_model import LIGHTGBMConfig
# 1. Load your time series data
data = pd.read_parquet("data/my_timeseries.parquet")
# Expected columns: timestamp, target_variable, [optional features]
# 2. Configure the data pipeline
data_config = DataPipelineConfig(
target_feature="load_mw",
period="30min",
lookback_window_size=48,
forecast_horizon=48,
calendar_features=["hour", "day_night"],
exogenous_features=["ghi"],
latitude=-6.8,
longitude=39.3,
input_scaler=StandardScaler(),
target_scaler=RobustScaler(),
)
# 3. Configure models
xgb_config = XGBOOSTConfig(device="cpu")
lgb_config = LIGHTGBMConfig()
# 4. Configure training parameters
train_config = ForecasterConfig(
split_freq="days",
train_size=14,
test_size=7,
project_name="QuickStart",
)
# 5. Create forecaster
forecaster = TwigaForecaster(
data_params=data_config,
model_params=[xgb_config, lgb_config],
train_params=train_config,
)
# 6. Split data
train_df = data[data.timestamp <= "2024-06-01"]
val_df = data[(data.timestamp > "2024-05-15") & (data.timestamp <= "2024-07-01")]
test_df = data[data.timestamp > "2024-07-01"]
# 7. Fit models
forecaster.fit(train_df=train_df, val_df=val_df)
# 8. Evaluate point forecasts
predictions_df, metrics_df = forecaster.evaluate_point_forecast(
test_df=test_df,
ensemble_strategy="mean",
)
print(metrics_df.groupby("Model")[["mae", "rmse", "smape"]].mean().round(2))
Using Neural Network Models#
Neural network models use NeuralModelConfig and are created via from_data_config() for convenience:
from twiga.models.nn.mlpf_model import MLPFConfig
from twiga.models.nn.nhits_model import NHITSConfig
# Create NN configs from data config (automatically sets input/output dimensions)
mlpf_config = MLPFConfig.from_data_config(data_config)
mlpf_config.max_epochs = 20
mlpf_config.batch_size = 64
nhits_config = NHITSConfig.from_data_config(data_config)
nhits_config.max_epochs = 20
# Mix ML and NN models in a single forecaster
forecaster = TwigaForecaster(
data_params=data_config,
model_params=[xgb_config, lgb_config, mlpf_config, nhits_config],
train_params=train_config,
)
forecaster.fit(train_df=train_df, val_df=val_df)
predictions_df, metrics_df = forecaster.evaluate_point_forecast(
test_df=test_df,
ensemble_strategy="mean",
)
Note
Neural models require the nn optional dependency group. Install with pip install twiga[nn].
Hyperparameter Tuning#
Use Optuna-powered tuning before training to find optimal hyperparameters:
# Tune all models (uses Optuna with TPE sampler and Hyperband pruner)
forecaster.tune(
train_df=train_df,
val_df=val_df,
num_trials=20,
patience=5,
)
# Then fit with tuned parameters
forecaster.fit(train_df=train_df, val_df=val_df)
See Hyperparameter Tuning for details.
Backtesting#
Evaluate model performance over multiple time-based cross-validation folds:
predictions_df, metrics_df = forecaster.backtesting(
data=data,
train_ratio=1.0,
verbose=True,
ensemble_strategy="mean",
)
# Aggregate metrics across folds
print(metrics_df.groupby(["Model", "Folds"])[["mae", "rmse"]].mean().round(2))
The backtesting parameters are controlled by ForecasterConfig:
Parameter |
Description |
Example |
|---|---|---|
|
Unit for split sizes |
|
|
Training window length |
|
|
Test window length |
|
|
Gap between train and test |
|
|
Window strategy |
|
See Backtesting for details.
Conformal Prediction#
Add prediction intervals using conformal prediction:
from twiga.core.config import ConformalConfig
# Configure conformal prediction
conformal_config = ConformalConfig(
method="residual",
score_type="res",
alpha=0.1, # 90% prediction interval
)
# Create forecaster with conformal prediction
forecaster = TwigaForecaster(
data_params=data_config,
model_params=[xgb_config],
train_params=train_config,
conformal_params=conformal_config,
)
# Train the model
forecaster.fit(train_df=train_df, val_df=val_df)
# Calibrate on held-out data
forecaster.calibrate(calibrate_df=val_df)
# Generate prediction intervals
interval_predictions, interval_metrics = forecaster.evaluate_interval_forecast(
test_df=test_df,
)
See Conformal Prediction for details on available methods and score types.
Accessing Predictions#
Predictions are returned as dictionaries mapping model names to NumPy arrays:
# Point predictions
prediction_dict, inference_times = forecaster.predict(test_df=test_df)
for model_name, preds in prediction_dict.items():
print(f"{model_name}: shape={preds.shape}")
# Shape: (num_samples, forecast_horizon, num_targets)
# Interval predictions (after calibration)
interval_dict, inference_times = forecaster.predict_interval(test_df=test_df)
for model_name, (lower, point, upper) in interval_dict.items():
print(f"{model_name}: lower={lower.shape}, point={point.shape}, upper={upper.shape}")
Formatting Results#
Use the built-in result formatting utilities:
from twiga.core.plot.gt import twiga_report
# Aggregate metrics
res = metrics_df.groupby("Model")[["mae", "corr", "rmse", "smape"]].mean().round(2).reset_index()
res = res.rename(columns={"mae": "MAE", "corr": "Corr", "rmse": "RMSE", "smape": "SMAPE"})
# Create a formatted comparison table
twiga_report(
res,
metrics=["MAE", "Corr", "SMAPE", "RMSE"],
minimize_cols=["MAE", "SMAPE", "RMSE"],
maximize_cols=["Corr"],
)