SIENTIAPDE-1430: Implement advanced model training capabilities and enhanced data preprocessing. This includes support for Polynomial Regression with configurable degree and interaction terms, flexible per-variable lag configurations, and new data filtering options by date range and removed intervals. Comprehensive business validations are now enforced for all parameters, and MLflow logging has been extended to capture these detailed configurations. Additionally, Reduced Coulomb Energy (RCE) metrics are added for drift detection, with a new changelog documenting all pipeline parameter updates.

This commit is contained in:
Bruno Domingues
2025-12-17 21:39:43 -03:00
parent 4d6674758c
commit 6e8f87b2a3
10 changed files with 796 additions and 81 deletions

View File

@@ -33,8 +33,8 @@ def sample_params():
experiment_name='test_experiment',
target_variable='target',
variable_columns=['var1', 'var2', 'var3'],
lag_train=0,
lag_val=0,
lag_train={'var1': 0, 'var2': 0, 'var3': 0},
lag_val={'var1': 0, 'var2': 0, 'var3': 0},
rem_static_win=False,
low_lim={},
upp_lim={},
@@ -48,6 +48,14 @@ def sample_params():
line_separator=',',
decimal_separator='.',
removed_intervals=[],
model_name='Linear Regression',
degree=1,
interaction_only=False,
nan_treatment='drop',
start_date=None,
end_date=None,
scaler_name='None',
support_filters={},
)
@@ -106,8 +114,8 @@ class TestExtractModelEquation:
experiment_name='test',
target_variable='y',
variable_columns=['x'],
lag_train=0,
lag_val=0,
lag_train={'x': 0},
lag_val={'x': 0},
rem_static_win=False,
low_lim={},
upp_lim={},
@@ -121,6 +129,14 @@ class TestExtractModelEquation:
line_separator=',',
decimal_separator='.',
removed_intervals=[],
model_name='Linear Regression',
degree=1,
interaction_only=False,
nan_treatment='drop',
start_date=None,
end_date=None,
scaler_name='None',
support_filters={},
)
# Mock model with single coefficient
@@ -177,6 +193,7 @@ class TestInitDataPreprocessor:
def test_init_preprocessor_with_scaler(self, training_repo, sample_params):
"""Test preprocessor initialization with scaler enabled."""
sample_params.use_scaler = True
sample_params.scaler_name = 'Standard Scaler'
preprocessor = training_repo._init_data_preprocessor(sample_params)
assert preprocessor.scaler_name == 'Standard Scaler'
@@ -184,6 +201,7 @@ class TestInitDataPreprocessor:
def test_init_preprocessor_without_scaler(self, training_repo, sample_params):
"""Test preprocessor initialization without scaler."""
sample_params.use_scaler = False
sample_params.scaler_name = 'None'
preprocessor = training_repo._init_data_preprocessor(sample_params)
assert preprocessor.scaler_name == 'None'
@@ -211,14 +229,13 @@ class TestInitDataPreprocessor:
def test_init_preprocessor_lag_configuration(self, training_repo, sample_params):
"""Test preprocessor lag configuration."""
sample_params.lag_train = 5
sample_params.lag_val = 3
sample_params.lag_train = {'var1': 5, 'var2': 5, 'var3': 5}
sample_params.lag_val = {'var1': 3, 'var2': 3, 'var3': 3}
preprocessor = training_repo._init_data_preprocessor(sample_params)
# Check that lag dictionaries are created correctly
for col in sample_params.variable_columns:
assert preprocessor.lag_train[col] == 5
assert preprocessor.lag_transform[col] == 3
# Check that lag dictionaries are passed correctly
assert preprocessor.lag_train == {'var1': 5, 'var2': 5, 'var3': 5}
assert preprocessor.lag_transform == {'var1': 3, 'var2': 3, 'var3': 3}
class TestInitScalerDict: