Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix/comp lags feat order #2272

Merged
merged 27 commits into from
Apr 12, 2024
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
ddfb341
fix: reorder lagged features per lags when they are provided componen…
madtoinou Mar 6, 2024
3be57e9
fix: parametrize lagged_features_names test
madtoinou Mar 6, 2024
7a9c8cf
feat: added tests for lagged_features_names when lags are component-s…
madtoinou Mar 6, 2024
ec2f577
fix: create_lagged_name is not affected by lags order different than …
madtoinou Mar 6, 2024
838de67
fix: improve comment
madtoinou Mar 6, 2024
5a7f829
feat: tests verify that list and dict lags yield the same result
madtoinou Mar 6, 2024
80ef121
fix: remove staticmethod for the tests to pass on python 3.9
madtoinou Mar 11, 2024
a2b867d
feat: properly reorder features during autoregression, added correspo…
madtoinou Mar 12, 2024
38096b8
Merge branch 'master' into fix/comp_lags_feat_order
madtoinou Mar 12, 2024
80e4ed6
Merge branch 'master' into fix/comp_lags_feat_order
madtoinou Apr 4, 2024
d15c970
update changelog
madtoinou Apr 4, 2024
00ec6a1
fix: adressing review comments
madtoinou Apr 4, 2024
a27cd0d
Merge branch 'master' into fix/comp_lags_feat_order
madtoinou Apr 4, 2024
617b6ed
fix: moved autoregression lags extraction to tabularization
madtoinou Apr 4, 2024
dd2bee1
Merge branch 'fix/comp_lags_feat_order' of https://github.com/unit8co…
madtoinou Apr 4, 2024
2717183
fix: refactor tests to reduce code duplication
madtoinou Apr 5, 2024
73f4f64
fix: adress review comment
madtoinou Apr 5, 2024
e461b4b
Merge branch 'master' into fix/comp_lags_feat_order
dennisbader Apr 8, 2024
8465b5e
Merge branch 'master' into fix/comp_lags_feat_order
dennisbader Apr 8, 2024
ca50e1f
Merge branch 'master' into fix/comp_lags_feat_order
dennisbader Apr 9, 2024
c9e61d0
fix: remove usage of strict argument in zip, not support in python 3.9
madtoinou Apr 10, 2024
c6a6c74
further refactor lagged data extraction for autoregression
dennisbader Apr 10, 2024
9467190
allow coverage diffs for codecov upload
dennisbader Apr 11, 2024
677a606
use codecov v3
dennisbader Apr 11, 2024
bedf5a8
precompute lagged and ordered feature indices
dennisbader Apr 11, 2024
071372f
Merge branch 'master' into fix/comp_lags_feat_order
dennisbader Apr 11, 2024
be8c706
Merge branch 'master' into fix/comp_lags_feat_order
dennisbader Apr 11, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 54 additions & 30 deletions darts/models/forecasting/regression_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -1032,24 +1032,16 @@ def predict(
)
# component-wise lags
if "target" in self.component_lags:
madtoinou marked this conversation as resolved.
Show resolved Hide resolved
tmp_X = [
series_matrix[
:,
[lag - (shift + last_step_shift) for lag in comp_lags],
comp_i,
]
for comp_i, (comp, comp_lags) in enumerate(
self.component_lags["target"].items()
)
]
# values are grouped by component
np_X.append(
np.concatenate(tmp_X, axis=1).reshape(
len(series) * num_samples, -1
)
tmp_X = self._extract_component_lags_autoregression(
cov_type="target",
values_matrix=series_matrix,
shift=shift,
last_step_shift=last_step_shift,
t_pred=t_pred,
)
np_X.append(tmp_X.reshape(len(series) * num_samples, -1))
# shared lags
else:
# values are grouped by lags
np_X.append(
series_matrix[
:,
Expand All @@ -1064,21 +1056,15 @@ def predict(
if cov_type in covariate_matrices:
# component-wise lags
if cov_type in self.component_lags:
tmp_X = [
covariate_matrices[cov_type][
:,
np.array(comp_lags) - self.lags[cov_type][0] + t_pred,
comp_i,
]
for comp_i, (comp, comp_lags) in enumerate(
self.component_lags[cov_type].items()
)
]
np_X.append(
np.concatenate(tmp_X, axis=1).reshape(
len(series) * num_samples, -1
)
tmp_X = self._extract_component_lags_autoregression(
cov_type=cov_type,
values_matrix=covariate_matrices[cov_type],
shift=shift,
last_step_shift=last_step_shift,
t_pred=t_pred,
)
np_X.append(tmp_X.reshape(len(series) * num_samples, -1))
# shared lags
else:
np_X.append(
covariate_matrices[cov_type][
Expand Down Expand Up @@ -1149,6 +1135,44 @@ def _predict_and_sample(
k = x.shape[0]
return prediction.reshape(k, self.pred_dim, -1)

def _extract_component_lags_autoregression(
self,
cov_type: str,
madtoinou marked this conversation as resolved.
Show resolved Hide resolved
values_matrix: np.ndarray,
shift: int,
last_step_shift: int,
t_pred: int,
) -> np.ndarray:
"""Extract, concatenate and reorder component-wise lags to obtain a features order
identical to tabularization.
madtoinou marked this conversation as resolved.
Show resolved Hide resolved
"""
# prepare index to reorder features by lags across components
comp_lags_reordered = np.concatenate(
[
np.array(comp_lags, dtype=int)
for comp_lags in self.component_lags[cov_type].values()
madtoinou marked this conversation as resolved.
Show resolved Hide resolved
]
).argsort()

# convert relative lags to absolute
if cov_type == "target":
lags_shift = -shift - last_step_shift
else:
lags_shift = -self.lags[cov_type][0] + t_pred

# extract features
tmp_X = [
values_matrix[
:,
np.array(comp_lags) + lags_shift,
madtoinou marked this conversation as resolved.
Show resolved Hide resolved
comp_i,
]
for comp_i, comp_lags in enumerate(self.component_lags[cov_type].values())
]

# concatenate on features dimension and reorder
return np.concatenate(tmp_X, axis=1)[:, comp_lags_reordered]

@property
def lagged_feature_names(self) -> Optional[List[str]]:
"""The lagged feature names the model has been trained on.
Expand Down
7 changes: 6 additions & 1 deletion darts/tests/models/forecasting/test_regression_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -1990,7 +1990,7 @@ def test_component_specific_lags(self, config):
)

# n > output_chunk_length
model.predict(
pred = model.predict(
7,
series=series[0] if multiple_series else None,
past_covariates=(
Expand All @@ -2004,6 +2004,11 @@ def test_component_specific_lags(self, config):
else None
),
)
# check that lagged features are properly extracted during auto-regression
if multivar_target:
np.testing.assert_array_almost_equal(
tg.sine_timeseries(length=27)[-7:].values(), pred["sine"].values()
)

@pytest.mark.parametrize(
"config",
Expand Down
Loading
Loading