From c6f6ff0cc05cf16f0367b4f3613eb5705ce58fde Mon Sep 17 00:00:00 2001 From: Trefor Southwell Date: Tue, 24 Feb 2026 09:58:29 +0000 Subject: [PATCH] Increase initial training --- apps/predbat/load_ml_component.py | 7 ++++--- apps/predbat/tests/test_load_ml.py | 15 ++++++++++++--- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/apps/predbat/load_ml_component.py b/apps/predbat/load_ml_component.py index fd2c12ccc..4954bbb92 100644 --- a/apps/predbat/load_ml_component.py +++ b/apps/predbat/load_ml_component.py @@ -75,7 +75,9 @@ def initialize(self, load_ml_enable, load_ml_source=True, load_ml_max_days_histo self.ml_learning_rate = 0.001 self.ml_epochs_initial = 100 - self.ml_epochs_update = 20 + self.ml_epochs_update = 30 + self.ml_patience_initial = 20 + self.ml_patience_update = 10 self.ml_min_days = 1 self.ml_validation_threshold = 2.0 self.ml_time_decay_days = 30 @@ -85,7 +87,6 @@ def initialize(self, load_ml_enable, load_ml_source=True, load_ml_max_days_histo self.ml_max_days_history = load_ml_max_days_history self.load_ml_database_days = load_ml_database_days self.ml_validation_holdout_hours = 24 - self.ml_epochs_patience = 5 # Data state self.load_data = None @@ -864,7 +865,7 @@ async def _do_training(self, is_initial): epochs = self.ml_epochs_initial if is_initial else self.ml_epochs_update time_decay = min(self.ml_time_decay_days, self.load_data_age_days) holdout_hours = self.ml_validation_holdout_hours - patience = self.ml_epochs_patience + patience = self.ml_patience_initial if is_initial else self.ml_patience_update # Lock released - event loop is free during training try: diff --git a/apps/predbat/tests/test_load_ml.py b/apps/predbat/tests/test_load_ml.py index 554429698..83991668d 100644 --- a/apps/predbat/tests/test_load_ml.py +++ b/apps/predbat/tests/test_load_ml.py @@ -1112,13 +1112,13 @@ def _test_real_data_training(): has_rates = import_rates_data and export_rates_data and len(import_rates_data) > 0 and len(export_rates_data) > 0 rates_info = " + import/export rates" if has_rates else "" print(f" Training on real load + {data_source} PV/temperature{rates_info} with {len(load_data)} points...") - success = predictor.train(load_data, now_utc, pv_minutes=pv_data, temp_minutes=temp_data, import_rates=import_rates_data, export_rates=export_rates_data, is_initial=True, epochs=50, time_decay_days=7, validation_holdout_hours=48) + success = predictor.train(load_data, now_utc, pv_minutes=pv_data, temp_minutes=temp_data, import_rates=import_rates_data, export_rates=export_rates_data, is_initial=True, epochs=100, time_decay_days=30, validation_holdout_hours=48, patience=20) assert success, "Training on real data should succeed" assert predictor.model_initialized, "Model should be initialized after training" - success = predictor.train(load_data, now_utc, pv_minutes=pv_data, temp_minutes=temp_data, import_rates=import_rates_data, export_rates=export_rates_data, is_initial=False, epochs=50, time_decay_days=7, validation_holdout_hours=48) - success = predictor.train(load_data, now_utc, pv_minutes=pv_data, temp_minutes=temp_data, import_rates=import_rates_data, export_rates=export_rates_data, is_initial=False, epochs=50, time_decay_days=7, validation_holdout_hours=48) + success = predictor.train(load_data, now_utc, pv_minutes=pv_data, temp_minutes=temp_data, import_rates=import_rates_data, export_rates=export_rates_data, is_initial=False, epochs=20, time_decay_days=30, validation_holdout_hours=48, patience=10) + success = predictor.train(load_data, now_utc, pv_minutes=pv_data, temp_minutes=temp_data, import_rates=import_rates_data, export_rates=export_rates_data, is_initial=False, epochs=20, time_decay_days=30, validation_holdout_hours=48, patience=10) # Make predictions print(f" Generating predictions with PV + temperature{rates_info} forecasts...") @@ -1248,6 +1248,15 @@ def _test_real_data_training(): val_pred_minutes.append(minute) val_pred_energy.append(dp4(energy_kwh)) + # --- Day 7 total comparison --- + actual_day7_total = sum(val_actual_energy) + predicted_day7_total = sum(val_pred_energy) + error_kwh = predicted_day7_total - actual_day7_total + error_pct = (error_kwh / actual_day7_total * 100) if actual_day7_total > 0 else 0.0 + print(f" Day 7 actual total : {actual_day7_total:.3f} kWh") + print(f" Day 7 predicted total: {predicted_day7_total:.3f} kWh") + print(f" Day 7 error : {error_kwh:+.3f} kWh ({error_pct:+.1f}%)") + # Convert predictions (cumulative kWh) to energy per step (kWh) for plotting # predict() returns cumulative format; compute deltas for the chart pred_minutes = []